2011-06-23 16 views
1

は、次のコードを考えるとどのように乾燥させるために:named_scope拡張

named_scope :by_order, :order => 'priority ASC' do 
    def total_points 
     self.sum('point_value') 
    end 
    end 

    named_scope :required, :conditions => ['bonus = ?', false] do 
    def total_points 
     self.sum('point_value') 
    end 
    end 

    named_scope :bonus, :conditions => ['bonus = ?', true] do 
    def total_points 
     self.sum('point_value') 
    end 
    end 

をどのようにドライアップを繰り返しtotal_points方法でしょうか?

環境:Railsの2.3.11

+1

独立したnamed_scopeをチェーン化することができます。 – apneadiving

+1

あなたは他のスコープにチェーンすることができる 'total_points'というメソッドを作ることができます – bor1s

+0

それらは確かにかなり良い、簡単なアプローチです! – keruilin

答えて

1

別にすべてのスコープを定義するために再利用可能な、よりクリーンであること、そしてあなたがあなたのアプリケーションに必要なコレクションの特定のタイプのためのクラスメソッドを作成することがあります。簡単な例です(Rails 3の構文を使用していますが、バックポートするのはかなり簡単です)。実際に何をするかをよりよく反映するように、一部のスコープの名前を変更しました。

class Thing << ActiveRecord::Base 

    scope :in_priority_order, order("priority") 
    scope :no_bonus, where(:bonus => false) 
    scope :with_bonus, where(:bonus => true) 
    scope :total_points, sum(:point_value) 

    def self.total_bonus_points 
     with_bonus.total_points 
    end 

    def self.total_no_bonus_points 
     no_bonus.total_points 
    end 
end 

ところで私はあなたの合計で順位を組み合わせたいと思い、なぜわからないんだけど - (あなたが制限を適用しない限り)ためには、返された値に違いを作るべきではありません。