Rails 5:Jquery自动完成

我在rails应用程序中实现了jquery自动完成function。

这是设置:

//= require jquery //= require rails-ujs //= require jquery-ui //= require bootstrap //= require_tree . 

items.js

 $(document).ready(function() { $("#search").autocomplete({ source: "/search_suggestions", autoFocus: true, select: function(event, ui) { $(event.target).val(ui.item.value); $('#search').closest("form").submit(); return false; } }); }); 

这是模型items.rb中的搜索操作

  def self.search(term) return where("0=1") if term !~ /\w{4}/ where("lower(title) LIKE lower(:term)", term: "%#{term}%") end 

之后我创建了一个search_suggestions资源:

 rails g resource search_suggestion term popularity:integer rails db:migrate 

search_suggestions.rb

 class SearchSuggestion < ApplicationRecord def self.terms_for(prefix) suggestions = where("term like ?", "#{prefix}_%") suggestions.order("popularity desc").limit(10).pluck(:term) end def self.index_items Item.find_each do |item| index_term(item.title) item.title.split.each { |t| index_term(t) } end end def self.index_term(term) where(term: term.downcase).first_or_initialize.tap do |suggestion| suggestion.increment! :popularity suggestion.save! end end end 

search_suggestions_controller.rb

  def index render json: SearchSuggestion.terms_for(params[:term]) end end 

我创建了以下rake任务,以便根据search_suggestions.rb模型中的设置更新search_suggestion索引:

 namespace :search_suggestions do desc "Generate search suggestions from items" task :index => :environment do SearchSuggestion.index_items end end 

如果我输入rake search_sugegstions:index rake完成没有错误,但不会用当前项更新表。 例如,仍有一些项目已删除,并且仍显示在自动填充内。

任何想法为什么会这样? 有没有更好的方法来实现这一点?

UPDATE1

rake search_suggestions:index时的log / development.log

对不起这个格式…日志很大,因此我无法正确形成它。

[1m[36mItem Load (1.1ms)[0m [1m[34mSELECT "items".* FROM "items" ORDER BY "items"."id" ASC LIMIT $1[0m [["LIMIT", 1000]] [1m[36mSearchSuggestion Load (0.5ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (1.2ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.2ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.3ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.3ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "round"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 19]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.3ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "round"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 19]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.3ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.3ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (6.5ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.3ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.2ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.3ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.7ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.7ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.2ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.3ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.4ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.8ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.4ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.8ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.2ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.5ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m [1m[36mSearchSuggestion Load (0.2ms)[0m [1m[34mSELECT "search_suggestions".* FROM "search_suggestions" WHERE "search_suggestions"."term" = $1 ORDER BY "search_suggestions"."id" ASC LIMIT $2[0m [["term", "rolex"], ["LIMIT", 1]] [1m[35mSQL (0.6ms)[0m [1m[33mUPDATE "search_suggestions" SET "popularity" = COALESCE("popularity", 0) + 1 WHERE "search_suggestions"."id" = $1[0m [["id", 20]] [1m[35m (0.1ms)[0m [1m[35mBEGIN[0m [1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m