次のようなactiverecordの結果を返す関数があります。
def athlete_statistics(game_id)
athletes.includes(:statistics).where('statistics.game_id = ?', game_id)
end
これにより、すべてのアスリートと特定のゲームの統計が返されます。ただし、そのゲームの統計がない選手は削除されるので、含めてもらいたいと思います。
私は次のように問題を解決しようとしました:
def athlete_statistics(game_id)
athletes.includes(:statistics).where('statistics.game_id = ?', game_id) | athletes
end
これにより、行方不明のアスリートが最後に追加され、適切な結果セットが返されますが、to_json
結果を呼び出すと次のようになります。
<%= @games.first.athlete_statistics.to_json(
:include => [:user, :statistics => {:include => :attribute}]
).html_safe %>
where条件を無視して、そのアスリートのすべての統計をロードしようとします(関連付けがヌルの場合、遅延ロードを試行するため、推測しています)
これについてもっと良い方法はありますか?
アップデート:
このアプローチは機能しません
athletes.includes(:statistics).where('statistics.game_id = ? OR statistics.game_id IS NULL', game_id)
他のゲームに関連する統計を持つすべてのアスリートを除外するため。によって提供される包括的左外部結合が必要include
です。