2009-12-08 101 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