48 lines
1.4 KiB
Ruby
48 lines
1.4 KiB
Ruby
class Entry < ApplicationRecord
|
|
belongs_to :created_by, class_name: "User", optional: true
|
|
belongs_to :updated_by, class_name: "User", optional: true
|
|
|
|
has_many :suggested_meanings, dependent: :destroy
|
|
has_many :comments, as: :commentable, dependent: :destroy
|
|
has_many :entry_versions, dependent: :destroy
|
|
|
|
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?
|
|
|
|
terms = query.to_s.strip.split(/\s+/).map { |term| term.gsub('"', '""') }.reject(&:blank?)
|
|
return all if terms.empty?
|
|
|
|
prefix = valid_lang?(language_code) ? "#{language_code}:" : ""
|
|
fts_query = terms.map { |term| "#{prefix}\"#{term}\"*" }.join(" ")
|
|
|
|
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(arel_table[language_code].matches("#{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
|