我不确定它是否是一个活跃的记录错误。 或者有没有办法。明确地包含和禁用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策略将失败。
答案 0 :(得分:0)
是的,这是一个错误。问题#950:ActiveRecord query changing when a dot/period is in condition value。在Rails 4中修复了它,通过弃用挂起来的功能(没有解决方案,除了做不同并要求程序员在需要左外连接时显式 - 以及引用哪些表)当使用带有包含的字符串条件时。
我当前的脏解决方法(在Rails 3中)是对这些点进行编码/解码:
.where("posts.name = REPLACE(?, '˙', '.')", somename.gsub(".", "˙"))