Skip to content
Snippets Groups Projects
  • unarist's avatar
    004672aa
    Fix tag search order and not to use tsvector (#3611) · 004672aa
    unarist authored
    * Sort results by the name
    * Switch search method to simple `LIKE` matching instead of tsvector/tsquery
    
    Previously we used scores from ts_rank_cd() to sort results, but it didn't work
    because the function returns same score for all results. It's not for calculate
    similarity of single words. Sometimes this bug even push out exact matching tag
    from results.
    
    Additionally, PostgreSQL supports prefix searching with standard btree index.
    Using it offers simpler code, but also less index size and some speed.
    004672aa
    History
    Fix tag search order and not to use tsvector (#3611)
    unarist authored
    * Sort results by the name
    * Switch search method to simple `LIKE` matching instead of tsvector/tsquery
    
    Previously we used scores from ts_rank_cd() to sort results, but it didn't work
    because the function returns same score for all results. It's not for calculate
    similarity of single words. Sometimes this bug even push out exact matching tag
    from results.
    
    Additionally, PostgreSQL supports prefix searching with standard btree index.
    Using it offers simpler code, but also less index size and some speed.
tag.rb 677 B
# 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(term, limit = 5)
      pattern = sanitize_sql_like(term) + '%'
      Tag.where('name like ?', pattern).order(:name).limit(limit)
    end
  end
end