質問クラス has_many Choices。いくつかの属性値 (通常は id) で選択肢を見つける必要があります。
明確にするために:親レコード(質問)はさまざまなオブジェクトとメソッドに渡され、さまざまな属性と値を使用して子を検索します。
できますquestion.choices.find(choice_id)
が、これは毎回 SQL クエリを生成します。
通常、質問にはほんの一握りの選択肢しかなく、1 つの親レコードに対してさまざまな検索が行われることを知っているので、関連付け全体を読み込んで Ruby で検索する方が安くなると思います。
question.choices.detect{|choice| choice.id == some_choice_id}
Detect は Enumerable から来ており、Rails が最初の呼び出しで関連付けをロードするように強制します (その後の検索ではキャッシュされたデータを使用します)。これは熱心な読み込みでもうまく機能します。Question.all(include:choices) を実行すると、ツリー全体が 2 つのクエリで読み込まれ、検索が非常に高速になります。とはいえ、よく読めません。
検索をシミュレートしたい場合は、さらに毛むくじゃらになります! 行動:
question.choices.detect{|choice| choice.id == choice_id} or raise ActiveRecord::RecordNotFound.new
これはまさに私が望んでいることです。より良い構文を探しているだけです。
Rails は、このように動作するある種の動的ファインダーを提供しますか (最初のクエリで関連付け全体を強制的にロードし、次にこのプリロードされたセットを検索します)?