减少ActiveRecord调用中的查询数量

时间:2014-11-18 17:34:31

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有以下结构:

  • AtomType有很多Atoms
  • Atoms有许多TotalSales(具有不同的开始和结束日期)
  • TotalSales有很多PerformanceAnalysis

AtomType上的方法current_total_sales从相同的AtomType获取Atoms中总销售额的最大日期,并获得从同一日期开始的所有TotalSales。

def current_total_sales
  current_start_date = TotalSales.where(atom_id: atoms.pluck(:id)).maximum(:start_date)
  TotalSales.where(atom_id: atoms.pluck(:id), start_date: current_start_date)
end

它可以更有效吗?

AtomType上的方法red_priorities获取具有使用status_id > 2的PerformanceAnalysis的TotalSales的所有Atom,并按priority排序它们(PerformanceAnalysis属性)。

def red_priorities
  PerformanceAnalysis.where(total_sales: current_total_sales).
    where("status_id > 2").
    order("priority").map(&:atom)
end

它还能更有效吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我想把current_start_date对象解压缩到一个方法,然后改变red_priorities方法直接查看Atoms表加入我需要限制的地方。这样我就避免了查询结束时的map(:atom)(这不是SQL查询的一部分)。

def current_start_date
  current_start_date = TotalSales.where(atom_id: atoms.pluck(:id)).maximum(:start_date)
end

def current_total_sales
  TotalSales.where(atom_id: atoms.pluck(:id), start_date: current_start_date)
end

def red_priorities
  Atom.joins(:total_sales => :performance_analysis).
    where("total_sales.start_date = ?", current_start_date).
    where("performance_analyses.status_id > 2").order("performance_analyses.priority")
end