我的应用允许通过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
我想知道是否有任何方法可以动态添加operator
与value
类似。特别是当我添加>=
时,<=
代码重复 5次!
我试过了:
laptops.where("laptops.rating ? ?", operator, value)
但是这会将运算符添加为字符串,这自然会导致错误
Syntax Error: near "laptops.rating '>' '6'"
任何想法如何让我的代码更干?
使用postgresql
答案 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运算符。