0

私は、2つのスコープ(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が、それはあまり乾燥していません。

ここで何が欠けていますか?

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 に答える