如何减少Rails中的查询数量

时间:2015-07-01 19:40:11

标签: ruby-on-rails ruby iterator

我有一张猫咪桌。每次展示has_many次展示,展示次数为impression_countimpression_day列 - 计数是指在某一天查看过猫的所有人的总和。

我想要做的是创建一个折线图,显示一只猫在很多日期的展示次数。我正在使用的JS图表库有两个数组:chartValueschartLabels

我的控制器动作来生成这些数组:

def show
  @cat = Cat.find(params[:id])

  @from = @cat.created_at  
  @to = Time.now

  dates = (@from.to_date..@to)
  @chartLabels = dates.to_a.map {|date| date.strftime("%b %e")}

  shown = @cat.impressions.ordered.between(@from,@to)
  @chartValues = create_stats_for dates, shown
end

如果在该日期没有记录任何展示次数,则使用私有create_stats_for方法将0铲入值数组:

private

def create_stats_for dates, values
    stat_values = []

    dates.each do |date|
      valid_impression = values.find_by impression_day: date
      if valid_impression
        stat_values << valid_impression.impression_count
      else
        stat_values << 0
      end
    end

    stat_values
end

问题

我的问题是这实在是效率低下,因为我可以迭代几年的所有展示次数,导致页面加载速度极慢。有些情况下,展示次数可以达到数百次。

我觉得有一种更有效的方法来实现相同的目标,但我还没有想出来 - 可能会将印象加载到内存中一次,并迭代这些?

非常感谢你能给予的任何帮助。

编辑:评论中要求的orderedbetween方法(在Impression模型上):

  def self.ordered
    order('impression_day asc')
  end

  def self.between(from,to)
    where("impression_day between ? and ?", from.to_date, to.to_date)
  end

0 个答案:

没有答案