2013-12-23 1 views
3

내 초기 검색 블록 내 사용자 모델의 모습입니다 :Sunspot/Solr을 사용하여 has_many 연관을 검색하는 방법은 무엇입니까? 여기

searchable do 
    text :name 
    integer :sport_ids, multiple: true do 
    sports.map(&:id) 
    end 
    integer :position_ids, multiple: true do 
    positions.map(&:id) 
    end 
    integer :city_id 
    integer :school_id 
    string :state 
end 

가 어떻게 has_many 협회에 의해 검색하나요? 스포츠 또는 스포츠 포지션에서 지정된 ID를 가진 각 선수에게 반환해야합니다. 따라서 누군가가 드롭 다운에서 "Basketball"을 선택하면 2의 ID가 내 검색 방법으로 전달되고 sport_id 컬렉션에 2의 sport_id를 가진 선수를 반환해야합니다. 여기에 스포츠와 sport_positions가 사용자 모델에 선언하는 방법입니다 : has_many :user_sports

::: 편집 :::

이 잠시 일

has_and_belongs_to_many :positions, :class_name => "SportPosition", :join_table => "user_sport_positions", :uniq => true

has_many :sports, :through => :user_sports, order: "user_sports.created_at", class_name: "Sport"

다시 색인을 생성 한 후 갑자기이 오류가 발생하기 시작했습니다.

,
Sunspot::UnrecognizedFieldError (No field configured for Athlete with name 'sport_ids'): 
    app/models/search.rb:12:in `block in execute' 

여기 내 검색 모델 :

class Search < ActiveRecord::Base 
    attr_accessible :coach_id, :sport_id, :gpa_min, :gpa_max, :sport_position_id, 
        :classification, :city_id, :state, :school_id, :athlete_name 

    belongs_to :coach 

    def self.execute(params, page = nil) 
    Sunspot.search(Athlete) do |query| 
     query.with :public, true 
     query.with :removed_from_listing, false 
     query.fulltext params[:athlete_name] unless params[:athlete_name].blank? 
     query.with :sport_ids, params[:sport_id] unless params[:sport_id].blank? 
     query.with :position_ids, params[:sport_position_id] unless params[:sport_position_id].blank? 
     query.with(:state).equal_to(params[:state]) unless params[:state].blank? 
     query.with(:classification).equal_to(params[:classification]) unless params[:classification].blank? 
     query.with :city_id, params[:city_id] unless params[:city_id].blank? 
     query.with :school_id, params[:school_id] unless params[:school_id].blank? 
     query.with(:current_gpa).between(params[:gpa_min]..params[:gpa_max]) unless params[:gpa_min].eql?("0.0") && params[:gpa_max].eql?("5.0") 
     query.paginate page: page unless page.blank? 
    end 
    end 
end 

참고 :는 정수 속성입니다이 더 이상, 나는 필드가 불렀다 "recruit_year"를 확인합니다. 이 필드에서 "No field configured"라고 말하는 것과 같은 오류가 나타납니다. 그 오류는 보통 equal_to와 같은 비교를 시도하거나 string처럼 취급하는 경우에만 text 필드에서만 발생합니다.

도움 말?

답변

2

잘 작동하지만 문제는 STI입니다. 나는 User 블록을 무시하고 있던 선수 블록을 가지고 있었다.