# 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