在ActiveModel序列化程序中包含嵌套关联的ID

时间:2017-02-06 18:33:36

标签: ruby-on-rails json active-model-serializers

在某些情况下,嵌套关联嵌入在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精度浮动点!)。

我该怎么做?我没有找到任何相关的信息。

2 个答案:

答案 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