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

hen*_*tha 7 database ruby-on-rails law-of-demeter

Rails有两种很好的方法可以避免模型中的Demeter违规.

首先是:

class Restaurant < ActiveRecord::Base
    belongs_to :franchise
    delegate :owner, to: :franchise
end
Run Code Online (Sandbox Code Playgroud)

第二个是:

class Restaurant < ActiveRecord::Base
    belongs_to :franchise
    has_one :owner, through: :franchise
end
Run Code Online (Sandbox Code Playgroud)

有什么不同?在某些或所有情况下,有什么可以推荐一个选项吗?

我可以检测到的唯一区别是该delegate选项似乎生成两个SQL查询以获取后一个记录,而belongs_to :through似乎在一个查询中执行.

Vas*_*fed 10

has_one through:是rails关系,并针对某些情况进行了优化 - 例如,它将join自动使用s来获取记录,也可以急切加载以避免N+1处理多个Restaurants 时的问题:

Restaurant.all.includes(:owner).each{|r| some code accessing r.owner }
Run Code Online (Sandbox Code Playgroud)

如果owner像上面这样的委托代码(带有.includes删除)会导致每个查询两个查询Restaurant,但是如果有了加载,那么它们将全部被提取到一个