way better autocomplete, ranks by popularity

This commit is contained in:
Kyle Drake 2014-09-16 01:49:33 -07:00
parent 698c602475
commit 4a4553f676
3 changed files with 11 additions and 11 deletions

4
app.rb
View file

@ -360,8 +360,8 @@ post '/tags/remove' do
redirect request.referer redirect request.referer
end end
get '/tags/suggestions/:name.json' do |name| get '/tags/autocomplete/:name.json' do |name|
Tag.suggestions(name).collect {|t| t.name}.to_json Tag.autocomplete(name).collect {|t| t[:name]}.to_json
end end
get '/browse/?' do get '/browse/?' do

View file

@ -5,21 +5,21 @@ class Tag < Sequel::Model
def before_create def before_create
super super
values[:name].downcase! values[:name] = self.class.clean_name values[:name]
values[:name].strip! end
def self.clean_name(name)
name.downcase.strip
end end
def self.create_unless_exists(name) def self.create_unless_exists(name)
name = name.downcase.strip name = clean_name name
return nil if name == '' || name.nil? return nil if name == '' || name.nil?
dataset.filter(name: name).first || create(name: name) dataset.filter(name: name).first || create(name: name)
end end
def self.suggestions(name, limit=3) def self.autocomplete(name, limit=3)
Tag.filter(name: /^#{name}/i). DB["select tags.name,count(*) as c from sites_tags inner join tags on tags.id=sites_tags.tag_id where tags.name != '' and tags.name LIKE ? group by tags.name having count(*) > 1 order by c desc LIMIT ?", name+'%', limit].all
order(:name).
limit(limit).
all
end end
def self.popular_names(limit=10) def self.popular_names(limit=10)

View file

@ -63,7 +63,7 @@
}, { }, {
name: 'tags', name: 'tags',
source: function(query, callback) { source: function(query, callback) {
$.get('/tags/suggestions/'+query+'.json', function(data) { $.get('/tags/autocomplete/'+query+'.json', function(data) {
console.log(data) console.log(data)
var suggestions = JSON.parse(data) var suggestions = JSON.parse(data)