# frozen_string_literal: true # La representación indexable de un artículo class IndexedPost < ApplicationRecord include PgSearch::Model # La traducción del locale según Sutty al locale según PostgreSQL DICTIONARIES = { es: 'spanish', en: 'english' }.freeze # TODO: Los indexed posts tienen que estar scopeados al idioma actual, # no buscar sobre todos pg_search_scope :search, lambda { |locale, query| { against: :content, query: query, using: { tsearch: { dictionary: IndexedPost.to_dictionary(locale: locale), tsvector_column: 'indexed_content' }, trigram: { word_similarity: true } } } } # Trae los IndexedPost en el orden en que van a terminar en el sitio. default_scope -> { order(order: :desc, created_at: :desc) } scope :in_category, ->(category) { where("front_matter->'categories' ? :category", category: category.to_s) } scope :by_usuarie, ->(usuarie) { where("front_matter->'usuaries' @> :usuarie::jsonb", usuarie: usuarie.to_s) } belongs_to :site # La ubicación del Post en el disco # # @return [String] def full_path @full_path ||= File.join(site.path, "_#{locale}", "#{path}.markdown") end # La colección # # @return [Jekyll::Collection] def collection site.collections[locale.to_s] end # Obtiene el documento # # @return [Jekyll::Document] def document @document ||= Jekyll::Document.new(full_path, site: site.jekyll, collection: collection) end # Convertir locale a direccionario de PG # # @param [String,Symbol] # @return [String] def self.to_dictionary(locale:) DICTIONARIES[locale.to_sym] || 'simple' end end