所以,在我的rails应用程序中,我开发了一个搜索过滤器,我正在使用滑块。例如,我想显示价格介于 min 值和 max 之间的订单,该值来自params中的滑块。我的数据库中有一列名为" price"和params [:priceMin],params [:priceMax]。所以我不能写出类似MyModel.where(params)...
的东西。你可能会说,我应该做MyModel.where('price >= ? AND price <= ?', params[:priceMin], params[:priceMax])
之类的事情,但是有一个问题:搜索条件的数量取决于用户的需求,因此我不知道传递给查询的params哈希的大小。有什么方法可以解决这个问题吗?
更新
我已经这样做了
def query_senders
query = ""
if params.has_key?(:place_from)
query += query_and(query) + "place_from='#{params[:place_from]}'"
end
if params.has_key?(:expected_price_min) and params.has_key?(:expected_price_max)
query += query_and(query) + "price >= '#{params[:expected_price_min]}' AND price <= '#{params[:expected_price_max]}'"
end...
但是根据ruby指南(http://guides.rubyonrails.org/active_record_querying.html),由于SQL注入危险,这种方法很糟糕。
答案 0 :(得分:1)
您可以通过params.count
获取params散列的大小。按照你描述的方式,你似乎仍然知道用户可以传递可以的参数。因此,只需检查它们是否存在,并相应地拆分查询。
编辑:
def query_string
return = {}
if params[:whatever].present?
return.merge({whatever: #{params[:whatever]}}"
elsif ...
end
以上内容将形成您正在搜索的所有确切值的哈希值,从而避免SQL注入。然后对于价格这样的过滤器,你可以检查这些值是否格式正确(仅限数字),只有这样才能执行。