Как высушить расширение named_scope - PullRequest
1 голос
/ 23 июня 2011

Учитывая следующий код:

  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?

Environment: Rails 2.3.11

1 Ответ

1 голос
/ 23 июня 2011

Возможно, было бы более понятным и более пригодным для повторного использования определять все области отдельно, а затем создавать методы класса для конкретных типов коллекций, которые вам нужны в вашем приложении. Вот краткий пример (с использованием синтаксиса 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

Кстати, я не уверен, почему вы хотите объединить заказ с суммой - заказ не должен иметь значения для возвращаемых значений (если вы не применяете лимит).

...