2015-09-11 3 views
0

У меня есть приложение, где есть нормальные ActiveRecord идентификаторы, а также уникальное поле (например, ident), которое уникально на внешней, канонической базе данных. Модель выглядит следующим образом:Использовать альтернативный идентификатор ассоциации для ActiveModel :: Ассоциация Serializer

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 использовать канонические идентификаторы (например, ident) не идентификаторы, определенные в приложении. Так я определил мои сериализаторы (с использованием 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 генерируется правильно использует мои перегруженные идентификаторы для атрибутов верхнего уровня, но идентификаторы в child_ids областей являются местными идентификаторами не канонические иенты, которые я хочу использовать.

{ 
    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 и 9.3 версию драгоценного камня active_model_serializers.

ответ

0

Вы можете задать пользовательские сериализаторы для ассоциаций согласно docs

has_many :children, serializer: ChildSerializer 
+0

Спасибо. Я не верю, что это проблема (правильный «ChildSerializer» используется без указания его), так как проблема заключается в рендеринг родительского элемента его дочерних элементов (а не в том, что он делает сам ребенок). В принципе, это 'child_ids: [id1, id2, id3]' должно быть 'child_ids: [ident1, ident2, ident3]'. – GSP

+0

Вы всегда можете сделать это в базе данных, а затем просто сериализовать вывод как есть. SELECT ident AS id ... просто плевать идеи сгибания ... Вы можете делать логику в методах сериализации, у вас есть контекст вызывающего? – penner

Смежные вопросы