Почему виртуальные атрибуты attr_accessor не выводятся при выполнении record.inspect

#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 .