5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-22 21:26:21 +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.
class MetadataHasMany < MetadataRelatedPosts
# Todos los Post relacionados
#
# @return [Array<Post>]
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<Post>]
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?

View file

@ -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