diff --git a/app/models/indexed_post.rb b/app/models/indexed_post.rb index 44a970c3..ef239a7d 100644 --- a/app/models/indexed_post.rb +++ b/app/models/indexed_post.rb @@ -34,6 +34,20 @@ class IndexedPost < ApplicationRecord 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) } + # Trae todos los valores únicos para un atributo + # + # @param :attribute [String,Symbol] + # @return [Array] + scope :everything_of, ->(attribute) do + where('front_matter ? :attribute', attribute: attribute) + .pluck( + Arel.sql( + ActiveRecord::Base::sanitize_sql(['front_matter -> :attribute', attribute: attribute]) + ) + ) + .flatten.uniq + end + belongs_to :site # La ubicación del Post en el disco diff --git a/app/models/metadata_template.rb b/app/models/metadata_template.rb index 5de54be1..6012fe87 100644 --- a/app/models/metadata_template.rb +++ b/app/models/metadata_template.rb @@ -74,8 +74,10 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type, # Valores posibles, busca todos los valores actuales en otros # artículos del mismo sitio + # + # @return [Array] def values - site.everything_of(name, lang: lang) + site.indexed_posts.everything_of(name) end # Valor actual o por defecto. Al memoizarlo podemos modificarlo diff --git a/app/models/site.rb b/app/models/site.rb index 690264b4..2f0c56bc 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -317,24 +317,6 @@ class Site < ApplicationRecord end end - # Trae todos los valores disponibles para un campo - # - # TODO: Traer recursivamente, si el campo contiene Hash - # - # TODO: Mover a PostRelation#pluck - # - # @param attr [Symbol|String] El atributo a buscar - # @return Array - def everything_of(attr, lang: nil) - Rails.cache.fetch("#{cache_key_with_version}/everything_of/#{lang}/#{attr}", expires_in: 1.hour) do - attr = attr.to_sym - - posts(lang: lang).flat_map do |p| - p[attr].value if p.attribute? attr - end.uniq.compact - end - end - # Poner en la cola de compilación def enqueue! update(status: 'enqueued') if waiting?