我遇到了一个我认为是链接两个作用域(Rails 3.2.5)的简单问题
我有一个名为Point
的模型,其中包含字段amount
和transaction_date
。用户可以为各种活动获得一定数量的积分,在使用之前,这些积分是"可用的",这是事务的一部分,此时transaction_date
将更新,不再为空。
所以我有一个这样的范围:
scope :available, where("transaction_date IS NULL OR transaction_date = ''")
它工作得很好,返回了Point对象的正确集合。所以我可以做
> Point.available
=> [#<Point id: 123, amount: 22, transaction_date: nil >][#<Point id: 456, amount: 33, transaction_date: nil >]
如果我想知道可用积分的总和,我可以做
> Point.available.sum("amount")
=> 55
但如果我尝试制作另一个像一样的范围
scope :available, where("transaction_date IS NULL OR transaction_date = ''")
scope :total_available, available.sum("amount")
我得到错误
NoMethodError: undefined method `default_scoped?' for 22:Fixnum
或者如果我更改范围,使其为sum("amount").available
,我会得到错误
NoMethodError: undefined method `available' for 55:Fixnum
我也可以通过添加:available
中定义的条件来使:total_available
作用域工作,但这不是很DRY。
我在这里错过了什么?
表达式available.sum
会立即求值,因此您的尝试相当于
scope :total_available, 55
或
scope :total_available, 55.available
这显然是错误的。就我个人而言,我会使用这个的类方法
def self.total_available
available.sum(:amount)
end
我认为作用域是一个作用域集合:作用域是数字对我来说没有意义——首先,它们是不能将其他作用域链接到上的作用域