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