我什么时候应该使用委托,什么时候应该使用has_one:through?

时间:2016-01-14 09:56:25

标签: ruby-on-rails database law-of-demeter

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似乎在一个查询中执行。

1 个答案:

答案 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>