我认为这是一个链接两个范围的简单问题(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
我还可以通过添加:total_available
中定义的条件来使:available
范围有效,但这不是很干。
我在这里缺少什么?
答案 0 :(得分:5)
表达式available.sum
会立即得到评估,因此您的尝试等同于
scope :total_available, 55
或
scope :total_available, 55.available
这显然是错误的。就个人而言,我会使用类方法
def self.total_available
available.sum(:amount)
end
我认为范围是一个范围集合:对于我来说,范围是数字是没有意义的 - 一方面它们是范围你不能链接其他范围