Rails 有两种很好的方法来避免模型中违反 Demeter 法则。
第一个是这样的:
class Restaurant < ActiveRecord::Base
belongs_to :franchise
delegate :owner, to: :franchise
end
第二个是这样的:
class Restaurant < ActiveRecord::Base
belongs_to :franchise
has_one :owner, through: :franchise
end
有什么区别?在某些或所有情况下,有什么可以推荐一个选项而不是另一个选项吗?
我能检测到的唯一区别是 delegate
选项似乎生成两个 SQL 查询以获取后一条记录,而 belongs_to :through
似乎是在一次查询。
最佳答案
has_one through:
是 rails 关系并且针对某些情况进行了优化 - 例如它将自动使用 join
来获取记录,也可以预先加载以避免处理多个 Restaurant
时的 N+1
问题:
Restaurant.all.includes(:owner).each{|r| some code accessing r.owner }
如果 owner
是一个委托(delegate)代码(删除了 .includes
),每个 Restaurant
将产生两个查询,但是急切加载它们将被全部提取
关于ruby-on-rails - 什么时候用delegate,什么时候用has_one :through?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34786450/