Виртуальные атрибуты ActiveRecord обрабатываются как атрибуты записи - PullRequest
9 голосов
/ 14 октября 2009

У меня проблема с тем, что to_json не отображает мои виртуальные атрибуты

class Location < ActiveRecord::Base
    belongs_to :event
    before_create :generate_oid
    validates_associated :event

    attr_accessor :event_oid

    def event_oid
      @event_oid = event.oid
    end
end

event_oid не является частью массива, возвращаемого:

Location.first.attributes

Это особенно проблема для меня при использовании to_json, который автоматически сериализует атрибуты записи в jason to_json опускает мой виртуальный атрибут.

Как сделать виртуальный атрибут действительным атрибутом экземпляра?

Edit:

to_json - это всего лишь пример метода, в котором мой виртуальный атрибут рассматривается как фактический атрибут.

Ответы [ 5 ]

5 голосов
/ 14 октября 2009

Вы хотите изменить атрибуты хэша. Здесь есть немного дополнительного кода, чтобы гарантировать, что интересующие вас атрибуты готовы к использованию с to_json или другим методом, который зависит от атрибутов при загрузке объекта.

class Location < ActiveRecord::Base
    belongs_to :event
    before_create :generate_oid
    validates_associated :event

    after_save :event_oid

    attr_accessor :event_oid

    def event_oid
      @event_oid = @attributes["event_oid"] = event.oid if event.nil?
    end       

    def after_initialize
      event_oid
    end


end

to_json и множество других методов, которые генерируют списки вещей на основе атрибутов объектов. Который заполняется при инициализации объекта таблицами базы данных и именами, к сожалению, переменные экземпляра не обновляют этот хэш.

P.S. это не очень СУХО, если у вас есть ряд атрибутов, которые вы хотите использовать таким образом. Вы можете использовать массив символов, детерминированные имена методов и блок class_eval, чтобы применить этот процесс к нескольким символам одновременно.

Внимание

Мы тут возимся с внутренностями рельсов. Невозможно сказать, как это может привести к сбою других вещей. Я не тестировал больше, чем save и to_json, оба из которых работают, когда хэш атрибута содержит ключи, которые не являются также именами столбцов. Так что используйте его на свой страх и риск.

2 голосов
/ 14 октября 2009

Просто реализуйте #to_json самостоятельно:

class Location < ActiveRecord::Base
  def to_json(options={})
    options[:methods] ||= []
    options[:methods] << :event_oid
    super(options)
  end
end
2 голосов
/ 14 октября 2009

как насчет to_json(:methods => [:event_oid]), это работает?

0 голосов
/ 06 ноября 2013
location.to_json(:methods => :event_oid)

Как объяснено здесь: http://apidock.com/rails/ActiveRecord/Serialization/to_json

В контроллере просто используйте:

format.json { render json: @location.to_json(:methods => :event_oid) }
0 голосов
/ 01 ноября 2013

Я попытался Ответ Франсуа Босолея и заставил его работать после изменения to_json на as_json

def as_json(options={})
  options[:methods] ||= []
  options[:methods] << :class_to_s
  super(options)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...