3

考虑以下人为设计的示例:

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 都表现出这种行为。这有技术原因吗?在保存和重新加载发生之前的一致关联将大大加快某些测试用例的速度,并且总体上会使事情变得更清洁。

4

2 回答 2

0

请参阅https://github.com/rails/rails/pull/9522。自动反向关联可能会成为 Rails 未来版本的一个特性。

于 2013-03-28T23:24:29.607 回答
0

您误解了这两个操作的作用,尽管它是一种微妙的效果,在文档中可能没有非常清楚地传达。

<<操作员不仅为您的项目分配,company_id而且如果记录存在,它也会保存它。它还将它添加到projects公司模型的缓存中。

company=方法只分配对象,不进行对象之间的通信。无法按您的意愿加载未保存的记录。这些记录实际上都不在数据库中,因此c.projects除非您像在第一种情况下那样明确地向其中添加某些内容,否则它将是一个空数组。

通常,未保存的对象的行为不如它们的数据库持久对象。

于 2012-10-04T17:30:06.643 回答