2013-05-01 10 views
12

アクティブモデルリソース内で直列化されたアソシエーションのレベルを制限することに問題があります。例えば制限アソシエーションアクティブモデルシリアライザのカスケード

Aのゲームは、多くの選手

class GameSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :teams 
end 

class TeamSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :players 
end 

class PlayerSerializer < ActiveModel::Serializer 
    attributes :id, :name 
end 

を持っている多くのチームが、私はチームのためにJSONを取得した場合には、必要に応じて、それは、サブアレイ内のすべてのプレーヤーが含まれています。

ゲーム用のJSONを取得すると、すべてのチームがサブアレイに含まれています(優れていますが、各チームのすべてのプレイヤーも含まれます)。これは予想される動作ですが、関連のレベルを制限することは可能ですか?ゲームはプレイヤーのないシリアライズされたチームだけを返しますか?その後

class ShortTeamSerializer < ActiveModel::Serializer 
    attributes :id 
end 

class GameSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :teams, serializer: ShortTeamSerializer 
end 

または定義することができますが、include_teams?GameSerializerに:

class GameSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :teams 

    def include_teams? 
    @options[:include_teams] 
    end 
end 

答えて

12

別のオプションは、Railsの熱心を乱用することであるあなたが別のSerializer作成することができます

+0

'object.association(:comments).loaded?'これは私が探していたものです。ありがとう!私はこの方法が受け入れられた答えよりもきれいだと思います。 active_model_serializerドキュメントからは、n + 1個のクエリを避けるためにコントローラに結合またはインクルードを使用して関連付けを含めることが推奨されています。私が困惑したところでは、連合体がロードされたかどうかを判断する方法やシリアライザを省略する方法がシリアライザにありました。 文書から: "ActiveRecordを使用している場合、必要に応じてクエリのインクルードまたは結合を使用する場合など、データが最適な方法でロードされるようにn + 1クエリを避けるようにしてください。" – Mark

+2

どこから呼び出す必要がありますかインクルード_コメント?方法? – Kaspar

8

レンタルする関連付けを決定するための読み込みDER:あなたのレールコントローラで

:AMSの土地で、その後

def show 
    @post = Post.includes(:comments).find(params[:id]) 
    render json: @post 
end 

class PostSerializer < ActiveModel::Serializer 
    attributes :id, :title 
    has_many :comments, embed: :id, serializer: CommentSerializer, include: true 

    def include_comments? 
    # would include because the association is hydrated 
    object.association(:comments).loaded? 
    end 
end 

おそらくないきれいな解決策が、それは私のためにうまく動作します!

+0

ありがとうパブロ、これは私がやったことです...私はそれをrails-y、モデリング:インデックスと:複数化を表示しようとしましたが、 'TeamsSerializer'と' TeamSerializer'を持っています。特別なケースは別のシリアライザを手に入れます。 –

+4

@optionsはどこから来たのですか? – Samnang