2013-10-27 3 views
1

한 명령을 사용하여 모든 행을 검색하고 필터하는 방법이 있습니까?레일스가 조건 매개 변수를 사용하여 메소드를 찾는다.

그래서, 지금은 조건부 논리를

if rating_filter.nil? 
    @movies = Movie.all 
else 
    @movies = Movie.find(:all, :conditions => {:rating => rating_filter}) 
end 

즉, 필드에 필터가 설정되지 않은 경우, 나는이 분야로 필터링 싶지 않아,하지만 두 번째 명령에 nil을 전달하면, 내가 얻을 것이다 :

SELECT * FROM movies WHERE rating is NULL, though I need 
SELECT * FROM movies 

하나 이상의 매개 변수가있는 경우 문제가 발생합니다. 모두가 설정되어있는 경우, 그래서 아무 문제 없습니다 :

@movies = Movie.find(:all, :conditions => {:rating => rating_filter, :date => date_filter}) 

하지만 하나 개의 필터가 설정되지 않은 경우, 내가 별도의 명령을 얻기 위해 내 논리를 분기해야합니다

if .. 
    @movies = Movie.find(:all, :conditions => {:rating => rating_filter) 
else 
@movies = Movie.find(:all, :conditions => {:date => date_filter}) 
else 
@movies = Movie.all 
end 

이 라인을 줄일 수있는 트릭이 있습니까 코드, 이상적으로 하나? =)

답변

1

난 당신이 has_scope 보석을 사용할 수 있습니다, 당신은

@movies = Movie.find(:all, :conditions => {:rating => rating_filter, :date => date_filter}.reject{|k, v| !v}) 
1

또는 해시의 거부 기능이 방법을 시도 할 수 있다고 생각합니다.

컨트롤러를 명확하고 간결하게 유지하는 데 도움이됩니다.

관련 문제