私はこれを正確に知りませんが、あなたがやろうとしていることはおそらく推奨されていません。つまり、Rails の規則の 1 つに違反しています。関連する質問のこの回答によると、このようなクエリのデフォルトの動作は、次のような 2 つのクエリを使用することです。
SELECT "cars".* FROM "cars";
SELECT "inspections".* FROM "inspections" WHERE "inspections"."car_id" IN (1, 2, 3, 4, 5);
この決定は、パフォーマンス上の理由から行われました。これは、クエリの正確なタイプ (JOIN または複数のクエリ) は、信頼できない実装の詳細であると推測します。この一連の考えに沿って進むと、ActiveRecord::Relation はおそらくあなたのユース ケース向けに設計されたものではなく、おそらくON
クエリに条件を追加する方法はありません。
この一連の推測に沿って、ユース ケースがユニークであると本当に信じている場合は、次のように独自の SQL クエリを作成することをお勧めします。
Car.joins(sanitize_sql_array(["LEFT OUTER JOIN inspections ON inspections.car_id = cars.id AND inspections.month = ?", "2013-04-01"])
(更新: これは昨年尋ねられたもので、適切な回答が得られませんでした。)
代替案 1
カルロス・ドリューが示唆したように、
@cars = Cars.all
car_ids = @cars.map(&:id)
@inspections = Inspection.where(inspections: {month: '2013-04-01', car_id: car_ids})
# with scopes: Inspection.for_month('2013-04-01').where(car_id: car_ids)
ただし、car.inspections
不要な SQL 呼び出しをトリガーしないようにするために、次のことも行う必要があります。
# app/models/car.rb
has_many :inspections, inverse_of: :car
# app/models/inspection.rb
belongs_to :car, inverse_of: :inspections
代替案 2
おそらく、当月の検査をキャッシュする方法を見つけることができます。そうすれば、熱心な読み込みについて心配する必要はありません。キャッシュはさまざまな場所で再利用できるため、これが最適なソリューションである可能性があります。
@cars = Cars.all
@cars.each do |car|
car.inspections.where(month: '2013-04-01')
end