6

ここではかなり初心者なので、誰かが助けてくれることに感謝します。

Sunspot を使用して、自分のサイトの検索にファセットを追加しようとしています。Ryan は素晴らしい Railscast をリリースしたばかりです。私はそれを機能させ、追加のファセットを追加することができました。私の問題は、ファセットが互いに独立していることです。3 つの異なる属性に 3 つのファセットがある場合、既に選択したファセットを選択すると、両方のファセットに該当する結果のみを表示したいと思います。現時点では、あるファセットから別のファセットに切り替わるだけです。そんなに難しくないと思いますが、やり方がわかりません。

私はこのチュートリアルを見つけました: http://blog.upubly.com/2011/01/06/using-sunspot-in-your-views/ これは私がやりたいことをしていると思います。これを機能させようとしましたが、1 つのファセットだけで機能させようとしても、結果がリストされていません。ファセット名だけで、他には何もありません。

考え?

ありがとうございました!!

アップデート

私がやろうとしていることのコードサンプルは次のとおりです。

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コードは、「季節」ファセットを機能させるためにペアになっています:

Search Partial、Search Model、SearchHelper は例と同じままにしました。ファセットが他のモデルの ID だけでなくテキスト値を取得するため、ヘルパーをいじろうとしましたが、役に立ちませんでした。その機能が必要だとは思わなかったので、さまざまな属性を個々のモデルとして設定していませんが、そうではないと考え始めています。

スタイルコントローラー:

  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 はすでに私にとって大きな助けになっているので、ここに回答を投稿してくれたすべての人に感謝します。

4

1 に答える 1

3

私は自分自身でこれに対する答えが必要でした.それについてウェブ上に他に何もないように見えるので、私は自分でそれを理解しようとすることに決めました.

最初に、コントローラーは複数のファセットを処理でき、それができない理由はないという論理的な結論に達しました。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?))
于 2014-05-28T04:32:41.003 に答える