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

是否有任何“Rails 方式”可以很好地使用 ActiveRecord 关联和范围?

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 回答