【问题标题】:Ruby on Rails ActiveRecord: has_many and sumRuby on Rails ActiveRecord:has_many 和 sum
【发布时间】:2012-08-29 01:31:34
【问题描述】:

我的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 关联和范围?

【问题讨论】:

  • 你是说 entry.counters.total 吗?

标签: ruby-on-rails activerecord


【解决方案1】:

在您的示例中,对sum 的调用是直接发生的,即您的代码相当于

scope :total, 0

(假设在你的班级为0时总和为0),这是无效的

从根本上说,范围是关于确定结果集的范围:添加条件、顺序、限制或选项(例如连接),但结果是一个活动记录对象的集合。

你想做的最好用类方法来表达:

def self.total
  sum(:number)
end

您仍然可以将其链接到范围,例如

some_entry.counters.total

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 2020-02-01
    • 2012-01-09
    • 2011-05-06
    • 2018-12-23
    • 2012-07-08
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多