use Sqlite FTS5 for search, assume correct language codes
This commit is contained in:
@@ -9,4 +9,36 @@ class Entry < ApplicationRecord
|
||||
enum :category, %i[word phrase proper_name title reference other]
|
||||
|
||||
validates :category, presence: true
|
||||
|
||||
scope :with_category, ->(cat) { cat.present? ? where(category: cat) : all }
|
||||
|
||||
def self.search(query, language_code: nil)
|
||||
return all if query.blank?
|
||||
|
||||
prefix = valid_lang?(language_code) ? "#{language_code}:" : ""
|
||||
fts_query = "#{prefix}\"#{query.to_s.gsub('"', '""')}\""
|
||||
|
||||
joins("JOIN entries_fts ON entries_fts.rowid = entries.id")
|
||||
.where("entries_fts MATCH ?", fts_query)
|
||||
end
|
||||
|
||||
def self.starts_with(prefix, language_code:)
|
||||
return none unless valid_lang?(language_code)
|
||||
return all if prefix.blank?
|
||||
|
||||
where("#{language_code} LIKE ?", "#{sanitize_sql_like(prefix)}%")
|
||||
end
|
||||
|
||||
def self.alphabetical_for(language_code)
|
||||
return none unless valid_lang?(language_code)
|
||||
|
||||
where.not(language_code => [ nil, "" ])
|
||||
.order(Arel.sql("#{language_code} ASC"))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def self.valid_lang?(code)
|
||||
SupportedLanguage.valid_codes.include?(code.to_s)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,11 +7,7 @@ class SuggestedMeaning < ApplicationRecord
|
||||
foreign_key: :language_code,
|
||||
primary_key: :code
|
||||
|
||||
enum status: {
|
||||
pending: 0,
|
||||
accepted: 1,
|
||||
rejected: 2
|
||||
}
|
||||
enum :status, %i[pending accepted rejected]
|
||||
|
||||
validates :language_code, presence: true
|
||||
validates :alternative_translation, presence: true
|
||||
|
||||
@@ -7,4 +7,10 @@ class SupportedLanguage < ApplicationRecord
|
||||
validates :code, presence: true, uniqueness: true
|
||||
validates :name, presence: true
|
||||
validates :native_name, presence: true
|
||||
|
||||
def self.valid_codes
|
||||
Rails.cache.fetch("supported_languages_codes", expires_in: 1.hour) do
|
||||
pluck(:code).map(&:to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
+1
-5
@@ -17,11 +17,7 @@ class User < ApplicationRecord
|
||||
has_many :entry_versions, dependent: :nullify
|
||||
has_many :comments, dependent: :nullify
|
||||
|
||||
enum role: {
|
||||
contributor: 0,
|
||||
reviewer: 1,
|
||||
admin: 2
|
||||
}
|
||||
enum :role, %i[contributor reviewer admin]
|
||||
|
||||
validates :email, presence: true, uniqueness: true
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user