Получить счет каждой записи ассоциации с Mongoid - PullRequest
0 голосов
/ 03 июля 2018

Скажем, у меня есть модель автомобиля со многими ассоциированными моделями, некоторые из них 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 ассоциаций? Я хочу сделать это динамичным.

EDIT:

Я могу получить массив всех связанных записей has_many и has_one с помощью

car = Car.first
Car.reflect_on_all_associations(:has_many, :has_one).map(&:name)
 => [:steering, :tires, :doors, ...]

1 Ответ

0 голосов
/ 03 июля 2018

Нашли решение:

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

Если у вас есть лучшее, более быстрое и эффективное решение, пожалуйста, поделитесь!

UPDATE:

Обнаружена проблема с моим кодом выше. : 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
...