0

私のentryモデルには多くのカウンターがあります:

class Entry < ActiveRecord::Base
  has_many :counters
end

すべてcounterに がありnumbertotalは の合計を表しますnumbers

class Counter < ActiveRecord::Base
  scope :total, sum(:number)
end

特定のエントリに属する​​カウンターのすべての数の合計を取得する必要があります。

SQL では次のようになります。

SELECT SUM(`number`) AS `total` FROM `counters` WHERE `entry_id` = entry.id

私は試した:

entry.counters.total

しかし、次のように返されます。

NoMethodError: 未定義のメソッド `default_scoped?' 0:Fixnum の場合

ActiveRecord の関連付けとスコープでこれを適切に行う「Rails の方法」はありますか?

4

1 に答える 1

1

あなたの例では、への呼び出しsumはすぐに行われます。つまり、コードは次のようになります

scope :total, 0

(あなたのクラスが0である瞬間に合計が0であると仮定すると)、これは有効ではありません

基本的に、スコープは結果セットのスコープに関するものです。条件、順序、制限、または結合などのオプションを追加しますが、結果がアクティブなレコード オブジェクトのコレクションであるという定数を使用します。

やりたいことは、クラス メソッドとして表現するのが最適です。

def self.total
  sum(:number)
end

たとえば、これをスコープにチェーンすることもできます

some_entry.counters.total
于 2012-08-28T17:31:34.567 に答える