Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails模型生成大量sql查询_Sql_Ruby On Rails_Ruby On Rails 3_Optimization - Fatal编程技术网

Rails模型生成大量sql查询

Rails模型生成大量sql查询,sql,ruby-on-rails,ruby-on-rails-3,optimization,Sql,Ruby On Rails,Ruby On Rails 3,Optimization,我有一个模型(行项目),它是另一个(发票)的子项。在LineItem中,我委托了一个引用Invoice中属性的方法。每当运行此方法时,它都会运行几个SQL查询……就像它再次搜索发票一样 型号“发票” -包含属性“在” -包含默认范围包括(:行项目,:付款,:销售人员) 型号“LineItem” -包含委托:在,:to=>:invoice,:prefix=>true处创建 -另一种方法包括: @tax_rate ||= (category.to_sym == :books ? invoice_cr

我有一个模型(行项目),它是另一个(发票)的子项。在LineItem中,我委托了一个引用Invoice中属性的方法。每当运行此方法时,它都会运行几个SQL查询……就像它再次搜索发票一样

型号“发票”
-包含属性“在”
-包含默认范围包括(:行项目,:付款,:销售人员)

型号“LineItem”
-包含
委托:在,:to=>:invoice,:prefix=>true处创建
-另一种方法包括:

@tax_rate ||= (category.to_sym == :books ? invoice_created_at.federal_tax_rate : invoice_created_at.tax_rate)
正是在该方法中生成了以下内容(使用“mini profiler”gem):

它对每一行项目都这样做。所有这些SELECT语句早在创建发票时就已经批量出现了。*tax_rate方法被调用

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查询?

首先,您可以停止使用
default\u范围包括
——典型情况下不需要它,您的情况下也可能不需要它

其次,也是更重要的一点,您应该在关联上声明
属性的
:inverse\u,以最小化已在内存中的对象的重新加载:

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

class LineItem < ActiveRecord::Base
  belongs_to :invoice, :inverse_of => :line_items
end
class发票:发票
结束
类LineItem:行项目相反
结束

太棒了!那是为了我。我确实觉得奇怪,默认情况下不是这样。
class Invoice < ActiveRecord::Base
  has_many :line_items, :inverse_of => :invoice
end

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