获取与蒙古语的每个关联记录的计数

时间:2018-07-03 15:56:48

标签: ruby-on-rails mongoid

说我有一个带有许多关联模型的Car模型,其中一些具有has_many,另一些具有has_one。

class Car
  include Mongoid::Document

  has_one :steering, class_name: "Car::Steering", autosave: true, dependent: :destroy
  accepts_nested_attributes_for :steering, allow_destroy: true

  has_many :tires, class_name: "Car::Tire", autosave: true, dependent: :destroy
  accepts_nested_attributes_for :tires, allow_destroy: true

  has_many :doors, class_name: "Car::Door", autosave: true, dependent: :destroy
  accepts_nested_attributes_for :doors, allow_destroy: true
end

如何列出每个Car记录并显示每个相关模型记录的数量?

我想返回类似的内容:

parts = { steering: 1, doors: 4 }

我知道我可以在每个关联上一个接一个地返回计数,但是如果我有100个关联怎么办?我想使其动态化。

编辑:

我可以使用

获得所有相关的has_many和has_one记录的数组
car = Car.first
Car.reflect_on_all_associations(:has_many, :has_one).map(&:name)
 => [:steering, :tires, :doors, ...]

1 个答案:

答案 0 :(得分:1)

找到了解决方案:

selected_car = Car.first
selected_car.reflect_on_all_associations(:has_many, :has_one)
   .map do |assoc|
     { assoc.name => (car.send(assoc.name).nil? ? 0 : car.send(assoc.name).count) }
   end

如果您有更好,更快,更有效的解决方案,请共享!

更新:

发现我上面的代码有问题。 :has_one关联不能计算,并且会返回错误。因此,它将代替:

one_assoc = selected_car.class.reflect_on_all_associations(:has_one).map { |assoc| selected_car.send(assoc.name).present? ? {assoc.name => 1 } : nil }
many_assoc = selected_car.class.reflect_on_all_associations(:has_many).map { |assoc| selected_car.send(assoc.name).present? ? {assoc.name => selected_car.send(assoc.name).count } : nil }
associations = one_assoc + many_assoc