Rails: ActiveRecord и отправка; как мне установить отношение экземпляра activerecord, зная только имена классов?

#ruby-on-rails #ruby #activerecord #metaprogramming

#ruby-on-rails #ruby #activerecord #метапрограммирование

Вопрос:

Итак, я перебираю все мои AR и устанавливаю их отношения dynamically…so Я знаю, что у меня есть SomeObject и что он принадлежит_ многим объектам…Я хочу сделать что-то вроде этого:

 an_object.some_relation = related_object
an_object.save
  

Есть ли способ сделать это с помощью отправки или какого-либо подобного подобного метода? Это, конечно, не работает:

 an_object.send(some_relation_name, related_object)
  

Это работает, я просто заинтересован в том, чтобы сделать это менее опасным, более похожим на Rails способом:

 an_object.update_attributes({"#{some_relation_name}_id"=>related_object.id})
  

Ответ №1:

Ну, вы могли бы сделать

 an_object.send("#{some_relation_name}=", related_object)
  

Который просто динамически вызывает метод установки.

Или вы могли бы перейти на немного более низкий уровень и использовать :

 an_object.reflect_on_association(some_relation_name).build_association(related_object_attributes)
  

Я бы выбрал первое, иногда немного «страшно» использовать send, но в этом суть ruby — динамического программирования.

Комментарии:

1. Идеальный… Я не всегда понимал, что символ = может быть частью буквального имени установщика

2. reflect_on_association это метод класса.