-1

我不明白在哪种情况下我应该使用 :include 选项而不是 :through 选项?

例如,我可以这样编写模型:

Class Customer < ActiveRecord::Base
  has_many :orders, :include => :line_items
end

class Order < Active Record::Base
  belongs_to :customer
  has_many :line_items
end

class LineItem < ActiveRecord::Base
  belongs_to :order
end

或者我可以这样写:

Class Customer < ActiveRecord::Base
  has_many :orders
  has_many  :lineitems, :through => :orders
end

class Order < Active Record::Base
  belongs_to :customer
  has_many :line_items
end

class LineItem < ActiveRecord::Base
  belongs_to :order
end

感谢澄清什么练习匹配哪个选项。

4

1 回答 1

0

好的,在彻底阅读了协会的 api 文档后,我设法理解了区别。特别是以下部分:关联加入模型关联的渴望加载

事实上,它们与两个完全不同的概念有关:

:through选项允许您在代码中构建快捷方式。在我上面的(问题)示例中,我可以使用以下指令读取 LineItem 集合:

@customer.lineitems

代替

@customer.orders.lineitems

需要注意的是,这样的属性是只读的!.

========

:include选项允许您在访问不同的属性/方法时减少在数据库中生成的查询数量。

使用 :include 在我的关联中,以下代码会在我的数据库中生成一个查询:

@customer.orders.lineitems

没有 :include ,它会在我的数据库中生成两个查询


评论

正如这里所解释的,当模型不使用这样的选项时,也可以直接在查询中使用 :include 选项

在我上面的模型定义中,假设每个订单有 10 个订单项,每个客户有 10 个订单和 10 个客户,以下代码将生成101 个查询 ,而不使用关联模型中的 :include** 选项:1 代表 .all,每个客户 1 个订单,以及每个订单 1 个订单 项(= 1 + (10 个客户订单 x 10 个订单订单项)

Customer.all.each do |customer|

  customer.orders.each do |order|
    puts "order number : " + order.number

    order.lineitems.each do |lineitem|
      puts "Item code : " + lineitem.code
    end
  end
end

此代码将生成12 个 包含直接使用的查询:1 个用于 .first 和 1 个用于收集 order_id 和引用的订单,以及 1 个 .lineitems 用于 10 个订单中的每一个

Customer.includes(:orders).each do |customer|

  customer.orders.each do |order|
    puts "order number : " + order.number

    order.lineitems.each do |lineitem|
      puts "Item code : " + lineitem.code
    end
  end
end

订单集合将与客户集合同时检索(使用 LEFT OUTER JOIN sql 查询)。

于 2012-12-14T17:27:00.660 回答