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

When should I use delegate, and when should I use has_one :through?

Rails 有两个很好的方法可以避免模型中违反得墨忒耳法则。

第一个是这个:

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 关系并且针对某些情况进行了优化 - 例如它将自动使用 joins 来获取记录,也可以是 eager-loaded 以避免处理多个 Restaurant 时的 N+1 问题:

Restaurant.all.includes(:owner).each{|r| some code accessing r.owner }

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