has_many
次展示,展示次数为impression_count
和impression_day
列 - 计数是指在某一天查看过猫的所有人的总和。
我想要做的是创建一个折线图,显示一只猫在很多日期的展示次数。我正在使用的JS图表库有两个数组:chartValues
和chartLabels
。
我的控制器动作来生成这些数组:
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
问题
我的问题是这实在是效率低下,因为我可以迭代几年的所有展示次数,导致页面加载速度极慢。有些情况下,展示次数可以达到数百次。
我觉得有一种更有效的方法来实现相同的目标,但我还没有想出来 - 可能会将印象加载到内存中一次,并迭代这些?
非常感谢你能给予的任何帮助。
编辑:评论中要求的ordered
和between
方法(在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