我不确定这是否是活动记录错误。或者有没有办法做 .includes 并明确禁用 LEFT OUTER JOIN 策略。这是我的案例:
给定关键字是没有“点”的“abc”
Post.where(:name => "abc").includes(:author)
正常使用两个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 策略都可以给我正确的结果,但是当 Posts 和 Authors 存储在不同的数据库中时,LEFT OUTER JOIN 策略会失败。