每个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个查询