Ruby on rails 3 Rails 3作用域,将条件与聚合(总和)合并会导致错误

Ruby on rails 3 Rails 3作用域,将条件与聚合(总和)合并会导致错误,ruby-on-rails-3,aggregate,arel,Ruby On Rails 3,Aggregate,Arel,我有一个我认为是链接两个作用域的简单问题(Rails 3.2.5) 我有一个名为Point的模型,其中包括amount和transaction\u date字段。用户可以从各种活动中获得一定数量的积分,在使用之前这些积分是“可用”的,这是作为交易的一部分发生的,此时transaction\u date被更新,不再为空 所以我有这样一个范围: scope :available, where("transaction_date IS NULL OR transaction_date = ''")

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

我有一个名为
Point
的模型,其中包括
amount
transaction\u date
字段。用户可以从各种活动中获得一定数量的积分,在使用之前这些积分是“可用”的,这是作为交易的一部分发生的,此时
transaction\u date
被更新,不再为空

所以我有这样一个范围:

scope :available, where("transaction_date IS NULL OR transaction_date = ''")
它非常有效,返回了点对象的正确集合。所以我能做到

> Point.available
=> [#<Point id: 123, amount: 22, transaction_date: nil >][#<Point id: 456, amount: 33, transaction_date: nil >]
但如果我尝试制作另一个类似的范围

scope :available, where("transaction_date IS NULL OR transaction_date = ''")
scope :total_available, available.sum("amount")
我得到了错误

NoMethodError: undefined method `default_scoped?' for 22:Fixnum
NoMethodError: undefined method `available' for 55:Fixnum
或者,如果我更改范围,使其成为
sum(“amount”).available
我会得到错误

NoMethodError: undefined method `default_scoped?' for 22:Fixnum
NoMethodError: undefined method `available' for 55:Fixnum
我还可以通过添加
:available
中定义的条件,使
:total_可用
范围工作,但这不是很枯燥


我这里缺少什么?

表达式
可用。sum
会立即进行求值,因此您的尝试相当于

scope :total_available, 55

这显然是错误的。就我个人而言,我会为此使用类方法

def self.total_available
  available.sum(:amount)
end

我认为作用域是一个作用域集合:作用域是数字对我来说没有意义——首先,它们是作用域,你不能将其他作用域链接到表达式
上。sum
会立即求值,因此你的尝试等同于

scope :total_available, 55

这显然是错误的。就我个人而言,我会为此使用类方法

def self.total_available
  available.sum(:amount)
end

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

谢谢@Frederick Chung——谢谢你对错误的解释,这有助于我理解失败。我还认为你的解决方案是切实可行的,你使用它的理由是合乎逻辑的。然而,作用域是在AREL中实现的,并且显示了一种类似于我的案例——链接用作额外的细化。也许我的问题应该是“Rails有没有正确的方法?”使用作用域和聚合,比如
sum
?我可以看到在作用域上运行计算的示例,但没有定义一个计算作用域是的,显然它们与常规作用域有点不同。不管怎么说,你的解决方案对一个范围的作用几乎相同。谢谢@Frederick Chung--谢谢你对错误的解释,这有助于我理解失败。我还认为你的解决方案是切实可行的,你使用它的理由是合乎逻辑的。然而,作用域是在AREL中实现的,并且显示了一种类似于我的案例——链接用作额外的细化。也许我的问题应该是“Rails有没有正确的方法?”使用作用域和聚合,比如
sum
?我可以看到在作用域上运行计算的示例,但没有定义一个计算作用域是的,显然它们与常规作用域有点不同。无论如何,您的解决方案在某个范围内的工作方式几乎相同。