revisión de has many
This commit is contained in:
parent
5fdc170db0
commit
c2f5c22fc2
5 changed files with 33 additions and 35 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue