0

我有一个我认为是链接两个范围的简单问题(Rails 3.2.5)。

我有一个名为Pointfieldsamount和的模型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,但这不是很干燥。

我在这里想念什么?

4

1 回答 1

5

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

scope :total_available, 55

或者

scope :total_available, 55.available

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

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

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

于 2012-07-11T18:35:09.457 回答