2011-06-23 86 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 

順便說一句,我不知道爲什麼你會想下訂單的總和相結合 - 訂單不應該返回的值的差值(除非你申請的限制)。