2014-10-22 1 views
4

searchkick gem을 사용하여 응용 프로그램을 설정했고 Presenter 색인의 자동 완성 기능을 사용하고 있습니다. 내 문제는 여러 필드 (first_name 및 last_name)에서 검색 중이며 두 필드에서 발표자를 검색 할 수있는 반면 (예 : Presenter 'Jennifer Hall'이있는 경우 'Jennifer'또는 'Hall '및'Jennifer Hall '이라는 단어가 자동 완성 드롭 다운에 나타납니다. 그러나'Jennifer '(일단 공간을 추가하면)라고 입력하면 이름이 사라지고 더 이상 제안이 없습니다. 내 질문은 어떻게 해결할 수 있습니까?searchkick/elasticsearch가 여러 속성을 사용하여 자동 완성을 설정했습니다.

나는이 튜토리얼 따랐다

내 코드 : Adding search and autocomplete to a Rails app with Elasticsearch

presenter.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 {| 발표자 | 여기에서 등} 아이디어 : 나는 정확히 솔루션을 따라 할 때

그러나

how do i map multiple attributes in rails with searchkick gem

, 난 단지 제안 이름의 내 드롭 다운에서 '정의되지 않은'되었다. presenter.first_name + ""+ presenter.last_name으로 변경하면 전체 이름이 드롭 다운에 나타납니다.

routes.rb :

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

index.html.haml :

application.html.haml : 작동 그래서 typeahead.js을 사용하고

.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" 

:

= 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) } 

이 모든 제안을한다 : 나는 문제가 컨트롤러/자동 완성 액션의 매핑이지만, 입력 것을 추측 할 수 드롭 다운에서 '정의되지 않음'을 읽습니다.

해결 방법에 대한 제안 사항이 있으십니까?

+0

솔루션을 찾을 수 있었습니까? 나는 지금 같은 문제를 찾고있다. -/ –

+0

나는 Elasticsearch에 제 작품을 넣고 잠시 동안 하나의 속성 만 검색 할 수 있도록 정해야했습니다. :(연말이되기 전에 희망을 갖고 다시 돌아 가야합니다.) 해결 방법을 찾으면 알려 드리겠습니다. 그 전에 여기를 찾아 공유한다면, 내 영웅이 될 것입니다. – wendybeth

답변

4

희망이 도움이됩니다. rake searchkick으로 다시 색인 생성하는 것을 잊지 마십시오 : 색인 생성 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}] 
+0

그레이트 , 감사합니다! – GLindqvist

+0

@GLindqvist :이 제안을 그대로 따라 했습니까? 나에게 도움이되지 못했습니다. 코드에서 작동하는 코드 스 니펫을 공유해주십시오. – iajnr

관련 문제