Rails 3作用域,将条件与聚合(sum)组合会导致错误



我遇到了一个我认为是链接两个作用域(Rails 3.2.5)的简单问题

我有一个名为Point的模型,其中包含字段amounttransaction_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

我认为作用域是一个作用域集合:作用域是数字对我来说没有意义——首先,它们是不能将其他作用域链接到上的作用域

相关内容

  • 没有找到相关文章

最新更新