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
|
private
|
||||||
|
|
||||||
|
# TODO: Sanitizar otros valores
|
||||||
|
# XXX: Por qué eliminamos el punto del final?
|
||||||
def sanitize(values)
|
def sanitize(values)
|
||||||
values.map do |v|
|
values.map do |v|
|
||||||
if v.is_a? String
|
case v
|
||||||
super(v).sub(/\.\z/, '')
|
when String then super(v).sub(/\.\z/, '')
|
||||||
else
|
else v
|
||||||
v
|
|
||||||
end
|
end
|
||||||
end.select(&:present?)
|
end.select(&:present?)
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,15 +23,12 @@ class MetadataBelongsTo < MetadataRelatedPosts
|
||||||
|
|
||||||
# Guardar y guardar la relación inversa también, eliminando la
|
# Guardar y guardar la relación inversa también, eliminando la
|
||||||
# relación anterior si existía.
|
# 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
|
def save
|
||||||
|
super
|
||||||
|
|
||||||
# Si no hay relación inversa, no hacer nada más
|
# 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
|
# Si estamos cambiando la relación, tenemos que eliminar la relación
|
||||||
# anterior
|
# anterior
|
||||||
|
@ -86,11 +83,11 @@ class MetadataBelongsTo < MetadataRelatedPosts
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def sanitize(uuid)
|
def post_exists?
|
||||||
uuid.gsub(/[^a-f0-9\-]/, '')
|
posts.find(value, uuid: true).present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def post_exists?
|
def sanitize(uuid)
|
||||||
posts.find(sanitize(value), uuid: true).present?
|
uuid.to_s.gsub(/[^a-f0-9\-]/i, '')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,22 +6,24 @@
|
||||||
# Localmente tenemos un Array de UUIDs. Remotamente tenemos una String
|
# Localmente tenemos un Array de UUIDs. Remotamente tenemos una String
|
||||||
# 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 según la relación remota
|
# Invalidar la relación anterior
|
||||||
def has_many_remote
|
def value_was=(new_value)
|
||||||
@has_many_remote ||= posts.where(inverse => post.uuid.value)
|
@had_many = nil
|
||||||
|
@has_many = nil
|
||||||
|
|
||||||
|
super(new_value)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Todos los Post relacionados
|
# Todos los Post relacionados
|
||||||
def has_many
|
def has_many
|
||||||
@has_many ||= {}
|
@has_many ||= posts.where(uuid: value)
|
||||||
@has_many[value.hash.to_s] ||= posts.where(uuid: value)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# La relación anterior
|
# La relación anterior
|
||||||
def had_many
|
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
|
end
|
||||||
|
|
||||||
def inverse?
|
def inverse?
|
||||||
|
@ -38,18 +40,17 @@ class MetadataHasMany < MetadataRelatedPosts
|
||||||
# Actualizar las relaciones inversas. Hay que buscar la diferencia
|
# Actualizar las relaciones inversas. Hay que buscar la diferencia
|
||||||
# entre had y has_many.
|
# entre had y has_many.
|
||||||
def save
|
def save
|
||||||
|
super
|
||||||
|
|
||||||
return true unless changed?
|
return true unless changed?
|
||||||
|
|
||||||
self[:value] = sanitize value
|
|
||||||
|
|
||||||
return true unless inverse?
|
return true unless inverse?
|
||||||
|
|
||||||
(had_many - has_many).each do |remove|
|
(had_many - has_many).each do |remove|
|
||||||
remove[inverse].value = remove[inverse].default_value
|
remove[inverse]&.value = remove[inverse].default_value
|
||||||
end
|
end
|
||||||
|
|
||||||
(has_many - had_many).each do |add|
|
(has_many - had_many).each do |add|
|
||||||
add[inverse].value = post.uuid.value
|
add[inverse]&.value = post.uuid.value
|
||||||
end
|
end
|
||||||
|
|
||||||
true
|
true
|
||||||
|
@ -62,12 +63,4 @@ class MetadataHasMany < MetadataRelatedPosts
|
||||||
def related_methods
|
def related_methods
|
||||||
@related_methods ||= %i[has_many had_many].freeze
|
@related_methods ||= %i[has_many had_many].freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def sanitize(sanitizable)
|
|
||||||
sanitizable.map do |uuid|
|
|
||||||
uuid.gsub(/[^a-f0-9\-]/, '')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -31,4 +31,10 @@ class MetadataRelatedPosts < MetadataArray
|
||||||
def filter
|
def filter
|
||||||
layout.metadata.dig(name, 'filter')&.to_h&.symbolize_keys || {}
|
layout.metadata.dig(name, 'filter')&.to_h&.symbolize_keys || {}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def sanitize(uuid)
|
||||||
|
super(uuid.map do |u|
|
||||||
|
u.to_s.gsub(/[^a-f0-9\-]/i, '')
|
||||||
|
end)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
.form-group
|
.form-group
|
||||||
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post)
|
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post)
|
||||||
|
= hidden_field_tag "#{base}[#{attribute}][]", ''
|
||||||
|
|
||||||
.mapable{ dir: dir, lang: locale,
|
.mapable{ dir: dir, lang: locale,
|
||||||
data: { values: metadata.value.to_json,
|
data: { values: metadata.value.to_json,
|
||||||
|
|
Loading…
Reference in a new issue