每个User都有许多Purchases。我想找出前28天的总和。

t1 = Time.now - (28.days)
t2 = Time.now
@dailysum = Array.new(29)
(0..29).each do |i|
  @dailysum[i] = @user.purchases.where(:created_at => (Time.now-(i.day))..(Time.now-((i-1).days))).sum(:amount)
end

这行得通,但我肯定有更好的办法有什么建议吗?

最佳答案

您需要传递一个:group选项来求和。:group选项的值因数据库而异我将提供一个pg和mysql版本。

# purchases.rb
def self.recent(num)
  where('created_at > ?', num.days.ago
end

# PG version
@user.purchases.recent.sum(:amount, group: "DATE_PART('year', purchases.created_at) || '-' || DATE_PART('month', purchases.created_at) || '-' || DATE_PART('day', purchases.created_at)")

# mysql version
@user.purchases.recent.sum(:amount, group: "DATE(purchases.created_at)")

这将产生一个散列,其中键是日期,值是购买的总和。
与过去28天每天的查询相比,这将减少27个查询

10-06 10:38