mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-25 23:06:22 +00:00
2612f44965
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.
60 lines
1.2 KiB
Ruby
60 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
|