2011-07-13 11 views
2

のためのモデルの3 ActiveRecordの和Iが2つのモデルRailsの関連する各モデル

Category 
- id 
- name 

Transaction 
- id 
- category_id 
- amount 

を持っているが、私は、各カテゴリのすべての取引の合計を見つけたいです。 私はcaterogiesのリストを取得し、category_idを持つすべてのトランザクションの合計を取得できますが、20以上のクエリを実行することができます。

1つのクエリですべてを実行する方法はありますか?

編集:[[category1、sum]、[category2、sum]]のリストにしたいと思います。

答えて

8
Transaction.group(:category_id).sum(:amount) 

を。これは、これと同様のハッシュを返します。

{CATEGORY_ID => SUM_OF_TRANSACTIONS, ....} 

{1 => 100.0, 2 => 350.0, etc.} 
は、実際の Category名を取得するには:これは1つのカテゴリに私の取引の合計を与える

Transaction.includes(:category).group("categories.name").sum(:amount) 
# => {"Category1" => 100.0, ...} 
+0

カテゴリ名を取得する簡単な方法はありますか、それとも個別にクエリを実行する必要がありますか? – marto

+0

私はこの場所ですぐに停止しました:)名前でそれを得る方法 – fl00r

+0

簡単に、編集された答えを参照してください。 –

0
@category.transactions.sum(:amount) 

UPD 1

あなたは、Rubyで、いくつかの仕事を共有することができます。

Category.includes(:transactions).map{|c| [c.name, c.transactions.inject(0){|sum, t| sum += t.amount}]} 
+0

。それらすべてのために同じことをする方法はありますか? – marto

+0

ああ、私は申し訳ありません。今私の答えを編集します:) – fl00r

+1

Rubyを使用するアイデアは、小さなデータセットでは目立った速度低下がなくても間違いなく機能しますが、大きなデータセットでは痛みを伴います単一のトランザクションごとに反復処理を行う必要があります。 –

関連する問題