我想在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
有选择吗?
答案 0 :(得分:28)
要与Rails 3兼容,请覆盖as_json
而不是to_json
。它在2.3.3中引入:
def as_json(options={})
{ :libro => { :created_at => created_at } }
end
确保ActiveRecord::Base.include_root_in_json = false
。当您调用to_json
时,后台as_json
用于构建数据结构,ActiveSupport::json.encode
用于将数据编码为JSON字符串。
答案 1 :(得分: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
所以只使用@obj.to_json(:root => 'custom_obj')
答案 2 :(得分: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\"}}"
或者如果您想要所有记录属性......
def to_json
{ :libro => self.attributes }.to_json
end