以下查询运行得相当快,但之后需要进行的系列处理确实减慢了此方法的速度。我可以在重构中使用一些帮助。
def self.sum_amount_chart_series(start_time)
orders_by_day = Widget.archived.not_void.
where(:print_datetime => start_time.beginning_of_day..Time.zone.now.end_of_day).
group(pg_print_date_group).
select("#{pg_print_date_group} as print_date, sum(amount) as total_amount")
# THIS IS WHAT IS SLOWING THE METHOD DOWN!
(start_time.to_date..Date.today).map do |date|
order = orders_by_day.detect { |order| order.print_date.to_date == date }
order && order.total_amount.to_f.round(2) || 0.0
end
end
def self.pg_print_date_group
"CAST((print_datetime + interval '#{tz_offset_hours} hours') AS date)"
end
我已经对这种方法进行了基准测试,有问题的代码是系列循环,它生成一系列日期,然后映射出一个新数组,每个日期都有一个数量。这样,无论是否有金额,我都会得到一个包含每个日期金额的系列。
当查询只返回几个日期时,它运行得相当快。但是将开始日期设置在一两年后,它变得非常缓慢。真正的罪犯是.detect方法。扫描活动记录对象数组非常慢。
有没有更快的方法来生成这个系列?