ruby-on-rails-3 – Rails belongs_to不会使用自定义类名设置外键id

我的模型设置如下:
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.但这不会发生.

我尝试使用不具有class_name参数的belongs_to模型,一切都按预期工作.

现在,让我更奇怪的是,当我将关联更改为belongs_to:author时,:class_name => ‘用户’,:foreign_key => ‘author_id’,令人惊讶的是有效.

这是Rails 3.0.9中的错误吗?外键参数不应该是不必要的,因为正如文档所说,它的认值是附加了_id的关联的名称.

另请注意,即使没有:foreign_key => ‘author_id’,关于该关联的其他一切按预期工作. (就像获取相关模型一样)唯一不起作用的是setter方法没有设置外键.

我知道我可以做p.author_id = a.id或者只是添加:foreign_key params到我与class_name的所有关联,但我更喜欢p.author = a的更优雅的语法

解决方法

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

由于gem composite_primary_keys超出了认的rails reflection.rb,因此存在此错误.

我将不得不检查他们如何实现primary_key_name和derive_primary_key_name方法.

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...