Published 04/06/2016
Last Updated 20/11/2024

Khi vào 1 trang web, như thư viện sách/bài hát chẳng hạn, chúng ta thường thấy lựa chọn liệt kê các cuốn ách/bài hát theo chữ cái đầu tiên trong tiêu đề

image.png

Việc này là dễ dàng với tiếng Anh khi chỉ có đúng 26 kí tự, nhưng với tiếng Việt thông thường chúng ta sẽ muốn khi nhấn vào kí tự A , sẽ liệt kê ra các cuốn sách/bài hát có tiêu đề bắt đầu với Ă hoặc Â , hơn nữa còn có các kí tự với dấu ví dụ như Ánh sáng bắt đầu là kí tự Á . Dưới đây là một QueryObject đơn giản áp dụng cho việc này. Database engine được sử dụng ở đây là Postgres.

class BookByFirstLetterInTitle
  class << self

    def call letter
      pattern = guess_pattern letter
      pattern ? Book.where('title ~* ?', pattern) : []
    end

    private

    def guess_pattern letter
      case letter.to_s.downcase
      when '#'
        '^[0-9]'
      when 'a'
        '^[aàáảãạăằắẳẵặâầấẩẫậ]'
      when 'e'
        '^eèéẻẽẹêềếểễệ'
      when 'o'
        '^[oòóỏõọôồốổỗộơờớởỡợ]'
      when 'u'
        '^[uùúủũụưừứửữự]'
      when 'd'
        '^[dđ]'
      when /(b|c|f|g|h|i|j|k|l|m|n|p|q|r|s|t|v|w|x|y|z)/
        '^#{letter}'
      else
        nil
      end
    end

  end
end