Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord:对关系计数求和_Ruby On Rails_Ruby_Activerecord_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails ActiveRecord:对关系计数求和

Ruby on rails ActiveRecord:对关系计数求和,ruby-on-rails,ruby,activerecord,ruby-on-rails-4,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 如何在制造商上定义小部件计数方法?也就是说,属于该制造商的所有模型的所有小部件的总和 例如,如果我有一个有3个模型的制造商,并且每个模型都有3个小部件,那么我希望制造商上的小部件计数方法返回9

我有这样的模型:

class Manufacturer
  has_many :models
end

class Model
  belongs_to :manufacturer
  has_many :widgets
end

class Widget
  belongs_to :model
end
如何在
制造商
上定义
小部件计数
方法?也就是说,属于该制造商的所有模型的所有小部件的总和

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

这会起作用,但我想知道是否有一种方法可以通过ActiveRecord实现:

manufactuer.models.map { |m| m.widgets.count }.sum
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')

ActiveRecord中的左加入+组+计数:

manufactuer.models.map { |m| m.widgets.count }.sum
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

我正在添加engineersmnky在对问题的评论中指出的答案,因为这正是我想要的

将此关联添加到
制造商
型号:

has_many :widgets, through: :models

本文提供了更多信息:.

我想做一些类似于
manufacturer.models.sum(:count)
,但count不是一个字段。有没有办法用ActiveRecord做到这一点?我已经编辑了我的问题,希望能更清楚一点。只需将关联添加到
制造商
,例如
有很多:小部件,通过::模型
,然后
制造商.小部件.计数
就可以了。