考虑以下设想的例子:
class Company < ActiveRecord::Base
has_many :projects
end
class Project < ActiveRecord::Base
belongs_to :company
end
c, p = Company.new, Project.new
c.projects << p
p.company => c
当项目添加到集合中时,Rails会自动设置与公司的反向关联。不幸的是,这是Rails唯一能够做到这一点的智能。来自另一方的分配不会将对象添加到反向集合中。
c, p = Company.new, Project.new
p.company = c
c.projects => []
许多关系也不做任何自动逆向引用。 ActiveRecord和DataMapper都表现出这种行为。这有技术原因吗?保存和重新加载之前的一致关联会大大加快某些测试用例的速度,并且会使事情变得更加清晰。
答案 0 :(得分:0)
你误解了这两个操作的作用,尽管这是一个微妙的影响,可能无法在文档中清楚地传达。
<<
运算符不仅为您的项目分配company_id
,还会在记录存在时保存它。它还将此添加到公司模型的projects
缓存中。
company=
方法仅在对象之间分配和不进行通信。无法按预期加载未保存的记录。这些记录实际上都不在数据库中,所以c.projects
将是一个空数组,除非你明确地添加了一些内容,就像你在第一种情况下那样。
通常,未保存的对象的行为与数据库持久对象的行为不同。
答案 1 :(得分:0)
见https://github.com/rails/rails/pull/9522。自动反向关联可能会成为未来版本的Rails中的一项功能。