Active Model 序列化
为您的对象提供基本的序列化到 serializable_hash
。
一个最小的实现可能是
class Person
include ActiveModel::Serialization
attr_accessor :name
def attributes
{'name' => nil}
end
end
这将为您提供
person = Person.new
person.serializable_hash # => {"name"=>nil}
person.name = "Bob"
person.serializable_hash # => {"name"=>"Bob"}
必须定义一个 attributes
哈希,它应该包含您需要序列化的任何属性。 Attributes
必须是字符串,而不是符号。调用时,可序列化哈希将使用与属性哈希键名称匹配的实例方法。为了覆盖此行为,请覆盖 read_attribute_for_serialization
方法。
ActiveModel::Serializers::JSON
模块自动包含 ActiveModel::Serialization
模块,因此无需显式包含 ActiveModel::Serialization
。
一个包含 JSON 的最小实现将是
class Person
include ActiveModel::Serializers::JSON
attr_accessor :name
def attributes
{'name' => nil}
end
end
这将为您提供
person = Person.new
person.serializable_hash # => {"name"=>nil}
person.as_json # => {"name"=>nil}
person.to_json # => "{\"name\":null}"
person.name = "Bob"
person.serializable_hash # => {"name"=>"Bob"}
person.as_json # => {"name"=>"Bob"}
person.to_json # => "{\"name\":\"Bob\"}"
有效的选项是 :only
、:except
、:methods
和 :include
。以下是所有有效的示例
person.serializable_hash(only: 'name')
person.serializable_hash(include: :address)
person.serializable_hash(include: { address: { only: 'city' }})
方法
实例公共方法
serializable_hash(options = nil) 链接
返回对象的序列化哈希。
class Person
include ActiveModel::Serialization
attr_accessor :name, :age
def attributes
{'name' => nil, 'age' => nil}
end
def capitalized_name
name.capitalize
end
end
person = Person.new
person.name = 'bob'
person.age = 22
person.serializable_hash # => {"name"=>"bob", "age"=>22}
person.serializable_hash(only: :name) # => {"name"=>"bob"}
person.serializable_hash(except: :name) # => {"age"=>22}
person.serializable_hash(methods: :capitalized_name)
# => {"name"=>"bob", "age"=>22, "capitalized_name"=>"Bob"}
使用 :include
选项的示例
class User
include ActiveModel::Serializers::JSON
attr_accessor :name, :notes # Emulate has_many :notes
def attributes
{'name' => nil}
end
end
class Note
include ActiveModel::Serializers::JSON
attr_accessor :title, :text
def attributes
{'title' => nil, 'text' => nil}
end
end
note = Note.new
note.title = 'Battle of Austerlitz'
note.text = 'Some text here'
user = User.new
user.name = 'Napoleon'
user.notes = [note]
user.serializable_hash
# => {"name" => "Napoleon"}
user.serializable_hash(include: { notes: { only: 'title' }})
# => {"name" => "Napoleon", "notes" => [{"title"=>"Battle of Austerlitz"}]}
来源:显示 | 在 GitHub 上
# File activemodel/lib/active_model/serialization.rb, line 125 def serializable_hash(options = nil) attribute_names = attribute_names_for_serialization return serializable_attributes(attribute_names) if options.blank? if only = options[:only] attribute_names = Array(only).map(&:to_s) & attribute_names elsif except = options[:except] attribute_names -= Array(except).map(&:to_s) end hash = serializable_attributes(attribute_names) Array(options[:methods]).each { |m| hash[m.to_s] = send(m) } serializable_add_includes(options) do |association, records, opts| hash[association.to_s] = if records.respond_to?(:to_ary) records.to_ary.map { |a| a.serializable_hash(opts) } else records.serializable_hash(opts) end end hash end