如何DRY named_scope扩展

时间:2011-06-23 12:12:14

标签: ruby-on-rails dry 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 个答案:

答案 0 :(得分: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

顺便说一下我不确定你为什么要把订单与总和合并 - 订单不应该对返回的值产生影响(除非你申请限制)。