在某些情况下,嵌套关联嵌入在JSON中,而在其他情况下则不是。到目前为止一切都那么好,这就像我想要的那样。但我希望在未嵌入它们的情况下,仍会发出嵌套关联的ID。
E.g:
suggestions
当我在没有class FooSerializer < ActiveModel::Serializer
attributes :id, :x, :y
belongs_to :bar
end
class BarSerializer < ActiveModel::Serializer
attributes :id, :z
end
的情况下序列化Foo
对象时,我希望结果如下:
include: [:bar]
如果{
"id": 123
"x": 1,
"y": 2,
"bar": 456
}
是多态关联,我会喜欢这样的东西:
bar
实际上我希望ID为字符串({
"id": 123
"x": 1,
"y": 2,
"bar": {"id": 456, "schema": "Bar"}
}
),因为它们应该是API使用者的黑盒子,绝对不能使用JavaScript的"id": "123"
类型(Number
精度浮动点!)。
我该怎么做?我没有找到任何相关的信息。
答案 0 :(得分:0)
在FooSerializer中以这种方式定义属性id
以将其作为字符串:
attribute :id do
object.to_s
end
“当我序列化没有包含的Foo对象时:[:bar]我希望结果看起来像:”
attribute :bar do
object.bar.id.to_s
end
“如果bar是多态关联,我会喜欢这样的东西:”
attribute :bar do
{id: object.barable_id.to_s, schema: object.barable_type}
end
注意:我没有测试过这个。
答案 1 :(得分:0)
我找到了一种方法,可以使用BaseSerializer
这样做:
class BaseSerializer < ActiveModel::Serializer
attributes :id, :type
def id
if object.id.nil?
nil
else
object.id.to_s
end
end
def type
# I also want all the emitted objects to include a "type" field.
object.class.name
end
def self.belongs_to(key, *args, &block)
attribute key do
assoc = object.class.reflect_on_association(key)
foreign_id = object.send(assoc.foreign_key)
if foreign_id.nil?
nil
elsif assoc.polymorphic?
{
type: object.send(assoc.foreign_type),
id: foreign_id.to_s
}
else
foreign_id.to_s
end
end
super
end
end