5

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

Профиль модель

has_one :match 

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

Match модель

belongs_to :profile 

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

ProfilesController # Индекс

def index 

    @search = Sunspot.search Profile, Match do 

    with(:country, params[:country]) 
    with(:state, params[:state])  
    with(:looking_for_education, params[:looking_for_education]) <= from the 2nd model 
    end 

    @profiles = @search.results 

end 

Это терпит неудачу с:

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

Удаление
с (: возраст) .between (Params [: age_from] .. PARAMS [: age_to]) линии, то он пытается

тогда он пытается загрузить

view app/views/educators/educator.html.haml 

, который не существует (им только с помощью

/app/views/profiles/_profile.html.haml 

Ш. вл профили

EDIT # 1:

Какие хорошие проекты OpenSource в рубине на рельсах, которые используют SunSpot и Solr в немного более продвинутый способ взглянуть на? Может быть, я найду там ответ. Любой ответ в этом направлении также будет принят на награду, если он даст в результате эту проблему, thx!

+0

могли бы вы показать мне плз ошибка в деталях, я имею в виду, в каком файле, который строки? – Muntasim

+0

@Muntasim спасибо за комментарий, я обновил сообщение, это было не очень понятно извините за это. Любая идея, почему это происходит и как правильно? thx – Rubytastic

ответ

7

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

Give me all Profile records with these country and state values, and whose Match record has this looking_for_education value

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

Give me all records of type ProfileorMatch that have all of these country , state and looking_for_education values

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

Если я правильно о предполагаемому поведении выше, то вам необходимо включить соответствующую информацию, соответствующего профиля в в 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 изменяется, ее связанный профиль теперь необходимо переиндексировать, чтобы отразить эти изменения.

+0

: look_for_education {match.looking_for_education} неверный синтаксис – Rubytastic

+0

хорошая точка - исправлена. – SimonC

4

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

Sunspot.search [Model1, Model2] do 
    .... 
end 
+0

это не удается для меня еще – Rubytastic

+0

спасибо, что это просто сработало. поэтому простая строка –

4

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

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

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

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

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

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

<%= render @results %> 

или

<% @results.each do |result| %> 
    <%= render result %> 
<% end %> 

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

2

Здесь ответ для поиска другой модели на соответствие строки, используя 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 

 Смежные вопросы

  • Нет связанных вопросов^_^