diff --git a/app.rb b/app.rb index 151996be..a805f43e 100644 --- a/app.rb +++ b/app.rb @@ -360,8 +360,8 @@ post '/tags/remove' do redirect request.referer end -get '/tags/suggestions/:name.json' do |name| - Tag.suggestions(name).collect {|t| t.name}.to_json +get '/tags/autocomplete/:name.json' do |name| + Tag.autocomplete(name).collect {|t| t[:name]}.to_json end get '/browse/?' do diff --git a/models/tag.rb b/models/tag.rb index 80def65a..58ffdb06 100644 --- a/models/tag.rb +++ b/models/tag.rb @@ -5,21 +5,21 @@ class Tag < Sequel::Model def before_create super - values[:name].downcase! - values[:name].strip! + values[:name] = self.class.clean_name values[:name] + end + + def self.clean_name(name) + name.downcase.strip end def self.create_unless_exists(name) - name = name.downcase.strip + name = clean_name name return nil if name == '' || name.nil? dataset.filter(name: name).first || create(name: name) end - def self.suggestions(name, limit=3) - Tag.filter(name: /^#{name}/i). - order(:name). - limit(limit). - all + def self.autocomplete(name, limit=3) + 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 end def self.popular_names(limit=10) diff --git a/views/layout.erb b/views/layout.erb index dcd9d509..10855614 100644 --- a/views/layout.erb +++ b/views/layout.erb @@ -63,7 +63,7 @@ }, { name: 'tags', source: function(query, callback) { - $.get('/tags/suggestions/'+query+'.json', function(data) { + $.get('/tags/autocomplete/'+query+'.json', function(data) { console.log(data) var suggestions = JSON.parse(data)