2009-12-08 157 views
0

我在我的Rails应用程序中创建了一个新模型。由于它与另一个表是一对一的关系,因此不需要新模型具有id列。一切工作正常,但由于某种原因,我对这个模型的所有Shoulda测试都失败了。例如:Shoulda测试在没有ID的模型上出现故障

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列?如果是这样,有没有办法解决这个问题?

回答

3

您是否为别名Rails的主键?

set_primary_key :my_fk_id 
+0

哪里这属于?在模型中加上验证和关联? – jerhinesmith 2009-12-09 20:27:07

0

您是否运行过rake db:migrate和rake db:test:在创建新模型后做好准备?

1

Rails期望您的模型具有一个整数id列作为主键。你可以像@MattMcKnight建议的那样将它设置为外键,但是我建议你创建id列,即使你不需要它。根据我的经验,这样可以为你节省大量的头痛,基本上没有任何缺点。

0

所有表格都需要一个id列,这就是ActiveRecord的工作方式。正如MattMcKnight指出的那样,您可以指定另一列作为主键。您还可以通过将:id => false作为create_table的选项来指定表中没有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