2014-03-06 44 views
2

我的應用程序允許通過GET進行篩選。動態插入大於> |小於<|等於=運營商到查詢

www.mysite.com/rating=5 
www.mysite.com/rating>5 
www.mysite.com/rating<5 

我很容易分裂params[:filter]成:

  • column(過濾器)
  • value(5)
  • operator(=,>,<)

所以在我查詢了我的之後10模型,並做了一些基本的排序,如果設置,我過濾結果。

if params[:filter] != "all" 
    . 
    . 
    case operator 
    when "=" 
     laptops = laptops.where("laptops.rating = ?", value) 
    when ">" 
     laptops = laptops.where("laptops.rating > ?", value) 
    when "<" 
     laptops = laptops.where("laptops.rating < ?", value) 
    end 
end 

我想知道是否有什麼辦法可以添加operator動態類似value。特別是當我添加>=,<=代碼重複5次

我想:

laptops.where("laptops.rating ? ?", operator, value) 

但是這增加了運營商作爲一個字符串,這自然導致了錯誤

Syntax Error: near "laptops.rating '>' '6'"

任何想法如何,我可以讓我的代碼越幹?

使用PostgreSQL

回答

1

你可以嘗試:

if params[:filter] != "all" 
    . 
    . 
    # if statement that makes sure operator is one of your valid operators 
    if ["<",">",">=","<=","="].include? operator 
    laptops = laptops.where("laptops.rating #{operator} ?", value) 
    end 

end 

使用?在where查詢告訴rails該參數在插入查詢之前應該被轉義,這通常是很好的做法。但是,如果您首先清理/驗證操作符變量以確保它只包含有效字符,那麼您應該將其直接插入到查詢中。

這就是爲什麼鐵軌告訴你:

Syntax Error: near "laptops.rating '>' '6'" 

因爲那裏逃脫了「>」,並不再是一個有效的SQL操作>字符。

+1

偉大的建議,謝謝! –