Пропустить атрибуты, имеющие нулевые значения, когда to_json на ActiveRecord - PullRequest
3 голосов
/ 27 октября 2011

Мне было интересно, есть ли способ просто пропустить атрибуты, имеющие значения nil, когда to_json в ActiveRecord.Поведение по умолчанию состоит в том, чтобы включать значение nil:

Есть ли вариант, позволяющий сделать это значение просто не отображаемым?

Ответы [ 3 ]

9 голосов
/ 27 октября 2011

@ lars ответ будет работать для одного объекта, но для массива объектов Active Record вам придется перебирать каждый элемент массива и выполнять преобразование.Если вам нужно это преобразование каждый раз, когда вы вызываете .to_json или render :json => для этой модели, вы можете переопределить функцию as_json в модели следующим образом:

class Model
  ..
  def as_json(options={})
    super(options).reject { |k, v| v.nil? }
  end
end

Кроме того, я предполагаю, что вы определили, ActiveRecord::Base.include_root_in_json = false в вашей среде (config/initializers/active_record.rb в Rails 3 и config/initializers/new_rails_defaults.rb в Rails 2).В противном случае вам придется полностью реализовать функцию @ lars в модели (для получения хэша атрибута и т. Д. Требуется value[0]).

Используйте этот метод, только если вы хотите делать это каждый раз, когда вызываете.to_json или render :json => для этой модели .В противном случае вам следует придерживаться ответа @ lars.

3 голосов
/ 27 октября 2011

Вы можете получить представление Hash объекта ActiveRecord, используемого для сериализации в JSON с помощью метода as_json.

Хеш будет иметь (подчеркнутый) имя класса в качестве единственного ключа, а значением будет другой хеш, содержащий атрибуты класса.

hash = object.as_json # Convert to hash
hash.values[0].reject! {|k,v| v.nil?} # Remove attributes with value nil
hash.to_json # Convert to JSON string
0 голосов
/ 13 апреля 2016

Для любого хеш-массива вот что я обычно делаю, учитывая, что любое значение, кроме false и nil, будет считаться истинным:

filtered_array = array.select{|k,v| v}

Или альтернатива взрыва:

array.select!{|k,v| v}

Однако это НЕ будет работать, если значения могут быть достоверно логическим значением false.

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