我有这样的模特:
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
答案 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"。