Гем Rails Sunspot: Использование аспектов при множественном модельном поиске по всему сайту

Я пытаюсь реализовать поиск по всему сайту с помощью мощного гема Sunspot для Rails. Это предполагает одновременный поиск по нескольким очень разным моделям. Я ХОЧУ использовать функцию фасетирования, чтобы позволить пользователю фильтровать результаты поиска по каждой модели или по умолчанию просматривать все на одной странице, перемежаясь друг с другом, упорядоченными по квалификатору: boost.Комбинирование кода фасетирования из Sunspot Railscast с кодом поиска нескольких моделей из другого вопроса Stackoverflow (вариант кода «Множественный тип» из документации Sunspot ) ) дал мне решение, которое, я думаю, сработает, но не работает.

Поиск множественных методов завершается успешно, но фасеты всегда оказываются нулевыми. Мой основной подход - предоставить виртуальный атрибут для каждой модели с тем же именем: search_class, то есть просто имя класса модели, отображаемое в строке. Затем я пытаюсь использовать это как грань. Однако в логике представления результаты фасета (скрытого) всегда являются пустым массивом, в том числе когда @ search.results возвращает много разных моделей в одном запросе, несмотря на то, что каждый возвращенный экземпляр имеет полностью доступный атрибут Instance.search_class.

Я использую Rails 3.1.0 и sunspot-rails 1.2.1.

Что мне делать, чтобы этот код фасетирования работал?

Контроллер:

#searches_controller.rb
class SearchesController < ApplicationController

  def show
    @search = search(params[:q])
    @results = @search.results
  end

  protected
  def search(q)
    Sunspot.search Foo, Bar, CarlSagan do
      keywords q
      #provide faceting for "search class", a field representing a pretty version of the model name
      facet(:search_class)
      with(:search_class, params[:class]) if params[:class].present?
      paginate(:page => params[:page], :per_page => 30)
    end
  end

end

Модели:

#Foo.rb
class Foo < ActiveRecord::Base
  searchable do
    text :full_name, :boost => 5
    text :about, :boost => 2
    #string for faceting
    string :search_class
  end

  #get model name, and, if 2+ words, make pretty
  def search_class
    self.class.name#.underscore.humanize.split(" ").each{|word| word.capitalize!}.join(" ")
  end
end

#Bar.rb
class Bar < ActiveRecord::Base
  searchable do
    text :full_name, :boost => 5
    text :about, :boost => 2
    #string for faceting
    string :search_class
  end

  #get model name, and, if 2+ words, make pretty
  def search_class
    self.class.name.underscore.humanize.split(" ").each{|word| word.capitalize!}.join(" ")
  end
end

#CarlSagan.rb
class CarlSagan < ActiveRecord::Base
  searchable do
    text :full_name, :boost => 5
    text :about, :boost => 2
    #string for faceting
    string :search_class
  end

  #get model name, and, if 2+ words, make pretty
  def search_class
    self.class.name#.underscore.humanize.split(" ").each{|word| word.capitalize!}.join(" ")
  end
end

Вид:

#searches/show.html.erb
<% if @results.present? %> # If results exist, display them # If Railscasts-style facets are found, display and allow for filtering through params[:class] <% if @search.facet(:search_class).rows.count > 0 %>

Found:

    <% for row in @search.facet(:search_class).rows %>
  • <% if params[:class].blank? %> <%= row.count %> <%= link_to row.value, :class => row.value %> <% else %> <%= row.value %> (<%= link_to "remove", :class => nil %>) <% end %>
  • <% end %>
<% end %> <% @results.each do |s| %>
<% if s.class.name=="Foo"%>
Foo

<%= link_to s.name, foo_path(s) %>

<% elsif s.class.name=="Bar"%>
Bar

<%= link_to s.name, bar_path(s) %>

<% elsif s.class.name=="CarlSagan"%>
I LOVE YOU CARL SAGAN!

<%= link_to s.name, carl_sagan_path(s.user) %>

<% end %>
<% end %> <% else %>

Your search returned no results.

<% end %>

9
задан Community 23 May 2017 в 12:25
поделиться