活动模型序列化程序 - 定制适配器

时间:2015-08-07 09:46:50

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

我想使用活动模型序列化器重构现有的rails API。

不幸的是,现有的API使用的JSON模式与现有的任何适配器略有不同,而且我无法使用AMS重新创建它。

我想重新创建的架构是这样的:

{
  "status": 0,
  "message": "OK",
  "timestamp": 1438940571,
  "data": {
    "contacts": [
      {
        "contact": {
          "id": "1",
          "first_name": "Kung Foo",
          "last_name": "Panda",
          "created_at": "2015-07-23T14:09:20.850Z",
          "modified_at": "2015-08-04T15:21:36.639Z"
        }
      },
      {
        "contact": {
          "id": "2",
          "first_name": "Johnny",
          "last_name": "Bravo",
          "created_at": "2015-07-23T14:09:20.850Z",
          "modified_at": "2015-08-04T15:21:36.639Z"
        }
      }
    ]
  }
}

我想知道有没有办法为活动模型序列化器创建自定义适配器,或以其他方式创建此架构。

1 个答案:

答案 0 :(得分:0)

可以使用几个序列化程序。

class MessageSerializer < ActiveModel::Serializer
  attributes :status, :message, :timestamp, :data
  # We could've just used that, were it not for nested hashes
  # has_many :contacts, key: :data

  attributes :data

  def data
    ActiveModel::ArraySerializer.new(object.contacts, root: 'contacts')
  end
end

class ContactSerializer < ActiveModel::Serializer
  attributes :id, :first_name, :last_name, :created_at, :modified_at

  def root
    'contact'
  end
end

似乎没有更好的方法来做到这一点

然后在你控制器的某个地方:

render json: Message.serializer.new(@message, root: false)