0

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

4

4 回答 4

3

您是否为 Rails 使用了主键别名?

set_primary_key :my_fk_id
于 2009-12-08T15:59:18.557 回答
1

Rails 期望您的模型有一个整数 id 列作为主键。您可以将其设置为 @MattMcKnight 建议的外键,但我建议您创建 id 列,即使您并不严格需要它。以我的经验,它会为你省去很多这样的头痛,基本上没有缺点。

于 2009-12-08T16:19:04.897 回答
0

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

于 2009-12-08T16:05:59.827 回答
0

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

马特的回答包括重命名模型定义中的主键。以下是如何在迁移中执行此操作。

请注意,提供主键选项而不将 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
于 2009-12-08T16:19:10.553 回答