Rails & Sunspot фасеты и фильтрация - PullRequest
6 голосов
/ 11 августа 2011

В значительной степени нуби здесь, поэтому я ценю любую помощь, которую кто-то может оказать.

Я пытаюсь добавить фасетку к поиску на моем сайте через Sunspot.Райан только что выпустил отличный Railscast, который заставил меня начать: http://railscasts.com/episodes/278-search-with-sunspot. Я получил эту работу и смог добавить дополнительные аспекты.Моя проблема в том, что грани не зависят друг от друга.Если у меня есть 3 фасета по 3 различным атрибутам, когда я выбираю фасет один раз, который у меня уже есть, я хотел бы отображать только результаты, попадающие в оба этих фасета.На данный момент он просто переключается с одного аспекта на другой.Я чувствую, что это не должно быть так сложно, но я не могу понять, как это сделать.

Я нашел этот урок: http://blog.upubly.com/2011/01/06/using-sunspot-in-your-views/, который, я думаю, делает то, что я хочу.Я пытался заставить это работать, но даже когда я пытаюсь заставить это работать только с одним аспектом, у меня нет никаких результатов в списке.Только имя аспекта и ничего больше.

Мысли?

Спасибо !!

ОБНОВЛЕНИЕ

Вот примеры кода того, что я пытаюсь сделать:

Настройка кода Railscasts Я получил это:

В моем StylesController:

 def index
  @search = Style.search do
  fulltext params[:search]
  facet :departmental, :seasonal, :classifier
  with(:departmental, params[:department]) if params[:department].present?
  with(:classifier, params[:classification]) if params[:classification].present?
  with(:seasonal, params[:season]) if params[:season].present?
end

В моем представлении индекса стиля (я знаю, что мне нужно сжать это)

  = form_tag styles_path, :method => :get do
    %p
      = text_field_tag :search, params[:search]
      = submit_tag "Search", :name => nil
  #facets
    %h4 Departments
    %ul
      - for row in @search.facet(:departmental).rows
        %li
          - if params[:department].blank?
            = link_to row.value, :department => row.value
            (#{row.count})
          - else
            %strong= row.value
            (#{link_to "remove", :department => nil})
    %h4 Classifications
    %ul
      - for row in @search.facet(:classifier).rows
        %li
          - if params[:classification].blank?
            = link_to row.value, :classification => row.value
            (#{row.count})
          - else
            %strong= row.value
            (#{link_to "remove", :classification => nil})
    %h4 Seasons
    %ul
      - for row in @search.facet(:seasonal).rows
        %li
          - if params[:season].blank?
            = link_to row.value, :season => row.value
            (#{row.count})
          - else
            %strong= row.value
            (#{link_to "remove", :season => nil})

В моей модели стиля:

     searchable do
       text :number, :description, :department, :classification, :season
       string :departmental
       string :classifier
       string :seasonal
     end

     def departmental
       self.department
     end

     def classifier
       self.classification
     end

     def seasonal
       self.season
     end

И моя версия кода upubly в паре, чтобы просто попытаться заставить работать "сезонный" фасет:

Я оставил частичный поиск,Модель поиска и SearchHelper такие же, как в примере.Я пытался связываться с Помощником, поскольку мои Фасеты будут извлекать текстовые значения, а не только идентификаторы других Моделей, но безрезультатно.У меня нет различных атрибутов, настроенных как отдельные модели, так как я не думал, что мне нужна эта функциональность, но я начинаю думать иначе.

StylesController:

  def index
@title = "All styles"
@search = search = Search.new(params[:search]) # need to set local variable to pass into search method
@search.url = styles_path
@search.facets = [:seasonal]

@solr_search = Style.search do
  keywords search.query
  with(:seasonal, true)
  search.facets.each do |item|
    facet(item)
    with(:seasonal, params[:season]) if params[:season].present?
  end
  any_of do
      # filter by facets
      search.facets.each do |item|
        with(item).all_of( params[item].try(:split, "-") ) if params[item].present?
      end
  end  
  paginate(:page => params[:page], :per_page => 10)
end

СноваЯ ценю помощь.Определенно нуб, но действительно наслаждаюсь процессом создания этого сайта.Stackoverflow уже был ОГРОМНОЙ помощью для меня, поэтому я благодарен всем, кто публикует здесь ответы, большое спасибо.

1 Ответ

3 голосов
/ 28 мая 2014

Мне нужен был ответ на этот вопрос сам, и, видя, что в Интернете больше ничего об этом не было, я решил, что попробую сам разобраться.

Сначала я пришел к выводус помощью логики, что контроллер может обрабатывать несколько аспектов, и нет никаких причин, по которым он не может, я вспомнил, что лучшая часть о ruby ​​- это то, что это наиболее читаемый код, попробуйте прочитать ваш первый контроллер, и вы увидите, что он имеет смыслчто это работает.Я проверил это, вручную введя строку запроса в URL, которая дала ожидаемые результаты.Поэтому, как только я понял это, я понял, что проблема заключалась в моем представлении (что сделало меня лицом к лицу, потому что теперь это довольно очевидно)

Ваш пример значительно сложнее моего, и мой ответ может не соответствовать 100%каждое требование, но я уверен, что это близко.Кроме того, ваш код в вашей модели относительно "ведомственного" и т. Д. На мой взгляд немного избыточен

Контроллер

def index
  @search = Style.search do
  fulltext params[:search]
  facet :departmental, :seasonal, :classifier
  with(:departmental, params[:department]) if params[:department].present?
  with(:classifier, params[:classification]) if params[:classification].present?
  with(:seasonal, params[:season]) if params[:season].present?
end

Просмотр

%h4 Departments
%ul
  - for row in @search.facet(:departmental).rows
    %li
      - if params[:department].blank?
        = link_to row.value, styles_path(
          :department => row.value,
          :classification => (params[:classification] unless params[:season].blank?),
          :season => (params[:season] unless params[:season].blank?))
        (#{row.count})
      - else
        %strong= row.value
        = link_to "remove", styles_path(
          :department => nil,
          :classification => (params[:classification] unless params[:season].blank?),
          :season => (params[:season] unless params[:season].blank?))
...