为ActiveModel :: Serializer关联使用备用关联ID

时间:2015-09-11 16:02:58

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

我有一个应用,其中我有正常的ActiveRecord ID以及在外部规范数据库中唯一的唯一字段(例如ident)。模型看起来像:

class Parent
  has_many :childs, foreign_key: :parent_ident, primary_key: :ident
end

class Child
  belongs_to :parent, foreign_key: :parent_ident, primary_key: :ident
end

出于各种原因,我希望我的Rails API的使用者使用规范ID(例如ident)而不是app上定义的ID。所以我已经定义了我的序列化程序(使用ActiveModel::Serializer):

class ParentSerializer < ActiveModel::Serializer
  attributes :id, :ident, :other, :stuff
  has_many :children

  def id
    object.ident
  end
end

class ChildSerializer < ActiveModel::Serializer
  attributes :id, ident, :parent_ident, :things

  def id
    object.ident
  end
end

问题是正确生成的JSON使用我的重写ID作为顶级属性,但child_ids字段中的ID是本地ID而不是我想要使用的规范标识。

{
  parents: [
    {
      id: 1234, // overridden correctly in AM::S
      ident: 1234,  
      other: 'other',
      stuff: 'stuff',    
      child_ids: [ 1, 2, 3 ], // unfortunately using local ids
    }
  ],
  childs: [
    {
      id: 2345, // doesn't match child_ids array
      ident: 2345, 
      parent_ident: 1234,
      things: 'things'
    }
  ]
}

问题:有没有办法让父级序列化程序使用它的ident字段关联而不是默认的id字段?

我尝试在def child_ids中放置ParentSerializer但没有成功。

我正在使用Rails 4.2和active_model_serializers gem的9.3版本。

1 个答案:

答案 0 :(得分:0)

您可以根据docs

为关联指定自定义序列化程序
has_many :children, serializer: ChildSerializer