2012-09-11 118 views
0

我花了整整一天的時間。
我將權限存儲在postgresql數據庫的一個字段中。這裏的價值 「羅斯堡,肯德基,kcpl」 我想拆分,使查詢 SELECT * FROM發動機中plant_id在( '羅斯堡', '肯德基', 'kcpl')Rails 3.1 where子句將引號添加到sql IN子句中

def fnc_user_permissions <br/> 
    temp_var = current_user.permissions.split(",") 

    sql_perms = String.new 
    # "perm1", "perm2", "perm3" 

    temp_var.each do |pm| 

    sql_perms += (sql_perms.blank? ? pm : "', '" + pm)   

    end  

    @engines = Engine.where("plant_id in (:plant_id)", {:plant_id => sql_perms }) 
    @engines = @engines.order("name")   

end 

「 Engine.where補充說:」第二,‘單引號’,所以,而不是領

select * from engines where plant_id in ('roseburg', 'kfc', 'kcpl') 

我得到

select * from engines where plant_id in ('roseburg'', ''kfc'', ''kcpl') 

如果我編輯的每個循環這個

sql_perms += (sql_perms.blank? ? pm : ", " + pm) 

我得到

select * from engines where plant_id in ('roseburg, kfc, kcpl') 

最後我不得不這樣做:

 temp_var = current_user.permissions.split(",") 

    sql_perms = String.new 
    # "perm1", "perm2", "perm3" 

    temp_var.each do |pm| 

    sql_perms += (sql_perms.blank? ? pm : "', '" + pm)   

    @engines = Engine.find_by_sql("select * from engines where plant_id in ('#{sql_perms}') ") 

它的工作原理,但我寧願使用。凡代碼 如何使。哪裏停止任何想法添加我不想要的第二個引號?它是如此微軟!

Teedub

回答

0

您應該使用'?'將值綁定到sql語句。嘗試

Engine.where("plant_id in (#{ Array.new(temp_var.size, '?').join(',') })", *temp_var) 
1

或者說,這樣的一個SQL注入安全版將

Engine.where("plant_id in (?)", temp_var)