2010-11-20 7 views
2

x, y 두 개의 필드가있는 검색 양식이 있습니다.레일 일부 매개 변수가 비어있을 때 찾기

검색을 수행하면 모든 조건과 일치하는 레코드가 검색됩니다. 그러나 두 조건 중 하나라도 공백으로두면 '모두'로 설정할 수 있습니다.

params [: x] 및 params [: y]를 모두로 설정해야하는 경우 어떻게해야합니까?

params[:x] = ? unless params[:x] 
params[:y] = ? unless params[:y] 

users = User.where(["x = ? AND y = ?", params[:x], params[:y]]) 

답변

4

내가 해시 사용하여 조건을 구축 제안 : 설명에 대한

conditions = {} 
conditions[:x] = params[:x] unless params[:x].blank? 
conditions[:y] = params[:y] unless params[:y].blank? 

users = User.find(:all, :conditions => conditions) 
+0

이 메서드는 [ "x =? AND y =?", x, y] 메서드와 같은 악의적 인 의도를 방지합니까? – bmck

+0

예, SQL 인젝션으로부터 보호하지 않는 유일한 방법은 문자열을 조건에 직접 넣는 것입니다. 이 문장은 다음과 같습니다. "X = # {params [: x]}"는 SQL 삽입에 개방적입니다. [ "X =?", params [: x]] 및 {: x => params [: x]} 문은 SQL 삽입을 허용하지 않습니다. –

+1

* 모두 배열 해시 방법은 sanitize_sql 함수를 호출 : 가 http://apidock.com/rails/ActiveRecord/Base/sanitize_sql/class –

4

매우 구체적인 범위를 구성하는 대신 조건을 연결해야합니다. 조건부 존재할 수있는 매개 변수에 따라 제한을 참여 할 수

scope = User 

if (params[:x].present?) 
    scope = scope.where(:x => params[:x]) 
end 

if (params[:y].present?) 
    scope = scope.where(:y => params[:y]) 
end 

users = scope.all 

이 방법 : 당신은 슬라이딩 범위의 기술을 사용할 수 있습니다.

+0

감사합니다! – dennismonsewicz

+0

@tadman, 레일즈 2.3에서 위와 같은 작업을 수행 할 수있는 방법이 있습니까? LIKE 및보다 큼/미만의 명령문을 포함하는 조건으로 레거시 애플리케이션을 개발 중입니다. 감사! – KDP

+0

Rails 2.3에서는'find' 호출에 전달할'conditions' 인수에 추가하여이를 수행 할 수 있습니다. – tadman

관련 문제