Rails 3范围,组合条件与聚合(总和)导致错误

Tom*_*son 0 aggregate arel ruby-on-rails-3

我正在考虑一个链接两个范围的简单问题(Rails 3.2.5).

我有一个名为模型Point与田amounttransaction_date,除其他.用户获得各种活动的积分,并且在使用之前它们是"可用的",这是作为交易的一部分发生的,此时transaction_date更新,不再为空.

所以我有这样的范围:

scope :available, where("transaction_date IS NULL OR transaction_date = ''")
Run Code Online (Sandbox Code Playgroud)

它工作得很好,返回Point对象的正确集合.所以我能做到

> Point.available
=> [#<Point id: 123, amount: 22, transaction_date: nil >][#<Point id: 456, amount: 33, transaction_date: nil >]
Run Code Online (Sandbox Code Playgroud)

如果我想知道可用点的总和,我可以做到

> Point.available.sum("amount")
=> 55
Run Code Online (Sandbox Code Playgroud)

但是,如果我试图制作另一个范围

scope :available, where("transaction_date IS NULL OR transaction_date = ''")
scope :total_available, available.sum("amount")
Run Code Online (Sandbox Code Playgroud)

我收到了错误

NoMethodError: undefined method `default_scoped?' for 22:Fixnum
Run Code Online (Sandbox Code Playgroud)

或者如果我更改范围,那么sum("amount").available我就会收到错误

NoMethodError: undefined method `available' for 55:Fixnum
Run Code Online (Sandbox Code Playgroud)

我也可以:total_available通过添加定义的条件来使范围工作:available,但这不是很干.

我在这里错过了什么?

Fre*_*ung 5

表达式 available.sum会立即得到评估,因此您的尝试等同于

scope :total_available, 55
Run Code Online (Sandbox Code Playgroud)

要么

scope :total_available, 55.available
Run Code Online (Sandbox Code Playgroud)

这显然是错的.就个人而言,我会使用类方法

def self.total_available
  available.sum(:amount)
end
Run Code Online (Sandbox Code Playgroud)

我认为范围是一个范围集合:对于我来说,范围是数字是没有意义的 - 一方面它们是范围你不能链接到其他范围