From 95e3defd8b2420a3f3fa82ce5b98fe67fd6cb62b Mon Sep 17 00:00:00 2001 From: f Date: Fri, 6 Oct 2023 10:11:30 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20relacionar=20posts=20por=20su=20indexac?= =?UTF-8?q?i=C3=B3n=20#7537?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/metadata_has_many.rb | 8 ++++++-- app/models/metadata_related_posts.rb | 26 ++++++++++++++++---------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/app/models/metadata_has_many.rb b/app/models/metadata_has_many.rb index 13f0dcf5..82ec333a 100644 --- a/app/models/metadata_has_many.rb +++ b/app/models/metadata_has_many.rb @@ -7,17 +7,21 @@ # apuntando a un Post, que se mantiene actualizado como el actual. class MetadataHasMany < MetadataRelatedPosts # Todos los Post relacionados + # + # @return [Array] def has_many return default_value if value.blank? - posts.where(uuid: value) + posts.where(post_id: value).map(&:post) end # La relación anterior + # + # @return [Array] def had_many return default_value if value_was.blank? - posts.where(uuid: value_was) + posts.where(post_id: value_was).map(&:post) end def inverse? diff --git a/app/models/metadata_related_posts.rb b/app/models/metadata_related_posts.rb index 092f219a..b1ebfe4e 100644 --- a/app/models/metadata_related_posts.rb +++ b/app/models/metadata_related_posts.rb @@ -3,14 +3,16 @@ # Devuelve una lista de títulos y UUID de todos los posts del mismo # idioma que el actual, para usar con input-map.js class MetadataRelatedPosts < MetadataArray - # Genera un Hash de { title | slug => uuid } y excluye el Post actual + # Genera un Hash de { title (schema) => uuid } para usar en + # options_for_select + # # @return [Hash] def values - @values ||= posts.map do |p| - next if p.uuid.value == post.uuid.value - - [title(p), p.uuid.value] - end.compact.to_h + @values ||= posts.pluck(:title, :layout, :post_id).map do |row| + row.tap do |value| + value[0] = "#{value[0]} (#{site.layouts[value.delete_at(1)].humanized_name})" + end + end.to_h end # Las relaciones nunca son privadas @@ -23,21 +25,25 @@ class MetadataRelatedPosts < MetadataArray end def indexable_values - posts.where(uuid: value).map(&:title).map(&:value) + posts.where(post_id: value).pluck(:title) end private - # Obtiene todos los posts y opcionalmente los filtra + # Obtiene todos los posts menos el actual y opcionalmente los filtra + # + # @return [IndexedPost::ActiveRecord_AssociationRelation] def posts - site.posts(lang: lang).where(**filter) + site.indexed_posts.where(locale: locale).where.not(post_id: post.uuid.value).where(**filter) end def title(post) "#{post&.title&.value || post&.slug&.value} (#{post.layout.humanized_name})" end - # Encuentra el filtro + # Encuentra el filtro desde el esquema del atributo + # + # @return [Hash] def filter layout.metadata.dig(name, 'filter')&.to_h&.symbolize_keys || {} end