我試圖編寫一個接受字符串數組的Ruby方法(例如,["EG", "K", "C"]
,並返回數據庫表中的所有記錄,其中icao_code
字段以任何這些字符串(例如,KORD,EGLL和CYVR都是匹配的),陣列的長度會有所不同,並且會由用戶輸入,因此需要對其進行消毒。Ruby on Rails中的任意長度的LIKE子句ActiveRecord
如果我只是在搜索對於單個字符串,我可以執行類似於Airport.where("icao_code LIKE ?", "#{icao_start}%")
的操作。但是,由於我需要針對任意數量的字符串進行搜索,所以我不能使用該語法。 OT它的工作如下:
def in_region(icao_starts)
where_clause = icao_starts.map{|i| "icao_code LIKE '#{i}%'"}.join(" OR ")
return Airport.where(where_clause)
end
不過,我使用的是設置這樣的不受信任的用戶輸入,因爲我懷疑這將是容易受到SQL注入有點擔心。
有沒有更好的方法以更安全的方式獲得相同的結果?
結束了使用'compact'和'uniq'的。我也做了一個map {| s | s.upcase.tr {「^ A-Z」,「」)}'處理輸入小寫字母的用戶並刪除任何非字母字符。 – bogardpd