2012-04-25 127 views
0

Ruby on Rails教程的作者說他很樂意在文本中獲得錯誤報告,但是他立刻繼續說他並不真的期望有任何錯誤,所以請不要直接向他報告。不過,我相信我可能會發現這樣的錯誤。在代碼的3.2版的教程的上市11.44以下的方法被定義:Ruby on Rails 3.2教程第11章中的SQL插值錯誤?

def self.from_users_followed_by(user) 
    followed_user_ids = user.followed_user_ids.join(', ') 
    where("user_id IN (?) OR user_id = ?", followed_user_ids, user) 
    end 

該方法的第一行產生一個字符串,與呼叫加入()。第二行將該字符串插入到SQL WHERE子句的IN部分的括號內的佔位符中。我沒有用默認的SQLite驅動測試這個,因爲我遵循了作者的高級練習指令,並轉而使用PostgreSQL作爲測試和開發環境。通過PostgreSQL驅動程序,佔位符替換機制檢測到該佔位符的替換變量是一個字符串值,並將該值與SQL預期用於字符串值的周圍單引號標記一起插入。所以產生的WHERE子句以「WHERE user_id IN ('...') OR ...」出現。 user_id列是一個INT列,因此這被拒絕(至少在PostgreSQL中)。這個問題在後面的文本中通過使用子查詢的方法的變體實現來消除,但是作者明確地說,在添加上面引用的失敗代碼之後,測試套件中的所有驗證都應該通過。

如果作者正在監視這個論壇上關於本教程的bug報告,最好能得到一個迴應,確認這是否確實是一個錯誤,甚至可能糾正錯誤。 :-)

謝謝!

[PS:作者指導讀者在這裏報告錯誤,使用標籤「的Ruby-on-軌」和「教程」,但等不允許使用「教程」標籤]

+0

讓我知道如果我的解決方案爲你工作,並請勾選/如果有用的話投票。那*是*的要點。 – Jonathan 2012-04-26 11:28:53

回答

0

要解決這個問題,你可以使用:

def self.from_users_followed_by(user) 
    followed_user_ids = user.followed_user_ids 
    where((['user_id = ?'] * followed_user_ids.size).join(' OR '), *followed_user_ids) 
    end 

這將建立很多user_id = ? OR的依附對數組的大小的查詢,將在INT PostgreSQL所應該是快樂的,以適應通過。

+0

感謝您的信息。然而,正如我在我的OP中指出的那樣,我並沒有真正尋找bug的解決方法(本教程本身提供了一種使用子查詢的更好方法,它可以避免該錯誤)。我所追求的是一種讓教程的作者知道錯誤在那裏的方法,所以它可以被修復,讀者在我之後不會花費盡可能多的時間,因爲我試圖找出什麼是錯誤的破碎。 – 2012-04-27 18:48:26

+0

如果它解決了這個錯誤,它就解決了你的問題,如果它是一個問題,它就有正確和錯誤的答案,並且這些答案被投票或選擇。只是說這個地方不是一個SEO慈善機構,這裏給出的建議是有原因的。在反對指導方針的問題上你失去了我的贊同 – Jonathan 2012-04-27 18:53:48

相關問題