2017-11-24 14 views
-6

に中括弧を削除します。レール:私は次のコードを持っているアレイ

@temp = SalesOrder.where("status > ?", 0).ids 
items = SalesOrderItem.where(sales_order_id: @temp).where.not(product_id: nil) 

total = items.to_a.group_by(&:product_id).map do |product_id, quantity| 
    {:product_name => Product.find(product_id.to_i).name, 
    :quantity => quantity.sum { |q| q.quantity.to_f } } 
end 

@top_five = total.sort_by { |h| h[:quantity] }.reverse! 

@top_fiveすると、この配列を生成します。

[{:product_name => "Six", :quantity => 1300.0}, 
{:product_name => "Plastic Tumbler 620ml", :quantity => 1205.0}, 
{:product_name => "Product Four", :quantit y=> 1110.0}, 
{:product_name => "Product Five", :quantity => 510.0}, 
{:product_name => "Fiber Optic Cable", :quantity => 200.0}] 

私はそれがこの形式で

{"Football" => 10, "Basketball" => 5} 

する必要がありますまたはこれは

[["Football", 10], ["Basketball", 5]] 
+1

実際の出力と予想される出力の間に類似点はありません。 – Stefan

+0

私は修正が必要な中かっこの四角形の形式です。内部の実際の値ではありません。以下の@AntonTkachovによって解決された問題 – Bassman

+0

これはちょっとした仕事になる正しいアソシエーションを設定するのではなく、ひどく懐疑的な回避策のようなものです。 – max

答えて

2
@temp = SalesOrder.where("status > ?", 0).ids 
items = SalesOrderItem.where(sales_order_id: @temp).where.not(product_id: nil) 
total = items.to_a.group_by(&:product_id).each_with_object({}) do |(product_id, quantity), total| 
    total[Product.find(product_id.to_i).name] = quantity.map(&:quantity).map(&:to_f).sum 
end 
@top_five = total.sort_by { |k, v| v }.reverse! 

これを確認してください。それは動作するはずです。何かエラーがありましたら、私にpingしてください。私はそれを更新します

PS:あなたのコードはまったく最適化されていません。これらはすべて単一のSQLクエリで行うことができますが、ロジックはデバッグなしでこのクエリを書くのはかなり難しいです

+1

それはそれを解決しました。ヒントをお寄せいただきありがとうございます。これをSQLで再作成する方法を調査します。 – Bassman

+2

あなたは 'map'を悪用しようとしています。正しいバージョンは 'total = blah.each_with_object({})do |(id、q)、total | ...終わり。 – mudasobwa

+0

@mudasobwaはい、あなたは '.map'について正しいです。それを「each」に書き換えました。前に 'each_with_object'に直面していない。それはdefintetly非常に便利です。どのような方法を使用しての賛成ですか?それは、私のコードはまだ非常に同じ内側のブロックである、そうではありませんか? – AntonTkachov

関連する問題