覆盖as_json或to_json模型类名

Jac*_*ack 5 activerecord json ruby-on-rails

我想在AR模型上调用to_json时修改类名.

Book.first.to_json
 #=> "{\"book\":{\"created_at\":\"2010-03-23 

Book.first.to_json(:root => 'libro')
 #=> "{\"libro\":{\"created_at\":\"2010-03-23 
Run Code Online (Sandbox Code Playgroud)

有没有选择这样做?

Jon*_*ian 28

要与Rails 3兼容,请覆盖as_json而不是to_json.它在2.3.3中引入:

def as_json(options={})
  { :libro => { :created_at => created_at } }
end
Run Code Online (Sandbox Code Playgroud)

确保ActiveRecord::Base.include_root_in_json = false.当您调用时to_json,后台as_json用于构建数据结构,并ActiveSupport::json.encode用于将数据编码为JSON字符串.


小智 6

至少从3.0.5开始,您现在可以选择将:root选项传递给to_json调用.这是现在活动记录上的as_json方法的来源.

def as_json(options = nil)
    hash = serializable_hash(options)

    if include_root_in_json
      custom_root = options && options[:root]
      hash = { custom_root || self.class.model_name.element => hash }
    end

    hash
end
Run Code Online (Sandbox Code Playgroud)

所以要正确使用它 @obj.to_json(:root => 'custom_obj')


rbx*_*xbx 0

您可以覆盖模型中默认的 to_json 方法,构建所需属性的哈希,然后对其调用哈希的 to_json 方法。

class Book < ActiveRecord::Base

  def to_json
    { :libro => { :created_at => created_at } }.to_json
  end

end

#=> "{\"libro\":{\"created_at\":\"2010-03-26T13:45:28Z\"}}"
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要所有记录属性......

def to_json
  { :libro => self.attributes }.to_json
end
Run Code Online (Sandbox Code Playgroud)