2016-11-04 2 views
0

ActiveModelSerializer 0.10を使用しています。私はAccountのコレクションを持っています。コレクションの各モデルに特定のシリアライザを設定する方法はありますか?私のコントローラは次のようなものを返します:各モデルのシリアライザが異なるアクティブモデルシリアライザ

{"accounts": 
    [ 
    {"type":"Group","groupname":"A group","internal_info":"Sensitive info"}, 
    {"type":"User","first_name":"Bob","last_name":"Smith","internal_info":"Sensitive info"} 
    ] 
} 

私のAPIは、ユーザーAPIと管理APIの2つの部分に分かれています。ユーザーAPIは、ActiveModelSerializerが自動的に検出する標準シリアライザを使用します。この

render json: @accounts 

のようなものは、これを返す(その機密情報に注意してください含まれていません)になります。

{"accounts": 
    [ 
    {"type":"Group","groupname":"A group"}, 
    {"type":"User","first_name":"Bob","last_name":"Smith"} 
    ] 
} 

管理APIは、カスタムシリアライザを使用しています(彼らは、例えばinternal_infoのために、より多くの詳細が含まれます)。どのように私の管理APIでそのようなコレクションをレンダリングできますか?私はほとんどの場合、完璧に動作

render json: @accounts, each_serializer: Admin::AccountSerializer 

を使用することができます知っているが、この特定のケースでは、私はAccount秒の2種類があります。何とかコレクション内のオブジェクトがGroupの場合はAdmin::Account::GroupSerializer、コレクションの場合はAdmin::Accounts::UserSerializerUserのオブジェクトに使用できますか?

答えて

0

私はAdmin::AccountSerializerと条件を使用して終了しました。より良いソリューションは大歓迎です。

class AccountSerializer < ActiveModel::Serializer 
    attribute :groupname, if: :a_group? 

    attribute :first_name, if: :a_user? 
    attribute :last_name, if: :a_user? 

    def a_group? 
    object.class == Group 
    end 

    def a_user? 
    object.class == User 
    end 
end 
関連する問題