2012-09-11 69 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)