【问题标题】:Weird LEFT OUTER JOIN on Includes eager loading of rails 3Weird LEFT OUTER JOIN on 包括急切加载 rails 3
【发布时间】:2012-07-30 03:52:50
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2011-12-17
    • 2014-08-10
    • 2015-08-05
    • 2017-12-26
    相关资源
    最近更新 更多