2

アクティブ レコードのバグかどうかはわかりません。または、 .includes を実行して LEFT OUTER JOIN 戦略を明示的に無効にする方法はありますか。これが私のケースです:

キーワードが「ドット」のない「abc」の場合

Post.where(:name => "abc").includes(:author)

通常使用される 2 つの SQL があります。

Post Load (0.8ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`name` = 'abc'
Author Load (0.4ms)  SELECT `authors`.* FROM `authors` WHERE `authors`.`id` IN (1)

キーワードが「abc」だとします。「ドット」で

Post.where(:name => "abc.").includes(:author)

SQLはLEFT OUTER JOIN戦略を使用していますが、これは紛らわしいです。

SELECT `posts`.`id` AS t0_r0, `posts`.`name` AS t0_r1, `posts`.`author_id` AS t0_r2, `posts`.`created_at` AS t0_r3, `posts`.`updated_at` AS t0_r4, `authors`.`id` AS t1_r0, `authors`.`created_at` AS t1_r1, `authors`.`updated_at` AS t1_r2 
FROM `posts` LEFT OUTER JOIN `authors` ON `authors`.`id` = `posts`.`author_id` 
WHERE `posts`.`name` = 'abc.'

関連付けに条件がある場合、LEFT OUTER JOIN 戦略を使用してインクルードを使用した熱心な読み込みが実現されることを知っています。

Post.includes(:author).where(:authors => {:name => 'zhougn' })

しかし、私のテストケースでは、そのような条件はありません。基本的に、Multi-SQL 戦略と LEFT OUTER JOIN 戦略の両方で正しい結果が得られますが、投稿と作成者が異なるデータベースに格納されている場合、LEFT OUTER JOIN 戦略は失敗します。

4

1 に答える 1