revisión de has many

This commit is contained in:
f 2021-02-11 16:16:25 -03:00
parent 5fdc170db0
commit c2f5c22fc2
5 changed files with 33 additions and 35 deletions

View file

@ -15,12 +15,13 @@ class MetadataArray < MetadataTemplate
private
# TODO: Sanitizar otros valores
# XXX: Por qué eliminamos el punto del final?
def sanitize(values)
values.map do |v|
if v.is_a? String
super(v).sub(/\.\z/, '')
else
v
case v
when String then super(v).sub(/\.\z/, '')
else v
end
end.select(&:present?)
end

View file

@ -23,15 +23,12 @@ class MetadataBelongsTo < MetadataRelatedPosts
# Guardar y guardar la relación inversa también, eliminando la
# relación anterior si existía.
#
# XXX: Esto es un poco enclenque, porque habría que guardar tres
# archivos en lugar de uno solo e indicarle al artículo que tiene uno
# o muchos que busque los datos actualizados filtrando. Pero también
# nos ahorra recursos en la búsqueda al cachear la información. En
# una relación HABTM también vamos a hacer lo mismo.
def save
super
# Si no hay relación inversa, no hacer nada más
return super unless inverse?
return true unless changed?
return true unless inverse?
# Si estamos cambiando la relación, tenemos que eliminar la relación
# anterior
@ -86,11 +83,11 @@ class MetadataBelongsTo < MetadataRelatedPosts
private
def sanitize(uuid)
uuid.gsub(/[^a-f0-9\-]/, '')
def post_exists?
posts.find(value, uuid: true).present?
end
def post_exists?
posts.find(sanitize(value), uuid: true).present?
def sanitize(uuid)
uuid.to_s.gsub(/[^a-f0-9\-]/i, '')
end
end

View file

@ -6,22 +6,24 @@
# Localmente tenemos un Array de UUIDs. Remotamente tenemos una String
# apuntando a un Post, que se mantiene actualizado como el actual.
class MetadataHasMany < MetadataRelatedPosts
# Todos los Post relacionados según la relación remota
def has_many_remote
@has_many_remote ||= posts.where(inverse => post.uuid.value)
# Invalidar la relación anterior
def value_was=(new_value)
@had_many = nil
@has_many = nil
super(new_value)
end
# Todos los Post relacionados
def has_many
@has_many ||= {}
@has_many[value.hash.to_s] ||= posts.where(uuid: value)
@has_many ||= posts.where(uuid: value)
end
# La relación anterior
def had_many
return [] if document.data[name.to_s].blank?
return [] if value_was.blank?
@had_many ||= posts.where(uuid: document.data[name.to_s])
@had_many ||= posts.where(uuid: value_was)
end
def inverse?
@ -38,18 +40,17 @@ class MetadataHasMany < MetadataRelatedPosts
# Actualizar las relaciones inversas. Hay que buscar la diferencia
# entre had y has_many.
def save
super
return true unless changed?
self[:value] = sanitize value
return true unless inverse?
(had_many - has_many).each do |remove|
remove[inverse].value = remove[inverse].default_value
remove[inverse]&.value = remove[inverse].default_value
end
(has_many - had_many).each do |add|
add[inverse].value = post.uuid.value
add[inverse]&.value = post.uuid.value
end
true
@ -62,12 +63,4 @@ class MetadataHasMany < MetadataRelatedPosts
def related_methods
@related_methods ||= %i[has_many had_many].freeze
end
private
def sanitize(sanitizable)
sanitizable.map do |uuid|
uuid.gsub(/[^a-f0-9\-]/, '')
end
end
end

View file

@ -31,4 +31,10 @@ class MetadataRelatedPosts < MetadataArray
def filter
layout.metadata.dig(name, 'filter')&.to_h&.symbolize_keys || {}
end
def sanitize(uuid)
super(uuid.map do |u|
u.to_s.gsub(/[^a-f0-9\-]/i, '')
end)
end
end

View file

@ -1,5 +1,6 @@
.form-group
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post)
= hidden_field_tag "#{base}[#{attribute}][]", ''
.mapable{ dir: dir, lang: locale,
data: { values: metadata.value.to_json,