2012-02-03 1 views
0

사용자가 midi 레코드 데이터베이스를 검색하고 내가 지정한 속성에 해당하는 midi 파일을 찾을 수 있도록 레일스 응용 프로그램을 만들고 있습니다. 예를 들어 사용자는 name = "blah"composer = "buh"및 difficult = "insane"인 midi 파일의 html 형식으로 데이터를 입력 할 수 있습니다. 이것은 사용자가 필드에 대한 데이터를 입력하지 않을 때 데이터베이스에서 select 문을 수행 할 때 해당 필드가 무시된다는 점을 제외하고는이 모든 것이 훌륭합니다. 예상대로이 작동빈 문자열 매개 변수가 무시되도록 레일스 데이터베이스 쿼리 구성

@midis=Midi.where(:name => params[:midi][:name], 
        :style => params[:midi][:style], 
        :numparts => params[:midi][:numparts], 
        :composer=> params[:midi][:composer], 
        :difficulty => params[:midi[:difficulty]) 

하지만, 예를 들어 그/그녀가 빈 :composer을 떠나면, 작곡가 필드가 전혀 고려되지해야합니다 는 지금이 나의 선택 문이 모습입니다. 이것은 아마도 간단한 구문 일이지만 나는 그것에 어떤 페이지를 찾을 수 없습니다.

대단히 감사합니다. Arel가 직접 지원하는 경우,하지만 당신은 언제나처럼 뭔가를 할 수

답변

3

확실하지 :

conditions = { 
    :name => params[:midi][:name], 
    :style => params[:midi][:style], 
    :numparts => params[:midi][:numparts], 
    :composer=> params[:midi][:composer], 
    :difficulty => params[:midi[:difficulty] 
} 

@midis=Midi.where(conditions.select{|k,v| v.present?}) 
+0

감사합니다! 이것은 내 문제를 해결합니다! 먼저 해시 설명서를 살펴 보았어야합니다. – BBB

1

이 시도 :

# Select the key/value pairs which are actually set and then convert the array back to Hash 
c = Hash[{ 
    :name  => params[:midi][:name], 
    :style  => params[:midi][:style], 
    :numparts => params[:midi][:numparts], 
    :composer => params[:midi][:composer], 
    :difficulty => params[:midi][:difficulty] 
    }.select{|k, v| v.present?}] 

Midi.where(c) 
+0

감사! 이것은 잘 작동한다. – BBB

관련 문제