2009-06-19 2 views
2

Я знаю, что ActiveRecord предоставляет метод to_json, который позволяет отфильтровывать поля с выхода JSON, используя: only и: except.Array of ActiveRecords для JSON

В настоящее время я использую следующий форматировать массив из находки как JSON:

@customers = Customer.find(:all) 
... 
format.js { render :json => @customers} 

Как бы я быть в состоянии выбрать поля для вывода на объектах в массиве? Есть ли ярлык или мне нужно сделать это вручную?

Приветствия, Адам

ответ

2

Вы можете переписать метод to_json для класса модели, если вы хотите глобально применить изменение для модели.

Например, чтобы исключить нулевые значения из оказанной JSON можно перезаписать оригинальный метод ActiveRecord to_json

def to_json(options) 
    hash = Serializer.new(self, options).serializable_record 
    hash = { self.class.model_name => hash } if include_root_in_json 
    ActiveSupport::JSON.encode(hash) 
    end 

с этим в вашем классе модели:

def to_json(options) 
    hash = Serializer.new(self, options).serializable_record.reject {|key, value| value.nil? } 
    hash = { self.class.model_name => hash } if include_root_in_json 
    ActiveSupport::JSON.encode(hash) 
    end 
1

Если заглянуть в класс ActionController :: Base, вы увидите, что он вызывает to_json на вашей коллекции сразу (не используется никаких дополнительных опций), так что вы должны иметь это уже подготовлен. Так что если в ваших действий вы не использовать атрибуты, которые не отображаются в формате JSON, вы можете заменить находку с

@customers = Customer.find(:all, :select => ["id", ...]) 

выбрать только те, которые вам нужны.

2

Я думаю, что вы ответили на свой вопрос. С Rails 2.3.x вы можете использовать следующее:

@customers = Customer.all #Shortcut for to Customer.find(:all) 
respond_to do |format| 
    format.js { render :json => @customers.to_json(:only=>[:column_one, :column_two]} 
end