4

searchkick gem を使用してアプリケーションをセットアップし、Presenters インデックスのオートコンプリート機能に取り組んでいます。私の問題は、複数のフィールド (first_name と last_name) で検索していることです。両方のフィールドでプレゼンターを検索できますが、たとえば、プレゼンターが「Jennifer Hall」の場合、「Jennifer」または「Hall」と入力できます。 「Jennifer Hall」という名前がオートコンプリート ドロップダウンに表示されますが、「Jennifer」と入力すると (スペースを追加すると)、名前が消えて候補が表示されなくなります。私の質問は、どうすればこれを修正できますか?

マイコード

このチュートリアルに従いました: Elasticsearch を使用して Rails アプリに検索とオートコンプリートを追加する

プレゼンター.rb:

class Presenter < ActiveRecord::Base
  searchkick autocomplete: ['first_name', 'last_name'],
             suggest: ['first_name', 'last_name']

  ...
end

presenters_controller.rb:

class PresentersController < ApplicationController
  def index
    if params[:query].present?
      @presenters = Presenter.search(params[:query],
                                     fields: [:first_name, :last_name],
                                     page: params[:page])
    else
      @presenters = Presenter.all.page params[:page]
    end
  end

  def autocomplete
    render json: Presenter.search(params[:query],
                 autocomplete: true,
                 fields: [:first_name, :last_name],
                 limit: 10).map { |presenter|
                   presenter.first_name + " " + presenter.last_name
                 }
  end

  ...
end

.map{ |プレゼンター| を取得しました ここからのアイデア:

searchkick gem を使用してレールに複数の属性をマップする方法

ただし、ソリューションを正確に実行すると、提案された名前のドロップダウンに「未定義」しか表示されませんでした。presenter.first_name + " " + presenter.last_name に変更すると、フルネームがドロップダウンに表示されるようになりました。

ルート.rb:

  resources :presenters, :only => [:index, :show] do
    collection do 
      get :autocomplete
    end

index.html.haml:

.container
  = form_tag presenters_path, method: :get do 
    - if params[:query].present?
      .btn-search.btn-clearsearch
        = link_to "clear", presenters_path
    - else
      .search
        Search
    = text_field_tag :query, params[:query],
                     id: "presenter_search",
                     autocomplete: "off"
    = submit_tag "go", class: "btn-search"

私は typehead.js を使用しているので、次のように動作します:

application.html.haml:

= javascript_include_tag 'application'
= javascript_include_tag
  "//cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.9.3/typeahead.min.js"

presenter.js.coffee:

$ ->
    $('#presenter_search').typeahead
        name: "presenter"
        remote: "/presenters/autocomplete?query=%QUERY"

繰り返しますが、私の問題は、名前を入力すると、その名前に一致するすべてのオプションがドロップダウンに表示されますが (姓と名の両方)、スペースを入力するとすぐに候補のリスト全体が表示されることです。離れます。たとえば、「Jennifer H」という名字を検索する方法がありません。問題はコントローラー/オートコンプリートアクションのマッピングにあると推測できますが、次のように入力します。

.map(&:first_name, &:last_name)

また

.map(&:first_name, :last_name)

エラーを生成し、

.map{ |presenter| presenter.slice(:first_name, :last_name) }

ドロップダウンのすべての提案を「未定義」にします。

これを解決する方法について何か提案はありますか?

4

1 に答える 1

4

お役に立てれば。rake searchkick:reindex CLASS=Model_name で再インデックスすることを忘れないでください

// in model

def full_name
  [first_name, last_name].join(' ') 
end

searchkick text_middle: ['full_name'], autocomplete: ['full_name']

def search_data
  {
    full_name: full_name
  }  
end

// in controller
users = User.search params[:query], fields: [{"full_name" => :text_middle}]
于 2014-12-01T01:14:50.607 に答える