2

我不确定这是否是活动记录错误。或者有没有办法做 .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 策略会失败。

4

1 回答 1

0

是的,这是一个错误。问题 #950:当点/句点处于条件值时 ActiveRecord 查询发生变化。在 Rails 4 中修复,它似乎通过弃用被挂断的特性(没有解决方案,除了做不同的事情并要求程序员在他们想要左外连接时明确 - 以及引用哪些表当使用包含包含的字符串条件时)。

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

.where("posts.name = REPLACE(?, '˙', '.')", somename.gsub(".", "˙"))
于 2014-07-02T21:32:33.170 回答