2012-06-07 94 views
0

我在軌道2 Postgres的使用活動記錄的條件有問題。我的問題是當過我嘗試使用此查詢(我使用geokit,但這不是問題)問題和Rails 2.3.5活動記錄條件IN

Table.all(:conditions => ["id IN (?)", id_array.join(",")], :origin => origin, :within => 20) 

我得到這個問題:

ActiveRecord::StatementInvalid: PG::Error: ERROR: invalid input syntax for integer: "21,28" 
LINE X: ...OM "tables" WHERE (((id IN (E'21,28... 

爲什麼把「E ''在那裏,如何擺脫它?

回答

3

隨着id_array.join(","),你傳遞一個字符串的函數。由於投入生成的SQL查詢時,所有琴絃逃脫,由單引號包圍,你自然得到了SQL錯誤,因爲在這個IN說法,你只能使用逗號分隔的整數。

的簡單的解決方案是直接傳遞數組給該函數。然後ActiveRecord自己在SQL中創建正確的值。您可以使用它像這樣:

Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20) 

另外,您也可以使用此更紅寶石般的語法,產生完全相同的SQL查詢:

Table.all(:conditions => {:id => id_array}, :origin => origin, :within => 20) 
0

我不覺得你需要加入值。即使在導軌2即人們所說的,嘗試了這一點:

Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20) 
0

試試這個:

Table.all(:conditions => ["id IN (#{id_array.join(",")})"], :origin => origin, :within => 20 
1

你已經被引導到不同的路徑。但是,爲了回答你的問題:

爲什麼把「E「」在那裏......

這是escape string syntax of PostgreSQL。 PostgreSQL的默認行爲已與9.1版本的變化,反斜槓逃逸不再解釋,除非在左單引號前的E。新行爲反映了SQL標準。

'one backslash: \' -- backslash has no special meaning in Postgres 9.1 
E'one backslash: \\' -- must use E'' syntax to interpret escape sequences 

一些客戶端發揮它的安全,把E前每字符串字面量來獲得相同的行爲,無論PostgreSQL的版本或standard_conforming_strings特別的設置。其他人向服務器詢問設置並相應地調整語法。無論採用哪種方式,只要將一個E置於不包含反斜槓的字符串前就浪費(非常少的)CPU週期。

0

我有同樣的問題與MySQL試圖運行count()函數和語法我來修復它是

Issue.all(:conditions => "status_id IN (5, 15, 19, 21, 25)").count