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
似乎在一个查询中执行。
答案 0 :(得分:7)
has_one through:
是rails关系,并针对某些情况进行了优化 - 例如,它会自动使用join
来获取记录,也可以急切加载以避免N+1
问题处理多个Restaurant
s:
Restaurant.all.includes(:owner).each{|r| some code accessing r.owner }
如果owner
是如上所述的委托代码(删除了.includes
),则每个Restaurant
会产生两个查询,但是如果需要加载,则会将其全部提取到一个< / p>