奇怪的LEFT OUTER JOIN包括急切的铁轨装载3

时间:2012-07-30 03:52:51

标签: ruby-on-rails-3 activerecord eager-loading

我不确定它是否是一个活跃的记录错误。 或者有没有办法。明确地包含和禁用LEFT OUTER JOIN策略。 这是我的案例:

鉴于关键字是'abc'而没有'dot'

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

有两个sqls正常使用

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策略将失败。

1 个答案:

答案 0 :(得分:0)

是的,这是一个错误。问题#950:ActiveRecord query changing when a dot/period is in condition value。在Rails 4中修复了它,通过弃用挂起来的功能(没有解决方案,除了做不同并要求程序员在需要左外连接时显式 - 以及引用哪些表)当使用带有包含的字符串条件时。

我当前的脏解决方法(在Rails 3中)是对这些点进行编码/解码:

.where("posts.name = REPLACE(?, '˙', '.')", somename.gsub(".", "˙"))