クエリ チェーンのどこかに SQL 結合があり、さらに別の時点で同じ結合を必要とする条件を追加する必要があるシナリオがありますが、この時点ではその結合が既にスコープに存在するかどうかはわかりません. 例えば:
@foo = Foo.joins("INNER JOIN foos_bars ON foos_bars.foo_id = foos.id")
....
@foo.joins(:bars).where(bars: { id: 1 })
これにより、重複するテーブル/エイリアス名に関する SQL エラーが生成されます。
最初のインスタンスで SQL 結合を手動で記述する理由は、従来の Rails AREL 結合が 2 つの INNER JOINS を生成するため、効率を向上させるためです。私の場合は 1 つだけが必要です。
これを回避する推奨される方法はありますか? たとえば、現在スコープ内にある結合を検査する方法。
コメントへの返信:
リレーションシップを使用すると、 has_and_belongs_to_many
Rails は次のINNER JOINS
ような2 つを生成します。
SELECT "journals".* FROM "journals"
INNER JOIN "categories_journals"
ON "categories_journals"."journal_id" = "journals"."id"
INNER JOIN "categories"
ON "categories"."id" = "categories_journals"."category_id"
WHERE "categories"."id" = 1
私は代わりにこれを行うことができると信じています:
SELECT "journals".* FROM "journals"
INNER JOIN "categories_journals"
ON "categories_journals"."journal_id" = "journals"."id"
WHERE "categories_journals"."category_id" = 1
私が間違っている場合は修正してください。