0

내가 잘못하고 있니?왜 스핑크스가 레일상의 루비에서 한 번에 하나의 속성으로 필터링을 제한한다고 생각합니까?

  1. 옵션이없는 경우 위치가 작동하고 웹 사이트의 브라우저 페이지에 들어가면 결과가 표시됩니다.

  2. 페이지를 조회하면 모든 사용자가 페이지 당 20 개씩 표시됩니다. with_all gender => params [: gender]를 추가하면 위치가 여전히 작동하고 위치를 입력하고 성별로 결과를 필터링하면 결과가 성공적으로 반환됩니다.

  3. 민족성을 with_all 해시에 추가하면 민족성이 작동하고 결과는 변경되지만 성별 및 위치는 더 이상 작동하지 않습니다.

필터링의 경우 1 개의 속성 만 허용하는 것과 같습니다.

색인을 여러 번 다시 작성 했으므로 어떤 일이 일어나지 않습니다.

나는 위치에 대한 텍스트 검색 있는데이 개 필터는 1 성, 2 민족성을 설정 여기

입니다 위의 모든 속성을 저장하는 프로파일 테이블에 대한 내 프로필 모델 :

define_index do 

    indexes location 
     has ethnicity, :type => :integer 
     has gender, :type => :integer 

    end 

class BrowsersController < ApplicationController 
    def index 
    @default_image = "/assets/default_avatar.jpg" 
    #gender = params[:gender].to_i 
    @users = Profile.search params[:location], 
            :page => params[:page], 
            :per_page => 20, 
            :with_all => 
               { 
            :gender => params[:gender], 
            :ethnicity => params[:ethnicity] 
               } 

    end 
end 

내보기 양식 :

<%= form_tag browsers_path, :method => 'get' do %> 
    <p> 
    Location: <%= text_field_tag :location, params[:location] %><br /> 
    Gender: <%= select_tag :gender, 
       options_for_select([["Select", nil], 
        ["Male", 1], 
       ["Female", 2]], params[:gender]) %> 
<br /> 
    Ethnicity: <%= select_tag :ethnicity, 
       options_for_select([["Select", nil],['Black', 1 ],['White/Caucasian', 2 ],['European', 3 ],['Asian', 4 ],['Indian', 5 ],['Middle Eastern', 6 ],['Native American', 7 ],['Hispanic', 8 ],['Mixed Race', 9 ],['Other Ethnicity', 10 ]], params[:ethnicity]) %> 
<br /> 
    <%= submit_tag "Search", :name => nil %> 
    </p> 
    <% end %> 
여기 내 컨트롤러

답변

3

이 질문에 소화 할 수있는 많은,하지만 여기에 몇 가지주의 할입니다 - 아마도 그들이 도움이 될 것입니다 :

:with_all 단일 다중 값 속성에 여러 값을 일치하는 - 예를 들어, 기사 일치하는 세 개의 태그 ID 모두 :with_all => {:tag_ids => [1, 2, 3]}을 사용합니다.

:with 그러나 하나 이상의 필터 값을 가진 with_all이 동일한 방식으로 작동하지만 하나 이상의 속성에 대한 필터가 있으면 완벽하게 문제가되지 않습니다.

스핑크스는 nils/NULL을 0으로 취급합니다. 따라서 성별로 필터링하는 경우 민족성이 아닌 경우 컨트롤러 코드가 수행하는 작업은 특정 성별과 민족성이 0 인 프로필을 검색하는 것입니다. 다음과 같이 대신 :

filters = {} 
filters[:gender] = params[:gender].to_i if params[:gender].present? 
filters[:ethnicity] = params[:ethnicity].to_i if params[:ethnicity].present? 

@users = Profile.search params[:location], 
    :page  => params[:page], 
    :per_page => 20, 
    :with  => filters 

마지막으로 성별 및 민족성 열은 정수입니까? 그렇습니다. 그렇다면 색인 정의에 :type => :integer을 지정할 필요가 없습니다. 자동으로 수행됩니다.

+0

params [: 민족성] .present가 있다면 필터 [: 민족성] = params [: 민족성] .to_i였습니까? 세 번째 줄 은요? 이제는 모두 저에게 효과적입니다. 내가 제거 : 유형 => : 정수 및 재건도. 많은 사람들은 이와 같은 필터링이 불가능하다고 생각했습니다. 나는 많은 포럼을 방문했고 그들 중 한 명이 내 질문을 올렸다. 다행이 이제 해결되었습니다. 귀하의 명확성을 가져 주셔서 감사합니다. 이 일을 시작하는 것이 내 하루를 시작하는 좋은 방법이었습니다. – LondonGuy

+0

그래, 내 실수. 듣기 좋아요. 다음 번에 Thinking Sphinx Google 그룹에 게시 - TS 질문을위한 최고의 장소 :) – pat