Включение виртуальных атрибутов модели при преобразовании записи в JSON в Rails - PullRequest
10 голосов
/ 23 марта 2010

Я пытаюсь преобразовать модель ActiveRecord в JSON в Rails, и хотя метод to_json обычно работает, виртуальные атрибуты модели не включены. Есть ли способ в Rails перечислить не только атрибуты модели, но также атрибуты attr_accessor и attr_reader, чтобы все читаемые атрибуты были доступны при преобразовании модели в JSON?

Ответы [ 4 ]

15 голосов
/ 27 июня 2011

Я сделал это, чтобы поместить информацию в модель и обеспечить совместимость метода с любым способом, которым его может вызвать другой класс (as_json вызывается to_json и должен возвращать Hash):

class MyModel < ActiveRecord::Base
  def as_json options=nil
    options ||= {}
    options[:methods] = ((options[:methods] || []) + [:my, :virtual, :attrs])
    super options
  end
end

(протестировано в Rails v3.0)

12 голосов
/ 23 марта 2010

До Rails 3 используйте параметр : метод :

@model.to_json(:method => %w(some_virtual_attribute another_virtual_attribute))

В Rails 3 используйте : методы , опция

@model.to_json(:methods => %w(some_virtual_attribute another_virtual_attribute))
1 голос
/ 06 апреля 2011

Я не уверен, изменился ли он в Rails 3, но теперь вы должны использовать опцию: method вместо: method

0 голосов
/ 10 октября 2015

Другие ответы относятся к вызову methods, который возвращает все методы, включая те, которые не являются атрибутами. Альтернативный подход заключается в использовании attributes, который возвращает атрибуты модели, за исключением того, что он не включает ее виртуальные атрибуты.

Если они известны, то добавление в модель что-то вроде приведенного ниже может помочь:

VIRTUAL_ATTRIBUTES = %i{foo bar baz}
VIRTUAL_ATTRIBUTES.each { |a| attr_accessor a } # create accessors
def attributes
  VIRTUAL_ATTRIBUTES.each_with_object(super) { |a,h| h[a] = self.send(a) }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...