2012-07-21 14 views
5

のメソッドを定義します。summed_valuesは関係のsum(:value)を評価すべきところは例えば、私はActiveRecordの関係にカスタムメソッドを定義したいActiveRecordの関係

Transaction.all.summed_values 

簡単な例は次のようになります。

どこでメソッドsummed_valuesを定義する必要がありますか?それがActiveRecord::Relationにあるように見えます。それが直接そこになければならない場合は、どのファイルを置くべきですか?

また、この新しいメソッドがTransactionsの意味しか持たない場合は、のTransactionで構成されるこのメソッドのみを定義するような方法がありますか?

+0

あなたは 'Transaction.sumのように、関係の上に直接' sum'を使用することができ、 'のActiveRecord ::計算により提供されますhttp://api.rubyonrails.org/classes/ActiveRecord/Calculations.html –

答えて

7

トランザクションモデルで直接self.summed_valuesメソッドを作成します。

+0

これは動作します。スコープを使用することもできます。 –

+0

Tanzeeb:私の謝罪。あなたの質問を編集してください、私は私のdownvoteを削除します! – Peter

+1

クラスメソッドを 'Transaction'に追加すると、その関係に作用することは理解できませんでした。ありがとう! – Peter

1

このメソッドをActiveRecord :: Relationの拡張として作成する理由は何ですか?次のようなクラスメソッドを提案します。

class Transaction ... 
    def self.summed_values(transactions=nil) 
    if transactions.nil? 
     all.sum(...)... 
    else 
     where(id => transactions).sum(...)... 
    end 
    end 
end 

これは、トランザクションでのみ使用できるという利点もあります。

+0

を参照してください。これは、わかりやすく読まれたり、自分の意味だけでなく、後に解決された解決策とも一致しません。私が特に呼びたいメソッドは、概念的にも実装においても、関係オブジェクトに意味を持ちます。私はこれがうまくいくことに同意するが、それは私が何をしているかではない。 – Peter

+0

なぜ私はあなたがActiveRecord :: Relationオブジェクトでそれを好きで、それがトランザクションにのみ適用されるのかわかりません。論理的なアプローチは、Relationをサブクラス化し、代わりにTransactionがサブクラスを使用するようにすることです。私はそれがどんな意味でもよりクリーンであるとは思わないのです。 –

+0

これは以前どのように動作していたのか分かりませんでしたし、 'Transaction'にクラスメソッドを追加できて、それが関係で動作することに気が付きませんでした。私の理解を助けてくれてありがとう... – Peter

1

あなたはより多くの情報については

Transaction.all.extending do 
    def summed_values 
    sum(:what_you_want) 
    end 
end 

を拡張使用する必要があります(:値)ActiveRecord::QueryMethods

関連する問題