2010-03-31 3 views
5

Я хотел бы изменить имя класса при вызове to_json в AR-модели.Переопределить имя класса модели as_json или to_json

т.е.

Book.first.to_json 
#=> "{\"book\":{\"created_at\":\"2010-03-23 

Book.first.to_json(:root => 'libro') 
#=> "{\"libro\":{\"created_at\":\"2010-03-23 

Есть ли возможность сделать это?

+1

Я не знаю, о переопределении to_json, но вы можете установить ActiveRecord :: Base.include_root_in_json = ложь, и она будет не выводить корневой узел, можно затем добавить какой корневой узел вам нравится. – Corey

ответ

0

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

class Book < ActiveRecord::Base 

    def to_json 
    { :libro => { :created_at => created_at } }.to_json 
    end 

end 

#=> "{\"libro\":{\"created_at\":\"2010-03-26T13:45:28Z\"}}" 

Или, если вы хотите, чтобы все записи атрибутов ...

def to_json 
    { :libro => self.attributes }.to_json 
end 
28

Для совместимости с Rails 3, переопределить as_json вместо to_json. Она была введена в 2.3.3:

def as_json(options={}) 
    { :libro => { :created_at => created_at } } 
end 

Убедитесь ActiveRecord::Base.include_root_in_json = false. Когда вы вызываете to_json, за кулисами as_json используется для построения структуры данных, а ActiveSupport::json.encode используется для кодирования данных в строку JSON.

6

Начиная с версии 3.0.5, по крайней мере, теперь у вас есть возможность передать опцию: root для вызова to_json. Вот теперь источник метода as_json в активной записи.

def as_json(options = nil) 
    hash = serializable_hash(options) 

    if include_root_in_json 
     custom_root = options && options[:root] 
     hash = { custom_root || self.class.model_name.element => hash } 
    end 

    hash 
end 

Так, чтобы использовать это как раз @obj.to_json(:root => 'custom_obj')

Смежные вопросы