ActiveRecordに組み込まれているグループ機能機能を使用しない理由(すでに述べた日付以外)はありますか?あなたは「後処理」について心配しているようですが、それは本当に心配することではないと思います。
あなたはRailsにいるので、おそらく最初にRailsソリューションを探す必要があります[1]。私の最初の考えは次のようなことをすることです
Product.average(:sales_price, :group => "DATE(created_at)", :conditions => ["merchant_id=?", 1])
どのActiveRecordがあなたが説明したSQLにほとんど変わったか。宣言されたhas_many
があると仮定します MerchantとProductの関連付けの場合は、おそらくそれを使用したほうがよいでしょう。たとえば、次のようになります。
ave_prices = Merchant.find(1).products.average(:sales_price, :group => "DATE(created_at)")
(「products_sold」としてのモデルの説明が、ある種の転記エラーであることを願っています。ところで、そうでない場合は、クラスの名前付けに多少のメッセージがありません!)
その後、あなたは最初の場所に戻りますが、より一般的なRailsの方法でそこに到達しました(そしてRailsは本当に慣習を大切にしています!)。次に、ギャップを埋める必要があります。
日付範囲を知っていると仮定します。たとえば、from_date
からのすべての日付として定義されているとします。 to 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 dates
date_aves.delete_if { |dt| ave_price.dates.index(dt[0]) } # remove zero entries for dates retrieved from DB
date_aves.concat(ave_prices) # add the query results
date_aves.sort_by{|ave| ave[0] } # sort by date
その多くは私には少し雑然としているように見えます:私はそれがより簡潔でよりきれいである可能性があると思います。配列にとどまるのではなく、ハッシュまたは構造体を構築することを検討します。
[1]SQLを使用しないと言っているわけではありません-ActiveRecordが最も効率的なクエリを生成できず、find_by_sql
にフォールバックする状況が発生します 。それで結構です、そうなるはずですが、最後の手段としてのみ使ってみるべきだと思います。