2012-07-30 57 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(".", "˙"))