Динамически назначить атрибуту модели значение через его имя?

Не смог четко сформулировать заголовок вопроса. Поясню, что нужно.
Модели:
class Item < ActiveRecord::Base
has_one: subitem
end
class Subitem < ActiveRecord::Base
belongs_to: item
end


Где то в контроллере:
@item = Item.new
@item.subitem = Subitem.new

Теперь @item.subitem не nil. Здесь все просто замечательно работает. Но вдруг возникла потребность обращаться к subitem через символ или строку. Переписываю тот код:
@item = Item.new
@item.methods(:subitem) = Subitem.new

Это не работает @item.subitem это nil. Пробовал через attributes, но выяснил путем эксперимента, что subitem для Item - это метод.
В общем мне нужно, чтобы в коде не было жесткой прописки наименования метода, а обращение к нему через его название. Нужно чтобы результат был как при жесткой прописке. Поможете?
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
@sunnmas Автор вопроса
Ruby
@item = Item.new
@item.send(:subitem.to_s+'=', Subitem.new)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
viktorvsk
@viktorvsk
Не совсем понятно, что нужно и для каких целей.
есть метод
send(:sym) (вместо method)
Или, возможно, сначала нужно сделать:
item = Item.new
attr = :subitem
item.send("build_#{attr}".to_sym)
item.send(attr)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы