2011-06-19 30 views
1

我想構建一個微型引擎,將允許通過用戶輸入在飛行中建立一個搜索查詢。我得到的列名,並在PARAMS搜索字符串,讓我們假設:ActiveRecord:SQL注入阻力wheres

params = {:filter_column => "column_name", :filter_string => "search term"} 

我知道,如果我只是調用一個標準的排序,其中對我的模型,可以將沿着線:

ModelName.where("column_name LIKE ?", params[:filter_string]) 

我遇到的問題是我試圖編譯我的過濾器列表,然後將它們一次應用於搜索。在我調用where方法之前,我可以建立where字符串嗎?

我已經試過:

ModelName.where("? LIKE ? ", column_name, search_term) 

沒有多少運氣。任何提示,提示或指針?

謝謝!

回答

2

你可能想嘗試使用Metawhere Gem

我是一個解決方案想是這樣的:

Model.where(params[:filter_column].intern.matches => params[:filter_string]) 

,你可以建立在它自己的病情每一個順序用逗號或後續調用分離s到哪裏。

+0

這爲我做了詭計。允許更精細的穀物控制是至關重要的。另外,我覺得有點骯髒打字任何SQL ...在這種情況下,「喜歡」... – jaydel

+0

是的我沒有使用metawhere足夠在我自己的代碼中,但即使對於小事情也是非常好的。同樣的傢伙最近也出現了'squeel'這似乎是一個進化 - 還沒有看過它,但只是fyi。 – MissingHandle

-1

如果只有你可以改變的column_name的內容(即沒有注射的風險)有沒有危害,使用

ModelName.where("`#{column_name}` LIKE ?", search_term)