Ruby on rails 应该在没有id的模型上测试失败吗
我在rails应用程序中创建了一个新模型。因为它与另一个表是一对一的关系,所以新模型不需要id列。一切正常,但由于某种原因,我在这个模型上的所有Shoulda测试都失败了。例如: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
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自动关闭
放下桌子:我的新桌子
结束
结束
这属于哪里?在模型中以及验证和关联?这属于哪里?在模型中以及验证和关联?