为什么ORM不自动在内存中设置反向关联?

时间:2012-10-04 17:23:06

标签: ruby-on-rails ruby activerecord orm datamapper

考虑以下设想的例子:

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

2 个答案:

答案 0 :(得分:0)

你误解了这两个操作的作用,尽管这是一个微妙的影响,可能无法在文档中清楚地传达。

<<运算符不仅为您的项目分配company_id,还会在记录存在时保存它。它还将此添加到公司模型的projects缓存中。

company=方法仅在对象之间分配和不进行通信。无法按预期加载未保存的记录。这些记录实际上都不在数据库中,所以c.projects将是一个空数组,除非你明确地添加了一些内容,就像你在第一种情况下那样。

通常,未保存的对象的行为与数据库持久对象的行为不同。

答案 1 :(得分:0)

https://github.com/rails/rails/pull/9522。自动反向关联可能会成为未来版本的Rails中的一项功能。