在ActiveRecord上的to_json时跳过具有nil值的属性

时间:2011-10-27 09:28:05

标签: ruby json activerecord

我想知道是否有任何方法可以跳过属性为零 在ActiveRecord上的to_json时的值。 默认行为是包含零值:

是否有一种方法可以使这个值不显示?

3 个答案:

答案 0 :(得分:9)

@lars的答案适用于单个对象,但对于Active Record对象数组,您必须遍历数组的每个元素并进行转换。如果您每次为该模型致电.to_jsonrender :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(Rails 3中为config/initializers/active_record.rb,Rails 2中为config/initializers/new_rails_defaults.rb)。否则,您必须在模型中完全实现@lars的函数(使用value[0]获取属性哈希等。)。

只有在每次为该模型调用.to_jsonrender :json => 时都要执行此操作时,才使用此方法。否则你应该坚持@ lars的答案。

答案 1 :(得分:3)

您可以通过as_json方法获取用于序列化为JSON的ActiveRecord对象的Hash表示。

哈希将使用(下划线)类名作为唯一键,值将是包含该类属性的另一个哈希值。

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

答案 2 :(得分:0)

对于任何哈希数组,考虑到除false和nil之外的任何值都将被认为是真的,我通常会这样做:

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

或者砰的替代方案:

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

但是,如果值可以可靠地为布尔值false,则不起作用。