动态插入大于> |小于< |将=运算符等于查询

时间:2014-03-06 13:22:03

标签: ruby-on-rails

我的应用允许通过GET进行过滤。

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

我可以轻松地将params[:filter]拆分为:

  • column(过滤器​​)
  • value(5)
  • operator(=,&gt;,&lt;)

因此,在查询了我的Laptop模型并进行了一些基本排序后,我会设置过滤结果。

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

我想知道是否有任何方法可以动态添加operatorvalue类似。特别是当我添加>=时,<=代码重复 5次

我试过了:

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

但是这会将运算符添加为字符串,这自然会导致错误

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

任何想法如何让我的代码更干?

使用postgresql

1 个答案:

答案 0 :(得分: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

使用?在一个查询告诉rails的参数应该在插入查询之前进行转义,这通常是一种很好的做法。但是 - 如果您首先清理/验证操作符变量以确保它只包含有效字符,您应该将其直接插入查询中。

这就是rails告诉你的原因:

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

因为&gt;转义为'&gt;'的字符并且不再是有效的SQL运算符。