Active Model Serialization¶ ↑
为您的对象提供了一个基本的序列化到 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 必须是字符串,而不是符号。调用时,serializable hash 将使用与 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