mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-17 02:36:23 +00:00
51 lines
1.5 KiB
Ruby
51 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Establece una relación de muchos a muchos artículos. Cada campo es un
|
|
# Array de UUID que se mantienen sincronizados.
|
|
#
|
|
# Por ejemplo:
|
|
#
|
|
# Un libro puede tener muches autores y une autore muchos libros. La
|
|
# relación has_many tiene que traer todes les autores relacionades con
|
|
# el libro actual. La relación belongs_to tiene que traer todes les
|
|
# autores que tienen este libro. La relación es bidireccional, no hay
|
|
# diferencia entre has_many y belongs_to.
|
|
class MetadataHasAndBelongsToMany < MetadataHasMany
|
|
# Mantiene la relación inversa si existe.
|
|
#
|
|
# La relación belongs_to se mantiene actualizada en la modificación
|
|
# actual. Lo que buscamos es mantener sincronizada esa relación.
|
|
#
|
|
# Buscamos en belongs_to la relación local, si se eliminó hay que
|
|
# quitarla de la relación remota, sino hay que agregarla.
|
|
def save
|
|
# XXX: No usamos super
|
|
self[:value] = sanitize value
|
|
|
|
return true unless changed?
|
|
return true unless inverse?
|
|
|
|
(had_many - has_many).each do |remove|
|
|
remove[inverse]&.value&.delete post.uuid.value
|
|
end
|
|
|
|
(has_many - had_many).each do |add|
|
|
next unless add[inverse]
|
|
next if add[inverse].value.include? post.uuid.value
|
|
|
|
add[inverse].value << post.uuid.value
|
|
end
|
|
|
|
true
|
|
end
|
|
|
|
private
|
|
|
|
# Igual que en MetadataRelatedPosts
|
|
# TODO: Mover a un módulo
|
|
def sanitize(uuid)
|
|
super(uuid.map do |u|
|
|
u.to_s.gsub(/[^a-f0-9\-]/i, '')
|
|
end)
|
|
end
|
|
end
|