mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-23 05:36:22 +00:00
feat: relacionar posts por su indexación #7537
This commit is contained in:
parent
d58cb05c7a
commit
95e3defd8b
2 changed files with 22 additions and 12 deletions
|
@ -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?
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue