2010-04-24 4 views
5

안녕하세요, 저는 시스템에있는 수천 가지 무역 품목을 필터링하는 데 문제가 있습니다. 우리가 구축하고있는 시스템의 스펙에 따라 사람들은 시작 날짜를 입력하고 몇 분 안에 간격을두고 항목의 표시를 필터링 할 수있는 양식이 있어야합니다. 해당 인터벌 기간 내 모든 거래를 반환하는 도우미 함수를 작성했지만, 인덱스 페이지의 맨 위에 dateTime 값과 정수 값을 반환하는 양식을 제대로 작성하지 못했습니다.색인 페이지를 필터링하기 위해 레일 폼을 작성 하시겠습니까?

아이디어가 있으십니까? 값을 할당하기 위해 별도의 모델 객체를 만들어야합니까, 아니면 더 간단한 방법이 있습니까? 색인 페이지에서

답변

16

이 같은 필터 양식을 만들 수 있습니다

<%= form_tag '', :method => :get do %> 
    <%= text_field_tag :value_one %> 
    <%= text_field_tag :value_two %> 
    <%= submit_tag 'Filter' %> 
<% end %> 

다음 쿼리 문자열 매개 변수를 사용하여 다음 컨트롤러는 필터 매개 변수의 검색 페이지에서 GET을 할 것입니다 귀하의 형태로 그 통과되었을 수 있습니다.

+2

URL에서'& commit = Filter'를 제외하고 싶다면'<% = submit_tag 'Filter', name : nil %>'라고 쓸 수 있습니다. –

2

나는 점차 즉, 내 컨트롤러에 필터를 구축 좋아 :

def index 

    filter = [] 

    if params.has_key?("filter") 

    if !params[:filter][:user_id].blank? 
     id = params[:filter][:user_id] 
     filter << ["user_id = #{id.to_i}"] 
    end 

    if !params[:filter][:project_id].blank? 
     id = params[:filter][:project_id] 
     filter << ["project_id = #{id.to_i}"] 
    end 

    if !params[:filter][:change_type_id].blank? 
     id = params[:filter][:change_type_id] 
     filter << ["change_type_id = #{id.to_i}"] 
    end 

    end 

    @logs = LogEntry.where(filter.join(" AND ")).order('created_at DESC')  

end 

을 더 필터가보기에 선택되어 있지 않은 경우, DB 쿼리가 모든 레코드를 반환합니다 (I는 select_tag 형태 도우미를 사용).

+1

나는이 접근 방식을 좋아한다. (이것은 질문에 대한 답의 두 번째 부분이다!). 아마도'! params [...]. blank?'대신'params [...]. present? '로 약간 더 예쁘다. –

+4

실제로 필터를 점진적으로 만들 필요가 없습니다. 대신 점차적으로 결과 집합의 범위를 좁히기 위해 다양한 조건에 대한 where 문을 호출하여 점차적으로 활성 레코드 쿼리를 작성해야합니다. Rails는 LogEntry 모델을 여러 번 호출 한 경우에도 하나의 명령문에서 모든 것을 실행할 수 있습니다. – Noz

관련 문제