#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
это метод класса.