是否有一个原因(除了已经提到的日期以外)为什么您不使用ActiveRecord中的内置组功能?您似乎担心“后处理”,我认为这并不是真正要担心的事情。
您正在使用Rails,因此您可能应该首先寻找Rails解决方案[1]。我的第一个想法是做类似的事情
Product.average(:sales_price, :group => "DATE(created_at)", :conditions => ["merchant_id=?", 1])
哪个ActiveRecord变成了您描述的SQL。假设
has_many在商家和产品之间存在已声明的关联,那么使用它可能会更好,因此类似:
ave_prices = Merchant.find(1).products.average(:sales_price, :group => "DATE(created_at)")
(我希望您对模型的描述为“ products_sold”是一种转录错误,顺便说一句-如果不是,则您对类的命名有些不满!)
毕竟,您回到了起点,但是您以更传统的Rails方式到达了那里(Rails确实重视约定!)。现在我们需要填补空白。
我假设您知道您的日期范围,假设它被定义为从
from_date到的所有日期
to_date。
date_aves = (from_date..to_date).map{|dt| [dt, 0]}这样就将日期的完整列表构建为一个数组。我们不需要平均日期:
ave_price_dates = ave_prices.collect{|ave_price| ave_price[0]} # build an array of datesdate_aves.delete_if { |dt| ave_price.dates.index(dt[0]) } # remove zero entries for dates retrieved from DBdate_aves.concat(ave_prices) # add the query resultsdate_aves.sort_by{|ave| ave[0] } # sort by date那很多东西对我来说显得有些混乱:我认为它可能更简洁更干净。我会研究构建一个Hash或Struct,而不是停留在数组中。
[1]我并不是说不使用SQL,而是在ActiveRecord无法生成最有效的查询而您又回过头来的情况下发生
find_by_sql。很好,应该是这样,但是我认为您应该尝试仅将其用作最后的手段。



