Ruby on rails 应该在没有id的模型上测试失败吗

Ruby on rails 应该在没有id的模型上测试失败吗,ruby-on-rails,unit-testing,shoulda,Ruby On Rails,Unit Testing,Shoulda,我在rails应用程序中创建了一个新模型。因为它与另一个表是一对一的关系,所以新模型不需要id列。一切正常,但由于某种原因,我在这个模型上的所有Shoulda测试都失败了。例如: should_validate_presence_of :first_name 正在抛出此错误: ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'my_new_table.id' in 'field list': SELECT `my_new

我在rails应用程序中创建了一个新模型。因为它与另一个表是一对一的关系,所以新模型不需要id列。一切正常,但由于某种原因,我在这个模型上的所有Shoulda测试都失败了。例如:

should_validate_presence_of :first_name
正在抛出此错误:

ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'my_new_table.id'
in 'field list': SELECT `my_new_table`.id FROM `my_new_table` WHERE 
(`my_new_table`.`some_other_column` IS NULL)  LIMIT 1

是否需要ID列?如果是这样的话,有办法解决这个问题吗?

您是否为Rails的目的对主键进行了别名

set_primary_key :my_fk_id

您是否出于Rails的目的对主键进行了别名

set_primary_key :my_fk_id

创建新模型后是否运行了rake db:migrate和rake db:test:prepare?

创建新模型后是否运行了rake db:migrate和rake db:test:prepare?

Rails希望您的模型有一个整数id列作为主键。您可以像@MattMcKnight建议的那样将其设置为外键,但我建议您创建id列,即使您并不严格需要它。根据我的经验,它将为您节省大量类似这样的麻烦,基本上没有缺点。

Rails希望您的模型有一个整数id列作为主键。您可以像@MattMcKnight建议的那样将其设置为外键,但我建议您创建id列,即使您并不严格需要它。根据我的经验,它将为您节省大量类似这样的麻烦,基本上没有缺点。

所有表都需要一个id列,这正是ActiveRecord的工作方式。正如MattMcKnight指出的,您可以指定另一列作为主键。您还可以通过提供
:id=>false
作为创建表的选项来指定创建没有id列的表

Matt的回答包括重命名模型定义中的主键。下面介绍如何在迁移中执行此操作

注意,提供主键选项而不将id选项设为false意味着您不必将列的定义添加到块中。Rails将为您创建它。并在任何联接表中自动使用它

例如:

class CreateTableWithOUtID < ActiveRecord::Migration

  def self.up
    create_table :my_new_table, :primary_key => :another_table_id do |t|
     t.string :some_other_column 
    end
  end

  def self.down
    drop_table, :my_new_table
  end
end
class CreateTableWithOUtID:另一个_table_id do | t|
t、 字符串:某个或其他列
结束
结束
def自动关闭
放下桌子:我的新桌子
结束
结束

所有表都需要id列,这正是ActiveRecord的工作方式。正如MattMcKnight指出的,您可以指定另一列作为主键。您还可以通过提供
:id=>false
作为创建表的选项来指定创建没有id列的表

Matt的回答包括重命名模型定义中的主键。下面介绍如何在迁移中执行此操作

注意,提供主键选项而不将id选项设为false意味着您不必将列的定义添加到块中。Rails将为您创建它。并在任何联接表中自动使用它

例如:

class CreateTableWithOUtID < ActiveRecord::Migration

  def self.up
    create_table :my_new_table, :primary_key => :another_table_id do |t|
     t.string :some_other_column 
    end
  end

  def self.down
    drop_table, :my_new_table
  end
end
class CreateTableWithOUtID:另一个_table_id do | t|
t、 字符串:某个或其他列
结束
结束
def自动关闭
放下桌子:我的新桌子
结束
结束

这属于哪里?在模型中以及验证和关联?这属于哪里?在模型中以及验证和关联?