Как искать в ассоциации has_many с помощью Sunspot / Solr?

Вот как выглядит мой первоначальный доступный для поиска блок в моей модели User:

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? Мне нужно, чтобы он возвращал каждого спортсмена, у которого есть указанный идентификатор в спортивной или спортивной_позиции. Поэтому, если кто-то выбирает «Баскетбол» из раскрывающегося списка, моему методу поиска передается идентификатор 2, и он должен вернуть спортсменов, у которых в коллекции sport_id есть sport_id 2. Вот как в модели User объявляются спортивные и спортивные_позиции:

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"

has_many :user_sports

::: РЕДАКТИРОВАТЬ :::

Это сработало в течение минуты после того, как я переиндексировал, а затем внезапно я начал получать эту ошибку:

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", которое является целочисленным атрибутом. Я получал ту же ошибку в этом поле: «Поле не настроено» бла-бла. Эта ошибка обычно возникает только в text полях, если вы пытаетесь провести сравнение, например, equal_to, или рассматривать его как string.

Помощь?


person trevorhinesley    schedule 23.12.2013    source источник


Ответы (1)


Это нормально работает, проблема была в STI. У меня был блок Athlete, который заменял блок User.

person trevorhinesley    schedule 26.12.2013