【问题标题】:Rails model generating lots of sql queriesRails 模型生成大量 sql 查询
【发布时间】:2013-02-06 11:36:14
【问题描述】:

我有一个模型 (LineItem),它是另一个模型 (Invoice) 的子代。在 LineItem 中,我委托了一个引用 Invoice 中的属性的方法。每当运行此方法时,它总是会运行多个 SQL 查询……就好像它在重新搜索 Invoice 一样

“发票”模型
- 包含属性“created_at”
- 包含default_scope includes(:line_items, :payments, :sales_person)

模型“LineItem”
- 包含delegate :created_at, :to => :invoice, :prefix => true
- 另一个方法包含:

@tax_rate ||= (category.to_sym == :books ? invoice_created_at.federal_tax_rate : invoice_created_at.tax_rate)

在此方法中生成以下内容(使用“迷你分析器”gem):

SELECT `invoices`.* FROM `invoices`  WHERE `invoices`.`id` = 4 LIMIT 1
SELECT `line_items`.* FROM `line_items`  WHERE `line_items`.`invoice_id` IN (4)
SELECT `items`.* FROM `items`  WHERE `items`.`id` IN (31, 15)
SELECT `categories`.* FROM `categories`  WHERE `categories`.`id` IN (6, 1) ORDER BY name
SELECT `payments`.* FROM `payments`  WHERE `payments`.`invoice_id` IN (4)
SELECT `payment_types`.* FROM `payment_types`  WHERE `payment_types`.`id` IN (1) ORDER BY name
SELECT `sales_people`.* FROM `sales_people`  WHERE `sales_people`.`id` IN (1) ORDER BY name

它对每个订单项执行此操作。在调用 invoice_created_at.*tax_rate 方法之前,所有这些 SELECT 语句已经批量发生...

SELECT `invoices`.* FROM `invoices`  WHERE (created_at between '2011-05-01 04:00:00' and '2013-02-06 04:59:59')
SELECT `line_items`.* FROM `line_items`  WHERE `line_items`.`invoice_id` IN (4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)

如何确保不必运行所有这些 SELECT 查询?

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 optimization


    【解决方案1】:

    首先,您可以停止使用default_scope includes - 典型情况不需要它,您的情况也可能不需要。

    其次,更重要的是,您应该在关联中声明 :inverse_of 属性,以尽量减少重新加载已在内存中的对象:

    class Invoice < ActiveRecord::Base
      has_many :line_items, :inverse_of => :invoice
    end
    
    class LineItem < ActiveRecord::Base
      belongs_to :invoice, :inverse_of => :line_items
    end
    

    【讨论】:

    • 太棒了!那是为我做的。我确实觉得很奇怪,默认情况下不是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多