0

私はこれに丸一日を費やしました。
postgresql db の 1 つのフィールドにパーミッションを保存します。ここで、値は「roseburg、kfc、kcpl」です。これを分割して、クエリで * プラント ID が ('roseburg', 'kfc', 'kcpl') のエンジンから選択されるようにします。

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」は 2 番目の「一重引用符」を追加するため、取得する代わりに

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}') ")

それは機能しますが、私は.whereコードを使用したいと思います.whereを作成する方法に関するアイデアはありませんか?さすがマイクロソフト!

ティーダブ

4

2 に答える 2

1

または、これの SQL インジェクション セーフ バージョンは次のようになります。

Engine.where("plant_id in (?)", temp_var)
于 2013-01-02T18:09:23.440 に答える
0

「?」を使用する必要があります。値をSQLステートメントにバインドします。試す

Engine.where("plant_id in (#{ Array.new(temp_var.size, '?').join(',') })", *temp_var)
于 2012-09-11T17:52:48.950 に答える