アクティブモデルリソース内で直列化されたアソシエーションのレベルを制限することに問題があります。例えば制限アソシエーションアクティブモデルシリアライザのカスケード
:
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
'object.association(:comments).loaded?'これは私が探していたものです。ありがとう!私はこの方法が受け入れられた答えよりもきれいだと思います。 active_model_serializerドキュメントからは、n + 1個のクエリを避けるためにコントローラに結合またはインクルードを使用して関連付けを含めることが推奨されています。私が困惑したところでは、連合体がロードされたかどうかを判断する方法やシリアライザを省略する方法がシリアライザにありました。 文書から: "ActiveRecordを使用している場合、必要に応じてクエリのインクルードまたは結合を使用する場合など、データが最適な方法でロードされるようにn + 1クエリを避けるようにしてください。" – Mark
どこから呼び出す必要がありますかインクルード_コメント?方法? – Kaspar