2014-03-06 2 views
2

내 앱에서 GET을 통해 필터링 할 수 있습니다. 그래서>보다 큰 | <|보다 작음 = 연산자를 검색어로 사용합니다.

  • column (필터)
  • value (5)
  • operator (=,>, <)

:

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

는 I 쉽게로 params[:filter]을 분할 할 내 질문 후 Laptop 모델을 사용하고 기본 순서를 정한 경우 결과가 설정된 경우 필자는 필터링합니다. value 동적으로 유사한 operator를 추가 할 수있는 방법이 있다면

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 

가 궁금하네요. 특히 >=을 추가하면 <= 코드가 반복됩니다. 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 

사용하십니까? in where 쿼리는 일반적으로 좋은 연습 인 쿼리에 삽입되기 전에 매개 변수가 이스케이프되어야한다는 것을 레일스에 알려줍니다. 그러나 - 연산자 변수를 처음 sanitze/validate하면 ​​유효 문자 만 포함되어 있는지 확인하면 쿼리에 직접 삽입하는 것이 좋습니다. 레일을 알려줍니다 이유

:

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

때문에에 '>'더 이상 유효한 SQL 연산자를 탈출하지 않는> 문자.

+1

감사합니다. –

관련 문제