11

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似乎是在一个查询中完成。

4

1 回答 1

14

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

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

如果owner是像上面这样的委托代码(.includes已删除)将导致每个查询两个查询Restaurant,但是通过急切加载,它们将全部获取

于 2016-01-14T10:40:06.177 回答