我的模型设置如下:
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中的错误吗?外键参数不应该是不必要的,因为正如文档所说,它的默认值是附加_id
的关联的名称。
另请注意,即使没有:foreign_key => 'author_id'
,关联关系的所有其他内容也会按预期工作。 (就像获取相关模型一样)唯一不起作用的是setter方法没有设置外键。
我知道我可以p.author_id = a.id
或只是将:foreign_key
参数添加到class_name
的所有关联中,但我更喜欢p.author = a
答案 0 :(得分:6)
阅读了很多Rails代码并在此处跟踪我发现的内容:
由于宝石composite_primary_keys
覆盖了默认导轨reflection.rb
,因此存在此错误。
我必须检查他们如何实施primary_key_name
和derive_primary_key_name
方法。
这个愚蠢的错误浪费了相当多的时间,但至少我学到了很多关于ActiveRecord内部的知识。