sunspot solr как правильно искать несколько моделей? Все примеры онлайн провалились

Как правильно искать несколько моделей в SunSpot Solr?

Модель профиля

has_one :match

searchable do
  string        :country
  string        :state
  string        :city
end

Модель спички

belongs_to :profile

searchable do
  string :looking_for_education
  integer :age_from
  integer :age_to
end

ProfilesController # Index

def index

  @search = Sunspot.search Profile, Match do

    with(:country, params[:country])
    with(:state,   params[:state])      
    with(:looking_for_education, params[:looking_for_education]) 
 Muntasim25 июн. 2013 г., 17:53
Не могли бы вы показать мне ошибку подробно, я имею в виду, в каком файле, в какой строке?
 Rubytastic25 июн. 2013 г., 18:57
@Muntasim спасибо за комментарий, я обновил пост, было не очень ясно, извините за это. Есть идеи, почему это происходит и как это сделать правильно? Спасибо

Ответы на вопрос(4)

Решение Вопроса

Метод, который вынашла для поиска нескольких моделей правильно. Однако, похоже, что смысл вашего поиска не в том, что вы хотели. Похоже, выпытаюсь сказать:

Дай мне всеProfile записи с этимиcountry а такжеstate ценности,а также чьяMatch запись имеет этоlooking_for_education значение

Ваш поиск, однако, говорит:

Дайте мне все записи типаProfile или же Match который имеетвсе из этих ,countrystate а такжеlooking_for_education ценности

Потому что ниProfile ниMatch иметь все эти поля в соответствующихsearchable блоки, ни одна запись не может соответствовать указанным вами условиям.

Если я'Если вы правы в своем предполагаемом поведении, то вам нужно включить профильs информация о совпадении в профилеsearchable блок, вот так:

class Profile < ActiveRecord::Base
  has_one :match

  searchable do
    string(:country)
    string(:state)
    string(:city)
    string(:looking_for_education) { match.looking_for_education }
    integer(:age_from)             { match.age_from              }
    integer(:age_to)               { match.age_to                }
  end
end

Мы тут'мы сказали Sunspot индексировать свойства профиля 'сопоставление совпадений, как если бы они жили в самом профиле. В соответствующих блоках мыМы рассказали Sunspot, как заполнять эти значения при индексировании профиля.

Это позволит вам написать свой поиск, используя толькоProfile модель:

def index
  @search = Sunspot.search Profile do
    with(:country, params[:country])
    with(:state,   params[:state])      
    with(:looking_for_education, params[:looking_for_education])
    with(:age).between(params[:age_from]..params[:age_to])
  end

  @profiles = @search.results
end

Этот поиск вернет толькоProfile записи, по-прежнему отражая свойства каждого профиля "соответствие ассоциации, потому что мы сохранили их, когда профиль был проиндексирован.

Обратите внимание, что это увеличивает сложность при индексировании ваших моделей. ЕслиMatch Записывая изменения, соответствующий профиль теперь необходимо переиндексировать, чтобы отразить эти изменения.

 Rubytastic09 окт. 2013 г., 15:11
строка: looking_for_education {match.looking_for_education} неверный синтаксис
 SimonC10 окт. 2013 г., 20:21
хороший момент - исправлено.

@ moises-zaragoza правильно ответили на ваш вопрос, но у вас больше проблем, чем вы думаете, с тем, что вы хотите сделать.

Первая ошибка:

 Using a with statement like 
  with(:age).between(params[:age_from]..params[:age_to])
 undefined method `gsub' for nil:NilClass

Скорее всего, создается потому, что params [: age_from] и / или params [: age_to] равны нулю. Я могу'не уверен, потому что ты неt показал трассировку стека. Вы можете исправить с помощью фильтра только тогда, когда они присутствуют: with (: age) .between (params [: age_from] .. params [: age_to]) if params [: age_from] .present? и params [: age_to] .present?

Вторая ошибка

Связанные с вашими взглядами. Я предполагаю, что вы визуализируете коллекцию или объект с помощью одного из помощников частичного объекта помощника rails, не указывая частичный (опять же, без кода это более правильное предположение, чем все остальное):


или же


  

Когда в Rails не указано частичное, оно угадывает частичное имя в зависимости от типа объекта. В этом случае, если ваш объект, например, класса Educator, который может быть подклассом Profile, Rails будет искать частичное 'воспитатели / _educator.html.erb. Удостоверьтесь, что вы отрисовываете правильное частичное в зависимости от типа объекта, и это обеспечит вам то, что вы хотите.

Это то, что я делаю, когда мне приходится искать несколько моделей

Sunspot.search [Model1, Model2] do
  ....
end
 Rubytastic23 сент. 2013 г., 14:25
это все еще не удается для меня
 Aldo Delgado19 нояб. 2014 г., 23:57
спасибо это просто сработало. так просто

Здесь ответ для поиска другой модели по соответствующей строкеwith

searchable(:auto_index => AppConfig.solr.auto_index) do
  string :category_name, :stored => true
  text :content, :stored => true
  text :title
  string :company_id, :stored => true
  time :published_on
end

search do |q|
  if params[:keyword].present?
    q.fulltext params[:keyword] do
      fields(:deal_data)
    end
  end
  if (ids = params["company_id"]).present?
    ids = ids.split(",")
    q.with(:company_id,ids) #here company id formate should be ["***","***"]
  end
end

Ваш ответ на вопрос