5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-23 04:56:22 +00:00

feat: relacionar posts por su indexación #7537

This commit is contained in:
f 2023-10-06 10:11:30 -03:00
parent d58cb05c7a
commit 95e3defd8b
No known key found for this signature in database
2 changed files with 22 additions and 12 deletions

View file

@ -7,17 +7,21 @@
# apuntando a un Post, que se mantiene actualizado como el actual. # apuntando a un Post, que se mantiene actualizado como el actual.
class MetadataHasMany < MetadataRelatedPosts class MetadataHasMany < MetadataRelatedPosts
# Todos los Post relacionados # Todos los Post relacionados
#
# @return [Array<Post>]
def has_many def has_many
return default_value if value.blank? return default_value if value.blank?
posts.where(uuid: value) posts.where(post_id: value).map(&:post)
end end
# La relación anterior # La relación anterior
#
# @return [Array<Post>]
def had_many def had_many
return default_value if value_was.blank? return default_value if value_was.blank?
posts.where(uuid: value_was) posts.where(post_id: value_was).map(&:post)
end end
def inverse? def inverse?

View file

@ -3,14 +3,16 @@
# Devuelve una lista de títulos y UUID de todos los posts del mismo # Devuelve una lista de títulos y UUID de todos los posts del mismo
# idioma que el actual, para usar con input-map.js # idioma que el actual, para usar con input-map.js
class MetadataRelatedPosts < MetadataArray 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] # @return [Hash]
def values def values
@values ||= posts.map do |p| @values ||= posts.pluck(:title, :layout, :post_id).map do |row|
next if p.uuid.value == post.uuid.value row.tap do |value|
value[0] = "#{value[0]} (#{site.layouts[value.delete_at(1)].humanized_name})"
[title(p), p.uuid.value] end
end.compact.to_h end.to_h
end end
# Las relaciones nunca son privadas # Las relaciones nunca son privadas
@ -23,21 +25,25 @@ class MetadataRelatedPosts < MetadataArray
end end
def indexable_values def indexable_values
posts.where(uuid: value).map(&:title).map(&:value) posts.where(post_id: value).pluck(:title)
end end
private 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 def posts
site.posts(lang: lang).where(**filter) site.indexed_posts.where(locale: locale).where.not(post_id: post.uuid.value).where(**filter)
end end
def title(post) def title(post)
"#{post&.title&.value || post&.slug&.value} (#{post.layout.humanized_name})" "#{post&.title&.value || post&.slug&.value} (#{post.layout.humanized_name})"
end end
# Encuentra el filtro # Encuentra el filtro desde el esquema del atributo
#
# @return [Hash]
def filter def filter
layout.metadata.dig(name, 'filter')&.to_h&.symbolize_keys || {} layout.metadata.dig(name, 'filter')&.to_h&.symbolize_keys || {}
end end