filtros en los artículos relacionados y PostRelation#where
This commit is contained in:
parent
1fa549d3a1
commit
9de23a1506
3 changed files with 40 additions and 9 deletions
|
@ -1,4 +1,8 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
# Una plantilla agrupa metadatos que va a tener un artículo
|
# Una plantilla agrupa metadatos que va a tener un artículo
|
||||||
Layout = Struct.new(:site, :name, :metadata, keyword_init: true)
|
Layout = Struct.new(:site, :name, :metadata, keyword_init: true) do
|
||||||
|
def value
|
||||||
|
name.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -5,13 +5,18 @@
|
||||||
class MetadataRelatedPosts < MetadataArray
|
class MetadataRelatedPosts < MetadataArray
|
||||||
# Genera un Hash de { title | slug => uuid }
|
# Genera un Hash de { title | slug => uuid }
|
||||||
def values
|
def values
|
||||||
@values ||= site.posts(lang: lang).map do |p|
|
@values ||= posts.map do |p|
|
||||||
{ title(p) => p.uuid.value }
|
{ title(p) => p.uuid.value }
|
||||||
end.inject(:merge)
|
end.inject(:merge)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# Obtiene todos los posts y opcionalmente los filtra
|
||||||
|
def posts
|
||||||
|
@posts ||= site.posts(lang: lang).where(**filter)
|
||||||
|
end
|
||||||
|
|
||||||
def title(post)
|
def title(post)
|
||||||
post.try(:title).try(:value) || post.try(:slug).try(:value)
|
post.try(:title).try(:value) || post.try(:slug).try(:value)
|
||||||
end
|
end
|
||||||
|
@ -20,4 +25,9 @@ class MetadataRelatedPosts < MetadataArray
|
||||||
def lang
|
def lang
|
||||||
post.try(:lang).try(:value) || I18n.locale
|
post.try(:lang).try(:value) || I18n.locale
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Encuentra el filtro
|
||||||
|
def filter
|
||||||
|
layout.metadata.dig(name, 'filter')&.to_h&.symbolize_keys || {}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -69,17 +69,34 @@ class PostRelation < Array
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Encuentra el primer post por el valor de un atributo
|
# Encuentra el primer post por el valor de los atributos
|
||||||
# XXX: Acepta cualquier atributo
|
#
|
||||||
|
# @param [Hash]
|
||||||
|
# @return [Post]
|
||||||
def find_by(**args)
|
def find_by(**args)
|
||||||
attr = args.first.first
|
find_generic do |post|
|
||||||
|
args.map do |attr, value|
|
||||||
find_generic do |p|
|
post.attribute?(attr) &&
|
||||||
p.attribute?(attr) &&
|
post.public_send(attr).value == value
|
||||||
p.public_send(attr).value == args.first.last
|
end.all?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Encuentra todos los Post que cumplan las condiciones
|
||||||
|
#
|
||||||
|
# @param [Hash]
|
||||||
|
# @return [PostRelation]
|
||||||
|
def where(**args)
|
||||||
|
return self if args.empty?
|
||||||
|
|
||||||
|
PostRelation[*select do |post|
|
||||||
|
args.map do |attr, value|
|
||||||
|
post.attribute?(attr) &&
|
||||||
|
post.public_send(attr).value == value
|
||||||
|
end.all?
|
||||||
|
end]
|
||||||
|
end
|
||||||
|
|
||||||
# Intenta guardar todos y devuelve true si pudo
|
# Intenta guardar todos y devuelve true si pudo
|
||||||
def save_all(validate: true)
|
def save_all(validate: true)
|
||||||
map do |post|
|
map do |post|
|
||||||
|
|
Loading…
Reference in a new issue