2011-07-09 45 views
8

我有我的模式設置,如下所示:Rails的

class User < ActiveRecord::Base 
    has_many :posts, :foreign_key => 'author_id' 
end 

class Post < ActiveRecord::Base 
    belongs_to :author, :class_name => 'User' 
end 

假設:

p = Post.first # just any post instance 
a = User.first # any user instance 

現在這一段代碼形跡十分怪異

p.author = a 

設置完作者後,帖子的屬性author_id應該設置爲用戶的ID。但是這沒有發生。

我嘗試使用belongs_to的模型,它沒有class_name參數,並且所有內容都按預期工作。

現在,還有一件事使得它更加怪異,當我將關聯改爲belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'時,它出乎意料地工作。

這是Rails 3.0.9中的一個bug嗎?不應該不需要外鍵參數,因爲正如文檔所說,其默認值是附加_id的關聯的名稱。

另請注意,即使沒有:foreign_key => 'author_id',關於該關聯的其他一切也按預期工作。 (就像獲取關聯模型一樣)唯一不起作用的是setter方法不設置外鍵。

我知道我可以只是做p.author_id = a.id或只加:foreign_key PARAMS我所有的協會與class_name,但我更喜歡的p.author = a

回答

6

更優雅的語法通過大量的Rails代碼閱讀和這裏的跟蹤後,是我的發現:

這個錯誤的存在是因爲gem composite_primary_keys超過了默認導軌reflection.rb

我將不得不檢查他們如何實施primary_key_namederive_primary_key_name方法。

在這個愚蠢的錯誤上浪費了相當多的時間,但至少我學到了很多關於ActiveRecord內部的知識。