From 1e2c29f3090ee5cb39592ce3b9a63622791fa44d Mon Sep 17 00:00:00 2001 From: f Date: Sat, 8 Apr 2023 12:47:51 -0300 Subject: [PATCH 1/3] feat: metadata has one #12985 --- app/models/metadata_has_one.rb | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 app/models/metadata_has_one.rb diff --git a/app/models/metadata_has_one.rb b/app/models/metadata_has_one.rb new file mode 100644 index 00000000..49fd65bf --- /dev/null +++ b/app/models/metadata_has_one.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class MetadataHasOne < MetadataHasMany +end From b06751e62e5310a7b33c529c51cd8273e50db2c3 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 8 Apr 2023 17:09:40 -0300 Subject: [PATCH 2/3] 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 From a62039b50a1057b8f8b42689acda6a4c5871689a Mon Sep 17 00:00:00 2001 From: f Date: Sat, 8 Apr 2023 17:26:56 -0300 Subject: [PATCH 3/3] fix: editar desde el panel --- app/views/posts/attribute_ro/_has_one.haml | 6 ++++++ app/views/posts/attributes/_has_one.haml | 7 +++++++ 2 files changed, 13 insertions(+) create mode 100644 app/views/posts/attribute_ro/_has_one.haml create mode 100644 app/views/posts/attributes/_has_one.haml diff --git a/app/views/posts/attribute_ro/_has_one.haml b/app/views/posts/attribute_ro/_has_one.haml new file mode 100644 index 00000000..c7e06be8 --- /dev/null +++ b/app/views/posts/attribute_ro/_has_one.haml @@ -0,0 +1,6 @@ +%tr{ id: attribute } + %th= post_label_t(attribute, post: post) + %td{ dir: dir, lang: locale } + - p = metadata.belongs_to + - if p + = link_to p.title.value, site_post_path(site, p.id) diff --git a/app/views/posts/attributes/_has_one.haml b/app/views/posts/attributes/_has_one.haml new file mode 100644 index 00000000..b0d21f35 --- /dev/null +++ b/app/views/posts/attributes/_has_one.haml @@ -0,0 +1,7 @@ +.form-group + = label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post) + = select_tag(plain_field_name_for(base, attribute), + options_for_select(metadata.values, metadata.value), + **field_options(attribute, metadata), include_blank: t('.empty')) + = render 'posts/attribute_feedback', + post: post, attribute: attribute, metadata: metadata