From c2f5c22fc2bdde6f74cf3b809d4382e95ce0d2ae Mon Sep 17 00:00:00 2001 From: f Date: Thu, 11 Feb 2021 16:16:25 -0300 Subject: [PATCH] =?UTF-8?q?revisi=C3=B3n=20de=20has=20many?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/metadata_array.rb | 9 ++++--- app/models/metadata_belongs_to.rb | 19 ++++++------- app/models/metadata_has_many.rb | 33 +++++++++-------------- app/models/metadata_related_posts.rb | 6 +++++ app/views/posts/attributes/_has_many.haml | 1 + 5 files changed, 33 insertions(+), 35 deletions(-) diff --git a/app/models/metadata_array.rb b/app/models/metadata_array.rb index b65fd34..5c0b16f 100644 --- a/app/models/metadata_array.rb +++ b/app/models/metadata_array.rb @@ -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 diff --git a/app/models/metadata_belongs_to.rb b/app/models/metadata_belongs_to.rb index 2be7b3b..112600b 100644 --- a/app/models/metadata_belongs_to.rb +++ b/app/models/metadata_belongs_to.rb @@ -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 diff --git a/app/models/metadata_has_many.rb b/app/models/metadata_has_many.rb index cf7a1b0..978bc4a 100644 --- a/app/models/metadata_has_many.rb +++ b/app/models/metadata_has_many.rb @@ -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 diff --git a/app/models/metadata_related_posts.rb b/app/models/metadata_related_posts.rb index 6712ce2..324ba4f 100644 --- a/app/models/metadata_related_posts.rb +++ b/app/models/metadata_related_posts.rb @@ -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 diff --git a/app/views/posts/attributes/_has_many.haml b/app/views/posts/attributes/_has_many.haml index d39d124..e36b655 100644 --- a/app/views/posts/attributes/_has_many.haml +++ b/app/views/posts/attributes/_has_many.haml @@ -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,