2012-03-12 2 views
0

다소 간단한 문제의 해결책을 찾았지만 좋은 설명을 찾을 수 없었습니다.보기에서 열 필터 옵션을 추가하는 방법 ("레일 방식"으로 수행)

  • 형태가 새로운 요소와
  • (will_paginate 사용) 기존의 요소의 페이지가 매겨진 목록을 입력 :

    내가 현재 가지고있는 (작업)이 포함 된 인덱스이다.

목록의 경우 데이터의 일부분에만 관심이 있으므로 필터 옵션이있는 양식을 추가하려고하는데 양식 콘텐츠를 쿠키로 저장하고 싶습니다. 데이터베이스에 저장된 사용자 개체,하지만 아직 사용자가 없습니다). 내가 알아낼 수없는 것은 쿠키에 저장된 양식에서 값을 가져 오는 방법 (또는 그 반대)과 will_paginated와 함께 사용하는 방법입니다.

첫 번째 단계로 수행하려는 작업은 컨트롤러에 @filter 개체를 만들고이 개체에 대한 필터 양식을 추가하고 인덱스 컨트롤러를 다시 사용하도록 양식 옵션을 설정하는 것입니다. 그러면 params 해시로 전달 된 선택된 필터 매개 변수가 (URL에 표시된) 인덱스 컨트롤러로 연결됩니다. 그러나이 솔루션에는 몇 가지 단점이 있습니다. 먼저 (예 : 새 요소를 생성하여)보기를 변경하자마자 필터가 사라지고 두 번째로 @filter 객체가 쿠키가되어야합니다. 필터

보기-부분 :

<%= form_for(@filter, :url => {:action => "index"}, :html => {:method => :get}) do |f| %> 
    <div class="field"> 
    <%= f.label :german %><br /> 
    <%= f.check_box :german %> 
    </div> 
    <div class="actions"> 
    <%= f.submit "Filter" %> 
    </div> 
<% end %> 

이 컨트롤러 :

def index 
    @word = Word.new 
    @filter = Word.new(params[:word]) 
    @words = Word.paginate(:page => params[:page]).order('word') 
    # .... 

아무도 나를 도와 드릴까요 여기

내가 지금까지 가지고있는 코드는? 이러한 기능 (필터링 결과)은 다른 응용 프로그램에서 어떻게 수행됩니까?

+0

"필터"란 데이터베이스의 일부 레코드는 아니지만 모든 레코드를 원한다는 뜻입니까? 처음에, 저는 여러분이 여러분이 컬럼의 일부를 원한다는 것을 의미한다고 생각했습니다. 처음이라면'where' 절을 사용하고 싶습니다. 예를 들어'Word.where ("language =?", params [: language])'와 같이 말입니다. –

+0

예, 레코드를 필터링하고 싶습니다. – theldoria

+0

당신의 힌트가 조금 도움이되었습니다. 이제 체크 박스를 위해 작동하는 다음 줄이 있습니다 :'@words = Word.paginate (: page => params [: page]). order ('word' 독일어 =? ", 매개 변수 [: 단어] [: 독일어]! ="0 ")'. 성명서의 순서가 중요합니까 (예 : 실적)? 내가 이해하는 한, 이것은 사실이 아닙니다. – theldoria

답변

0

그래서 질문에 대한 답은 where 절을 사용하여 결과에 일치하는 레코드 만 포함시키는 것입니다.

@words = Word 
    .where("german = ?", params[:word][:german] != 0") 
    .order('word') 
    .paginate(:page => params[:page]) 

이것은 일반적으로 기존의 find 및 find_by 메소드를 대체해야하는 활성 관계 (AREL for short)라는 새로운 레일스 구문입니다. 성능을 향상시킬 수있는 몇 가지 장점이 있습니다. 특히 SQL에서 실행되는 (로그에서 볼 수있는) SQL은 선언 될 때가 아니라 참조 될 때만 발생합니다. 이렇게하면 결합 된 간단한 문장을 만들 수있는 부분 관계 (심지어 명명 된 범위와 같은)를 정의 할 수있는 깔끔한 방법이 제공됩니다.

문제가되지 않는 다양한 조항의 순서 -

  • 를 조인 경우,

    • 을 AREL는 같은 SQL을 생성하지만, 일반적으로 I는 기본 SQL의 순서를 따르 그룹
    • 순서
    • 제한
    01 오프셋

    (한계 및 오프셋은 페이지 매김 도구로 귀하의 경우 처리됩니다).

  • +0

    내 컨트롤러 아래 답변으로 : session [: word] = params [: word] if params [: word]; @filter = Word.new (세션 [: word])'와'@words = Word.where ("german =?", 세션 [: word] [: german]! = "0") .paginate (: page => params [: page])'. 쿠키 대신 쿠키를 사용하여 세션을 사용했습니다 (쿠키에 해시를 저장하면 오류 메시지가 나타남). 그러나 그것은 좋은 출발점입니다 ... – theldoria

    +0

    내가 아직도 그리워하는 해결책은 더 대화식이고 b) URL을 오염시키지 않습니다. 그렇다면 AJAX를 사용해야 할 것입니다. 부울 값에 대한 필터 옵션은 tri-state : non-selected, true 및 false이므로 필터 양식에 사용 된 객체는 클래스 Word가 아니어야합니다. 여기에 일부 자바 스크립트 또는 CSS 솔루션을 사용해야 할 수도 있습니다. [tristate-checkbox] (https://github.com/supernifty/tristate-checkbox)와 같은 것일 수도 있습니다. – theldoria

    +0

    별도의 질문으로 질문 할 수 있습니다. –

    관련 문제