123456789101112131415161718192021222324252627282930313233343536373839404142 |
- # frozen_string_literal: true
- # == Schema Information
- #
- # Table name: tags
- #
- # id :integer not null, primary key
- # name :string default(""), not null
- # created_at :datetime not null
- # updated_at :datetime not null
- #
- class Tag < ApplicationRecord
- has_and_belongs_to_many :statuses
- HASHTAG_RE = /(?:^|[^\/\)\w])#([[:word:]_]*[[:alpha:]_][[:word:]_]*)/i
- validates :name, presence: true, uniqueness: true
- def to_param
- name
- end
- class << self
- def search_for(terms, limit = 5)
- terms = Arel.sql(connection.quote(terms.gsub(/['?\\:]/, ' ')))
- textsearch = 'to_tsvector(\'simple\', tags.name)'
- query = 'to_tsquery(\'simple\', \'\'\' \' || ' + terms + ' || \' \'\'\' || \':*\')'
- sql = <<-SQL.squish
- SELECT
- tags.*,
- ts_rank_cd(#{textsearch}, #{query}) AS rank
- FROM tags
- WHERE #{query} @@ #{textsearch}
- ORDER BY rank DESC
- LIMIT ?
- SQL
- Tag.find_by_sql([sql, limit])
- end
- end
- end
|