2012-07-30 43 views
2

我不确定它是否为活动记录错误。 还是有办法做,明确地包含和禁用左外部连接策略。 这里是我的情况:奇怪的左外连接包括急切的导轨加载3

鉴于关键字是 'ABC' 没有 '点'

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

有作为正常

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) 

鉴于关键字设置两个sql语句是“ABC。 “用'点'

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

该SQL使用左外部连接策略,这是令人困惑。

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

我有同样的问题:http://stackoverflow.com/questions/16095252/rails-find -method-select-columns-from-include-table-parameter/ – user1322092 2013-04-19 02:47:43

+1

see here http://stackoverflow.com/questions/5199235/activerecord-query-changing-when-a-dot-period-is-in-condition-值 – user1322092 2013-04-19 02:54:29

回答

0

是的,这是一个错误。问题#950:ActiveRecord query changing when a dot/period is in condition value。在Rails 4中修正了这个问题,通过不赞成使用这个特性(没有解决办法,除了做不同的事情,并且要求程序员在他们想要一个左外连接的时候是明确的 - 以及引用了哪些表与包含使用字符串条件时)。

我现在的解决办法脏(用Rails 3)是编码/解码点是这样的:

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