擴大在@ ratbeard的回答下面,任何active_model_serializer版本0.9.x及以上版本都適用。我包含了獲取PORO可序列化散列對象與rails之外的activemodel序列化器一起工作所需的最少量的active_support和active_model類。對於我作爲優化的目的,我傳遞了一個預先計算的序列化對象數組,這些對象在應用程序中的其他位置計算。如果可用,則可以重載ActiveModel :: Serializer子類中的初始化程序以將其傳遞,而不是重新計算。
的lib/serializable_hash.rb
class SerializableHash < Hash
alias :read_attribute_for_serialization :[]
end
應用程序/串行器/電子郵件/ foo_serializer。RB
require 'active_model/serializer'
require 'active_support/core_ext/object'
require 'active_support/inflector'
require 'active_support/notifications'
class Email::FooSerializer < ActiveModel::Serializer
attributes :id, :bars, :created_at, :updated_at
def initialize(foo, precomputed_serialized_array_of_bars =nil)
unless serialized_bars
serialized_bars = {}
foo.bar.each do | bar |
serialized_searches[bar.baz] ||= []
serialized_searches[bar.baz] << Email::BarSerializer.new(bar).attributes
end
end
super(SerializableHash[
id: foo.id,
bars: serialized_bars,
created_at: foo.created_at
updated_at: foo.updated_at
])
end
end
爲了完整性我還包括使用一個實例變量,而不是串行化散列此替代版本:
應用程序/串行器/電子郵件/ foo_serializer.rb
require 'active_model/serializer'
require 'active_support/core_ext/object'
require 'active_support/inflector'
require 'active_support/notifications'
class Email::FooSerializer < ActiveModel::Serializer
attributes :id, :bars, :created_at, :updated_at
def initialize(foo, precomputed_serialized_array_of_bars=nil)
@bars = precomputed_serialized_array_of_bars
super(foo)
end
def bars
if @bars
return @bars
else
serialized_bars = {}
object.bars.each do | bar |
serialized_bars[bar.baz] ||= []
serialized_bars[bar.baz] << Email::BarSerializer.new(bar).attributes
end
return serialized_bars
end
end
end
然後要使用序列化頂級對象,您只需執行
require 'app/serializers/email/foo_serializer'
require 'app/serializers/email/bar_serializer'
Email::FooSerializer.new(Foo.first).as_json
或者如果你想用酒吧的預先計算的序列化數組:
# pre-compute array_of_serialized_bars somewhere up here
require 'app/serializers/email/foo_serializer'
require 'app/serializers/email/bar_serializer'
Email::FooSerializer.new(Foo.first, array_of_pre_serialized_bars).as_json
你應該接受你自己的答案,因爲它看起來是正確的。 :) –
嘿羅賓你可以包括你的對象的例子,誰想從頭開始類似的人嗎? (這是一個包含序列化器支持的非活動記錄對象) – Will
您是否可以在模型中序列化嵌套的序列化對象數組? – Chris