Фасеты и фильтрация Rails & Sunspot

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

Я пытаюсь добавить фасетирование в поиск на моем сайте через 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 уже оказал мне ОГРОМНУЮ помощь, поэтому я должен всем, кто публикует здесь ответы, большое спасибо.

6
задан armbrusting 12 August 2011 в 13:06
поделиться