2012-05-07 34 views
0

今天早上我切換到postgresql,現在我的選擇不再工作了。Postgresql WHERE子句添加''左右?

我所試圖做的是超級簡單:

shirt_ids = "1,5,6" # String generated by javascript 
Shirt.where("id in (?)", shirt_ids) 

這給了我:

PG::Error: ERROR: invalid input syntax for integer: "1,5,6" 
LINE 1: SELECT "shirts".* FROM "shirts" WHERE (id in ('1,5,6')) 

這工作雖然:

Shirt.where("id in (#{shirt_ids})") 

但大家都知道是不安全的。使用

林:

pg (0.13.2 x86-mingw32) 
rails (3.2.2) 

PostgreSQL數據庫的最新版本,今天早上我安裝了它。

謝謝你的幫助。 ^

回答

6

我相信Postgres期待一個數組,而不是IN函數的字符串。如果您將您的字符串數組,它應該工作:

shirt_ids = "1,5,6" 
Shirt.where('id in (?)', shirt_ids.split(',')) 

而且,你能做到這一點,這看起來有點清潔:

Shirt.where(:id => shirt_ids.split(',')) 
+0

謝謝你的快速幫助:) – KimJongIl

+0

也許有點太快...我意識到我的原始答案'有效',但實際上只返回一個對象。相應地編輯,這個應該沒問題。 – MrTheWalrus

+2

更準確地說,ActiveRecord在SQL代碼片段中看到一個'?',並將一個String作爲值,然後將該Ruby字符串轉換爲SQL字符串文字'1,2,3'。我認爲'shirt_ids.split(',')。map(&:to_i)'會更安全。 –