Как перебрать связанные объекты ActiveRecord - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно выполнить операции со всеми объектами, связанными с объектом ActiveRecord Rails 5, но я не хочу явно писать отдельный вызов метода для каждого объекта.
Например, скажем, «отпуск» объект, с которым я имею дело, и он может иметь много связанных объектов (для простоты предположим, что все имеет has_one): агент, путешественник, самолет, корабль, гостиница. Я мог бы сделать:

do_stuff_to_assoc_object (отпуск.агент)

do_stuff_to_assoc_object (отпуск.травеллер)

do_stuff_to_assoc_object (отпуск.план) ... et c.

но это очень не элегантно, особенно если есть много ассоциаций. Благодаря Как получить все связанные модели из объекта ActiveRecord? , я знаю, что могу получить имена классов моделей связанных объектов как строки или объект AssociationReflection, но как это сделать? Я получаю фактический объект , который они представляют?

   parent_object.reflect_on_all_associations(:has_one).map(&:class_name).each do |model_name|
      ### how to convert model_name into the object? 
      do_stuff_to_assoc_object(obj)
    end

  def do_stuff_to_assoc_object(obj)
     # I do things to the associated object here
  end

1 Ответ

1 голос
/ 28 февраля 2020

Имя модели можно преобразовать в объект с помощью public_send , если вы выбрали модели связывания, проверьте ниже:

parent_object.reflect_on_all_associations(:has_one).map(&:class_name).each do |model_name|
      # assuming that parent_object is the object that has all associations.
      obj = parent_object.public_send(model_name)
      do_stuff_to_assoc_object(obj)
    end

  def do_stuff_to_assoc_object(obj)
     # I do things to the associated object here
  end

Согласно @ Clemens Kofler комментарий , чтобы избежать двойной итерации, мы можем удалить .map следующим образом:

parent_object.reflect_on_all_associations(:has_one).each do |association|
          # assuming that parent_object is the object that has all associations.
          obj = parent_object.public_send(association.class_name)
          do_stuff_to_assoc_object(obj)
        end

      def do_stuff_to_assoc_object(obj)
         # I do things to the associated object here
      end

Ссылка:
https://apidock.com/ruby/Object/public_send

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...