ruby-on-rails - 什么时候用delegate,什么时候用has_one :through?

标签 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 似乎是在一次查询。

最佳答案

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

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

如果 owner 是一个委托(delegate)代码(删除了 .includes),每个 Restaurant 将产生两个查询,但是急切加载它们将被全部提取

关于ruby-on-rails - 什么时候用delegate,什么时候用has_one :through?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34786450/

相关文章:

ruby-on-rails - Haml for rails,单独使用 'haml' gem 或与 'haml-rails' 一起使用

arrays - 在 R 中将多列转换为 Json 数组?

数据库设计: Why do some ecommerce database have separate tables for products and product_variants?

sql - 什么是数据库中的半连接?

java - 使用 ArrayLists 保持 Demeter 法则

ruby-on-rails - Rails 生产环境因循环而中断

javascript - 使用 Rails 创建 powerpoint 演示文稿

ruby-on-rails - Rspec 不改变创建计数

java - Demeter Law - 在不同类的另一个方法中调用一个类的方法