Rails belongs_to不会使用自定义类名设置外键ID

时间:2011-07-09 15:11:51

标签: ruby-on-rails-3 belongs-to

我的模型设置如下:

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

1 个答案:

答案 0 :(得分:6)

阅读了很多Rails代码并在此处跟踪我发现的内容:

由于宝石composite_primary_keys覆盖了默认导轨reflection.rb,因此存在此错误。

我必须检查他们如何实施primary_key_namederive_primary_key_name方法。

这个愚蠢的错误浪费了相当多的时间,但至少我学到了很多关于ActiveRecord内部的知识。