使用 mongoid 获取每个关联记录的计数
Get counts of each associations record with mongoid
假设我有一个具有许多关联模型的汽车模型,一些 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
记录并显示每个关联模型记录的计数?
我想要return类似的东西:
parts = { steering: 1, doors: 4 }
我知道我可以对每个关联一一进行 return 计数,但是如果我有 100 个关联怎么办?我想让它动态化。
编辑:
我可以获得所有关联的 has_many 和 has_one 记录的数组
car = Car.first
Car.reflect_on_all_associations(:has_many, :has_one).map(&:name)
=> [:steering, :tires, :doors, ...]
找到解决方案:
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个关联不能统计,会return个错误。所以这会起作用:
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
假设我有一个具有许多关联模型的汽车模型,一些 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
记录并显示每个关联模型记录的计数?
我想要return类似的东西:
parts = { steering: 1, doors: 4 }
我知道我可以对每个关联一一进行 return 计数,但是如果我有 100 个关联怎么办?我想让它动态化。
编辑:
我可以获得所有关联的 has_many 和 has_one 记录的数组
car = Car.first
Car.reflect_on_all_associations(:has_many, :has_one).map(&:name)
=> [:steering, :tires, :doors, ...]
找到解决方案:
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个关联不能统计,会return个错误。所以这会起作用:
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