我想知道是否有任何方法可以跳过属性为零 在ActiveRecord上的to_json时的值。 默认行为是包含零值:
是否有一种方法可以使这个值不显示?
答案 0 :(得分:9)
@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
(Rails 3中为config/initializers/active_record.rb
,Rails 2中为config/initializers/new_rails_defaults.rb
)。否则,您必须在模型中完全实现@lars的函数(使用value[0]
获取属性哈希等。)。
只有在每次为该模型调用.to_json
或render :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,则不起作用。