ActiveRecord:总结关系的数量

时间:2014-10-21 20:12:45

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

我有这样的模特:

class Manufacturer
  has_many :models
end

class Model
  belongs_to :manufacturer
  has_many :widgets
end

class Widget
  belongs_to :model
end

如何在widget_count上定义Manufacturer方法?也就是说,属于该制造商的所有模型的所有小部件的总和。

例如,如果我有一个包含3个模型的制造商,并且每个模型都有3个小部件,那么我希望#widget_count上的Manufacturer方法返回9。

这样可行,但我想知道是否有办法使用ActiveRecord:

manufactuer.models.map { |m| m.widgets.count }.sum

2 个答案:

答案 0 :(得分:0)

ActiveRecord中的左连接+组+计数:

Manufacturer.
  joins('left join models on models.manufacturer_id = manufacturer.id left join widgets on widgets.model_id = models.id').
  select('manufacturer.*, count(widgets.id) as widget_count').
  group('manufacturer.id')

Manufacturer.find(1).widget_count #=> 3

答案 1 :(得分:0)

我正在添加工程师在问题评论中指出的答案,因为这正是我所追求的。

将此关联添加到Manufacturer模型:

has_many :widgets, through: :models

本文提供了更多信息:"Nested Associations and Has_many :through, :source"

相关问题