Массив ActiveRecords в JSON - PullRequest
       13

Массив ActiveRecords в JSON

2 голосов
/ 19 июня 2009

Мне известно, что ActiveRecord предоставляет метод to_json, который позволяет фильтровать поля из выходных данных JSON с использованием: only и: кроме.

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

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

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

Ура, Адам

Ответы [ 3 ]

3 голосов
/ 25 июня 2009

Я думаю, что вы ответили на свой вопрос. С 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
2 голосов
/ 24 июня 2009

Вы можете перезаписать метод 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 голос
/ 19 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...