sutty/app/models/metadata_has_many.rb
f 2612f44965 validar de más has_many
esta validación de has_many no permite guardar el post si no coinciden
la cantidad de valores con los posts asociados, lo que funciona en casos
muy ideales y no deja que se pueda guardar el post desde el formulario.

el formulario envía un valor vacío para poder indicar que se quieren
borrar todos los artículos por limitaciones de http, pero también suma
un ítem vacío a la lista, con lo que la cantidad de posts encontrados
siempre es 1 menor.

de la misma forma, si la relación está rota porque uno de los posts
asociados ya no existe, no permite guardar sin dar mayor feedback.  así
que por ahora dejamos que se puedan guardar.
2021-05-17 17:56:56 -03:00

61 lines
1.2 KiB
Ruby

# frozen_string_literal: true
# La diferencia con MetadataRelatedPosts es que la relación también
# actualiza los Posts remotos.
#
# 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
def has_many
return default_value if value.blank?
posts.where(uuid: value)
end
# La relación anterior
def had_many
return default_value if value_was.blank?
posts.where(uuid: value_was)
end
def inverse?
inverse.present?
end
# La relación inversa
#
# @return [Nil,Symbol]
def inverse
@inverse ||= layout.metadata.dig(name, 'inverse')&.to_sym
end
# Actualizar las relaciones inversas. Hay que buscar la diferencia
# entre had y has_many.
def save
super
return true unless changed?
return true unless inverse?
(had_many - has_many).each do |remove|
remove[inverse]&.value = remove[inverse].default_value
end
(has_many - had_many).each do |add|
add[inverse]&.value = post.uuid.value
end
true
end
def related_posts?
true
end
def related_methods
@related_methods ||= %i[has_many had_many].freeze
end
end