#ruby-on-rails #ruby-on-rails-3
#ruby-on-rails #ruby-on-rails-3
Вопрос:
В моей модели ListItem rails у меня есть:
attr_accessor :catalyst_action, :actor_user_id, :actor_full_name
Я могу установить эти переменные в контроллере, и я подтвердил, что когда запись попадает к наблюдателю, они все еще там.
Контроллер
@list_item.actor_user_id = current_user.id
@list_item.actor_full_name = current_user.full_name
@list_item.save
Наблюдатель
Rails.logger.info '@list_item.inspect - ListItemObserver'
Rails.logger.info record.inspect
Rails.logger.info record.actor_user_id
Rails.logger.info record.actor_full_name
Rails.logger.info '@list_item.inspect - ListItemObserver'
Они выводятся просто отлично, но когда я выполняю record.inspect, виртуальные attr не выводятся, но если я регистрирую их специально, они есть и выводятся. Почему выводимая запись не включает vattr? Как я могу заставить record включать эти переменные?
Спасибо
Ответ №1:
Это виртуальные атрибуты, а не реальные атрибуты. Active Record предоставляет inspect
метод (определение здесь ), и он перебирает все столбцы модели, которые, очевидно, не включают виртуальные атрибуты.
Если вы хотите узнать, какие виртуальные атрибуты есть в модели, то простого способа сделать это нет. Вам нужно будет где-то назначить их в список, а затем прочитать из этого списка.
Комментарии:
1. Как я могу их вывести? Данная запись. Я хочу вывести запись с 2 виртуальными атрибутами? Есть ли способ?
2. В моем наблюдателе я попробовал record.merge({ :actor_user_id => record.actor_user_id, :actor_full_name => record.actor_full_name }), но это не удалось с неопределенным методом `merge’ для #
3. Во-первых: нет, способа нет. Следуйте моим советам во втором абзаце моего ответа.
4. Во-вторых: вы пытаетесь выполнить слияние с записью, а не с атрибутами для записи. Вы хотите сделать
record.attributes.merge
.