gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:13:07 24 4
gpt4 key购买 nike

考虑以下人为的示例:

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

最佳答案

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

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

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

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

关于ruby-on-rails - 为什么 ORM 不自动在内存中设置反向关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12732461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com