From b06751e62e5310a7b33c529c51cd8273e50db2c3 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 8 Apr 2023 17:09:40 -0300 Subject: [PATCH] feat: establecer relaciones bidireccionales --- app/models/metadata_belongs_to.rb | 14 +++++++++++--- app/models/metadata_has_one.rb | 30 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/app/models/metadata_belongs_to.rb b/app/models/metadata_belongs_to.rb index be1fa670..e1b84438 100644 --- a/app/models/metadata_belongs_to.rb +++ b/app/models/metadata_belongs_to.rb @@ -40,13 +40,21 @@ class MetadataBelongsTo < MetadataRelatedPosts # Si estamos cambiando la relaciĆ³n, tenemos que eliminar la relaciĆ³n # anterior if belonged_to.present? - belonged_to[inverse].value = belonged_to[inverse].value.reject do |rej| - rej == post.uuid.value + if belonged_to[inverse].respond_to? :has_one + belonged_to[inverse].value = nil + else + belonged_to[inverse].value = belonged_to[inverse].value.reject do |rej| + rej == post.uuid.value + end end end # No duplicar las relaciones - belongs_to[inverse].value = (belongs_to[inverse].value.dup << post.uuid.value) unless belongs_to.blank? || included? + if belongs_to[inverse].respond_to? :has_one + belongs_to[inverse].value = post.uuid.value + else + belongs_to[inverse].value = (belongs_to[inverse].value.dup << post.uuid.value) unless belongs_to.blank? || included? + end true end diff --git a/app/models/metadata_has_one.rb b/app/models/metadata_has_one.rb index 49fd65bf..38911e1d 100644 --- a/app/models/metadata_has_one.rb +++ b/app/models/metadata_has_one.rb @@ -1,4 +1,34 @@ # frozen_string_literal: true class MetadataHasOne < MetadataHasMany + def had_one + return default_value if value_was.blank? + + posts.find(uuid: value) + end + + def has_one + return default_value if value.blank? + + posts.find(uuid: value) + end + + def had_many; end + def has_many; end + + def save + super + + return true unless changed? + return true unless inverse? + + had_one&.value = nil + has_one&.value = post.uuid.value + + true + end + + def related_methods + @related_methods ||= %i[has_one had_one].freeze + end end