2

Как искать с помощью ассоциаций и с помощью солнечных пятен?Рельсы: поиск текста в солнечных пятнах с использованием ассоциаций моделей, используя: через

class StaticController < ApplicationController 

    def search 
    @search = Sunspot.search Business, Service do 
     fulltext params[:q] 
     paginate :per_page => 10 
     order_by_geodist(:location, *Geocoder.coordinates(params[:loc])) 
    end 
     @biz = @search.results 

end 

class Business < ActiveRecord::Base 
    attr_accessible :name 
    has_many :services, :through => :professionals 

    searchable do 
    text :name #name in business column 
    # how to do I get the services? 
    end 

end 

class Service < ActiveRecord::Base 
    attr_accessible :service 
    belongs_to :professional 
end 

class Professional < ActiveRecord::Base 
    belongs_to :business 
    has_many :services, as: :servicable 
end 

По мнению, у меня есть это (много зацикливание)

<%= @biz.each do |b| %> 
    <%= b.name %> 

    <!-- looping through professionals model --> 
    <% b.professionals.each do |prof| %> 

    <!-- looping through services model --> 
    <% prof.services.each do |s| %> 
     <%= s.service %> 
    <% end %> 

    <% end %> 
<% end %> 

Это работает, если я ищу имя, находящееся в бизнес-модели, но что, если я ищу через термин, который находится в модели Service? Он будет отображаться некорректно, потому что мое представление происходит только с деловой стороны. Как сделать так, чтобы название компании всплывало, если я просматриваю модель Service?

Благодаря

ответ

7

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

class Business < ActiveRecord::Base 
attr_accessible :name 
has_many :services, :through => :professionals 

searchable do 
    text :name #name in business column 
    text :services do # this one for full text search 
    services.map(&:service).compact.join(" ") 
    end 
    string :services , :multiple => true do #this one for exact searches 
    services.map(&:service).compact 
    end 
end 
end 

После этого вы можете делать запросы, как:

Bussines.search do 
    with(:services, "some_service") 
end.execute.results 

Теперь вам больше не придется делать присоединиться таблиц MySQL для извлечения данных. Вы можете просто извлечь данные из solr. Это одно из самых больших преимуществ solr.

Надеюсь, это даёт понять. Если вам нужна дополнительная информация, вы можете оставить комментарий.