検索キックを使用して、データベース内の人を見つけようとしています。ユーザーがドロップダウン リストから人物を選択すると、その人物の ID が非表示フィールドに入力され、その値が送信されます。
その部分はうまくいきます(ほとんど)。
私が抱えている問題は、結果が 5 つ未満の場合、typeahead がドロップダウンに 1 つの値 (searchkick が返す最初の値) しか表示しないことです。結果が 5 件を超える場合、ドロップダウンは表示されません。
これが私の Person モデルです:
searchkick text_start: [:first_name, :middle_name, :last_name]
def search_data
as_json only: [:first_name, :last_name, :middle_name, :active]
end
def full_name
"#{first_name} #{middle_name} #{last_name}"
end
マイ ピープル コントローラー:
def person_search
render json: Person.search(params[:query],
fields: [{first_name: :text_start}, {last_name: :text_start}, {middle_name: :text_start}],
where:{active:true},
limit: 5).map {|person| {name: person.full_name, value: person.id}}
end
私のフォームビュー:
<%= simple_form_for(@person) do |f| %>
<% if @person %>
<%= f.input :person_search, as: :fake, label: 'Person', input_html: {class: 'form-control person-typeahead', value: @person.full_name} %>
<% else %>
<%= f.input :person_search, as: :fake, label: 'Person', input_html: {class: 'form-control person-typeahead', placeholder: "No Person Selected"} %>
<% end %>
<%= f.input :person_id, as: :hidden%>
<% end %>
そして私の検索js:
var ready;
ready = function() {
var people = new Bloodhound({
identify: function(obj) { return obj.value;},
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name', 'value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/people/person_search?query=%QUERY',
wildcard: '%QUERY'
}
});
$('.person-typeahead').typeahead(null, {
display: 'name',
source: people
}).on('typeahead:selected', onPersonSelected);
// show name and submit id
function onPersonSelected($e, datum) {
$('#person_id').val(datum.value);
}
};
$(document).ready(ready);
$(document).on('page:load', ready);
また、誰かがブラッドハウンドをもう少し詳しく説明してくれると助かります (トークナイザーと識別機能の機能)。
私は何時間もドキュメントを調べてきましたが、クリックしていません。
おまけの質問: データベースに複数のジョンがいるとしましょう。
- ジョンスミス
- ジョン・ドウ
- ジョン・スノー
John を検索すると (これは 0.10 でした)、ドロップダウンに 3 つすべてが表示されましたが、スペースを押して姓の入力を開始すると、searchkick は何も返さず、すべての結果が消えます。Searchkickでこれを行う方法はありますか?