From d84d813d4c48351e71a1a004e3aa28bd2cb0678f Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 13 Feb 2025 11:40:52 +0100 Subject: [PATCH 01/34] fix belongs_to field to use association primary_key, add specs --- lib/avo/fields/belongs_to_field.rb | 12 ++++++++---- spec/features/avo/belongs_to_polymorphic_spec.rb | 9 +++++++++ spec/features/avo/belongs_to_spec.rb | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 95e0b96897..454ca5a5ef 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -212,17 +212,21 @@ def fill_field(record, key, value, params) if valid_model_class.blank? || id_from_param.blank? record.send(:"#{polymorphic_as}_id=", nil) else - record_id = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param).id + primary_key = reflection.options[:primary_key] || target_resource(record: record, polymorphic_model_class: value.safe_constantize).model_class.primary_key + record_id = target_resource(record: record, polymorphic_model_class: value.safe_constantize).model_class.where(primary_key => id_from_param).pick(primary_key) record.send(:"#{polymorphic_as}_id=", record_id) end else - record_id = value.blank? ? value : target_resource(record:).find_record(value).id + if value.blank? + record_id = nil + else + primary_key = reflection.options[:primary_key] || target_resource(record: record).model_class.primary_key + record_id = target_resource(record: record).model_class.where(primary_key => value).pick(primary_key) + end record.send(:"#{key}=", record_id) end - - record end def valid_polymorphic_class(possible_class) diff --git a/spec/features/avo/belongs_to_polymorphic_spec.rb b/spec/features/avo/belongs_to_polymorphic_spec.rb index 86d0d47261..02cffe0a5d 100644 --- a/spec/features/avo/belongs_to_polymorphic_spec.rb +++ b/spec/features/avo/belongs_to_polymorphic_spec.rb @@ -76,6 +76,15 @@ expect(page.body).to have_text "Commentable" expect(field_element_by_resource_id("commentable", comment.id)).to have_link project.name, href: "/admin/resources/projects/#{project.id}" end + + context "custom primary key (UUID) handling" do + let!(:uuid_project) { create :project, id: SecureRandom.uuid, name: "UUID Project" } + let!(:comment) { create :comment, commentable: uuid_project } + + it "assigns the correct uuid to the polymorphic association" do + expect(comment.commentable_id).to eq(uuid_project.id) + end + end end end end diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index f22d2e65af..a8757ac72a 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -83,6 +83,20 @@ end end + context "custom primary key (UUID) handling" do + let!(:uuid_user) { create :user, id: SecureRandom.uuid } + let!(:post) { create :post, user: uuid_user } + + it "displayes the user link using the UUID and stores the correct foreign key" do + visit "/admin/resources/posts/#{post.slug}" + + expect(page).to have_link uuid_user.name, href: "/admin/resources/users/#{uuid_user.slug}?via_record_id=#{post.slug}&via_resource_class=Avo%3A%3AResources%3A%3APost" + + post.reload + expect(post.user_id).to eq(uuid_user.id) + end + end + describe "with user attached" do let!(:post) { create :post, user: admin } let!(:second_user) { create :user } From 6694428e98748ee0ec4221dcbe9e1377198838d7 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 13 Feb 2025 12:04:05 +0100 Subject: [PATCH 02/34] fix specs bugs, function did not handle records without primary key --- lib/avo/fields/belongs_to_field.rb | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 454ca5a5ef..9e6f8a8ab6 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -206,14 +206,14 @@ def fill_field(record, key, value, params) record.send(:"#{polymorphic_as}_type=", valid_model_class) - # If the type is blank, reset the id too. id_from_param = params["#{polymorphic_as}_id"] if valid_model_class.blank? || id_from_param.blank? record.send(:"#{polymorphic_as}_id=", nil) else - primary_key = reflection.options[:primary_key] || target_resource(record: record, polymorphic_model_class: value.safe_constantize).model_class.primary_key - record_id = target_resource(record: record, polymorphic_model_class: value.safe_constantize).model_class.where(primary_key => id_from_param).pick(primary_key) + resource = target_resource(record:, polymorphic_model_class: value.safe_constantize) + primary_key = reflection.options[:primary_key] || resource.model_class.try(:primary_key) || :id + record_id = resource.model_class.where(primary_key => id_from_param).pick(primary_key) record.send(:"#{polymorphic_as}_id=", record_id) end @@ -221,12 +221,15 @@ def fill_field(record, key, value, params) if value.blank? record_id = nil else - primary_key = reflection.options[:primary_key] || target_resource(record: record).model_class.primary_key - record_id = target_resource(record: record).model_class.where(primary_key => value).pick(primary_key) + resource = target_resource(record:) + primary_key = reflection.options[:primary_key] || resource.model_class.try(:primary_key) || :id + record_id = resource.model_class.where(primary_key => value).pick(primary_key) end record.send(:"#{key}=", record_id) end + + record end def valid_polymorphic_class(possible_class) From 0eea6e0a9381d78e5d239dd63298766eea313054 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 13 Feb 2025 16:28:40 +0100 Subject: [PATCH 03/34] fix belongs_to_field --- lib/avo/fields/belongs_to_field.rb | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 9e6f8a8ab6..96c5861c36 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -115,6 +115,13 @@ def options values_for_type end + def primary_key + @primary_key ||= reflection.association_primary_key + # Quick fix for "Polymorphic associations do not support computing the class." + rescue + nil + end + def values_for_type(model = nil) resource = target_resource resource = Avo.resource_manager.get_resource_by_model_class model if model.present? @@ -126,7 +133,7 @@ def values_for_type(model = nil) end query.all.limit(Avo.configuration.associations_lookup_list_limit).map do |record| - [resource.new(record: record).record_title, record.to_param] + [resource.new(record: record).record_title, primary_key.present? ? record.send(primary_key) : record.to_param] end.tap do |options| options << t("avo.more_records_available") if options.size == Avo.configuration.associations_lookup_list_limit end @@ -206,25 +213,20 @@ def fill_field(record, key, value, params) record.send(:"#{polymorphic_as}_type=", valid_model_class) + # If the type is blank, reset the id too. id_from_param = params["#{polymorphic_as}_id"] if valid_model_class.blank? || id_from_param.blank? record.send(:"#{polymorphic_as}_id=", nil) else - resource = target_resource(record:, polymorphic_model_class: value.safe_constantize) - primary_key = reflection.options[:primary_key] || resource.model_class.try(:primary_key) || :id - record_id = resource.model_class.where(primary_key => id_from_param).pick(primary_key) + record = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param) + record_id = primary_key.present? ? primary_key : record.id record.send(:"#{polymorphic_as}_id=", record_id) end else - if value.blank? - record_id = nil - else - resource = target_resource(record:) - primary_key = reflection.options[:primary_key] || resource.model_class.try(:primary_key) || :id - record_id = resource.model_class.where(primary_key => value).pick(primary_key) - end + record = value.blank? ? value : target_resource(record:).find_record(value) + record_id = primary_key.present? ? primary_key : record.id record.send(:"#{key}=", record_id) end From 3e4c15c4a24d8040ce0704b4b4b4b3fa6b18413e Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 20 Feb 2025 13:52:55 +0100 Subject: [PATCH 04/34] small changes --- lib/avo/fields/belongs_to_field.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 96c5861c36..34d55dd3ea 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -220,13 +220,13 @@ def fill_field(record, key, value, params) record.send(:"#{polymorphic_as}_id=", nil) else record = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param) - record_id = primary_key.present? ? primary_key : record.id + record_id = primary_key.present? ? record.send(primary_key) : record.id record.send(:"#{polymorphic_as}_id=", record_id) end else - record = value.blank? ? value : target_resource(record:).find_record(value) - record_id = primary_key.present? ? primary_key : record.id + record = value.blank? ? nil : target_resource(record:).find_record(value) + record_id = primary_key.present? ? record.send(primary_key) : record.id record.send(:"#{key}=", record_id) end From 14ec146b86a377f210c92cbbf84baaa1fa8aea19 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 20 Feb 2025 14:14:41 +0100 Subject: [PATCH 05/34] fix fill_field function --- lib/avo/fields/belongs_to_field.rb | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 34d55dd3ea..474b3be1db 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -219,16 +219,24 @@ def fill_field(record, key, value, params) if valid_model_class.blank? || id_from_param.blank? record.send(:"#{polymorphic_as}_id=", nil) else - record = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param) - record_id = primary_key.present? ? record.send(primary_key) : record.id - - record.send(:"#{polymorphic_as}_id=", record_id) + found_record = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param) + + if found_record.present? + record_id = primary_key.present? ? found_record.send(primary_key) : found_record.id + record.send(:"#{polymorphic_as}_id=", record_id) + else + record.send(:"#{polymorphic_as}_id=", nil) + end end else - record = value.blank? ? nil : target_resource(record:).find_record(value) - record_id = primary_key.present? ? record.send(primary_key) : record.id + found_record = value.present? ? target_resource(record:).find_record(value) : nil - record.send(:"#{key}=", record_id) + if found_record.present? + record_id = primary_key.present? ? found_record.send(primary_key) : found_record.id + record.send(:"#{key}=", record_id) + else + record.send(:"#{key}=", nil) + end end record From 7c467879a63b10b31573216987d169fae827c245 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 20 Feb 2025 16:37:55 +0100 Subject: [PATCH 06/34] fix code to old specs work --- lib/avo/fields/belongs_to_field.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 474b3be1db..a677474fca 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -133,7 +133,7 @@ def values_for_type(model = nil) end query.all.limit(Avo.configuration.associations_lookup_list_limit).map do |record| - [resource.new(record: record).record_title, primary_key.present? ? record.send(primary_key) : record.to_param] + [resource.new(record: record).record_title, record.to_param] end.tap do |options| options << t("avo.more_records_available") if options.size == Avo.configuration.associations_lookup_list_limit end From 5840ba5bb4ce39d723d5a27b6fd9c86e0831a0e1 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 20 Feb 2025 18:15:59 +0100 Subject: [PATCH 07/34] Add comments, fix code, fix specs --- lib/avo/fields/belongs_to_field.rb | 1 + spec/features/avo/belongs_to_polymorphic_spec.rb | 2 ++ spec/features/avo/belongs_to_spec.rb | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index a677474fca..55bd2a6056 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -133,6 +133,7 @@ def values_for_type(model = nil) end query.all.limit(Avo.configuration.associations_lookup_list_limit).map do |record| + # to_param uses slug so checking primary_key is unnecessary [resource.new(record: record).record_title, record.to_param] end.tap do |options| options << t("avo.more_records_available") if options.size == Avo.configuration.associations_lookup_list_limit diff --git a/spec/features/avo/belongs_to_polymorphic_spec.rb b/spec/features/avo/belongs_to_polymorphic_spec.rb index 02cffe0a5d..b375b13308 100644 --- a/spec/features/avo/belongs_to_polymorphic_spec.rb +++ b/spec/features/avo/belongs_to_polymorphic_spec.rb @@ -84,6 +84,8 @@ it "assigns the correct uuid to the polymorphic association" do expect(comment.commentable_id).to eq(uuid_project.id) end + + # ToDo spec with relation belongs_to with primary_key end end end diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index a8757ac72a..2062854abc 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -87,12 +87,13 @@ let!(:uuid_user) { create :user, id: SecureRandom.uuid } let!(:post) { create :post, user: uuid_user } - it "displayes the user link using the UUID and stores the correct foreign key" do + it "displays the user link using the UUID and stores the correct foreign key" do visit "/admin/resources/posts/#{post.slug}" expect(page).to have_link uuid_user.name, href: "/admin/resources/users/#{uuid_user.slug}?via_record_id=#{post.slug}&via_resource_class=Avo%3A%3AResources%3A%3APost" post.reload + expect(post.user_id).to eq(uuid_user.id) end end From 048f19d68225f95f8ae92ad0d3ea95ff0a171019 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 20 Feb 2025 20:09:40 +0100 Subject: [PATCH 08/34] optymalize code --- lib/avo/fields/belongs_to_field.rb | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 55bd2a6056..5dbdc58b63 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -221,23 +221,15 @@ def fill_field(record, key, value, params) record.send(:"#{polymorphic_as}_id=", nil) else found_record = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param) + + record_id = found_record&.send(primary_key.presence || :id) - if found_record.present? - record_id = primary_key.present? ? found_record.send(primary_key) : found_record.id - record.send(:"#{polymorphic_as}_id=", record_id) - else - record.send(:"#{polymorphic_as}_id=", nil) - end + record.send(:"#{polymorphic_as}_id=", record_id) end else found_record = value.present? ? target_resource(record:).find_record(value) : nil - if found_record.present? - record_id = primary_key.present? ? found_record.send(primary_key) : found_record.id - record.send(:"#{key}=", record_id) - else - record.send(:"#{key}=", nil) - end + record.send(:"#{key}=", found_record&.send(primary_key.presence || :id)) end record From fc2342ed4a8e223d58e0e23ffae6927adcda7204 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 20 Feb 2025 20:12:01 +0100 Subject: [PATCH 09/34] fix standardrb spec --- lib/avo/fields/belongs_to_field.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 5dbdc58b63..34a33399fe 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -221,7 +221,7 @@ def fill_field(record, key, value, params) record.send(:"#{polymorphic_as}_id=", nil) else found_record = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param) - + record_id = found_record&.send(primary_key.presence || :id) record.send(:"#{polymorphic_as}_id=", record_id) From 22dcaf0536c1cbef0da6bb3e529851055addf4e3 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Wed, 5 Mar 2025 19:34:11 +0100 Subject: [PATCH 10/34] Add migration and change spec --- Gemfile.lock | 8 +++----- db/factories.rb | 1 + spec/dummy/app/models/post.rb | 2 +- .../db/migrate/20250305170132_add_uuid_to_users.rb | 12 ++++++++++++ spec/dummy/db/schema.rb | 6 ++++-- spec/dummy/db/seeds.rb | 3 ++- spec/features/avo/belongs_to_polymorphic_spec.rb | 11 ----------- spec/features/avo/belongs_to_spec.rb | 4 ++-- spec/support/shared_contexts.rb | 1 + 9 files changed, 26 insertions(+), 22 deletions(-) create mode 100644 spec/dummy/db/migrate/20250305170132_add_uuid_to_users.rb diff --git a/Gemfile.lock b/Gemfile.lock index 63ed0968a1..d45596720b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -293,7 +293,6 @@ GEM concurrent-ruby (~> 1.1) webrick (~> 1.7) websocket-driver (~> 0.7) - ffi (1.17.1-arm64-darwin) ffi (1.17.1-x86_64-linux-gnu) flay (2.13.3) erubi (~> 1.10) @@ -422,8 +421,6 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.4) - nokogiri (1.18.3-arm64-darwin) - racc (~> 1.4) nokogiri (1.18.3-x86_64-linux-gnu) racc (~> 1.4) observer (0.1.2) @@ -445,6 +442,9 @@ GEM prettyprint (0.2.0) prop_initializer (0.2.0) zeitwerk (>= 2.6.18) + psych (5.2.3) + date + stringio public_suffix (6.0.1) puma (6.6.0) nio4r (~> 2.0) @@ -696,8 +696,6 @@ GEM zeitwerk (2.7.2) PLATFORMS - arm64-darwin-23 - arm64-darwin-24 x86_64-linux DEPENDENCIES diff --git a/db/factories.rb b/db/factories.rb index 15cc6c10de..e3425b434a 100644 --- a/db/factories.rb +++ b/db/factories.rb @@ -1,5 +1,6 @@ FactoryBot.define do factory :user do + uuid { SecureRandom.uuid } first_name { Faker::Name.first_name } last_name { Faker::Name.last_name } email { Faker::Internet.email } diff --git a/spec/dummy/app/models/post.rb b/spec/dummy/app/models/post.rb index 96b9b36a10..4cab1ddf1e 100644 --- a/spec/dummy/app/models/post.rb +++ b/spec/dummy/app/models/post.rb @@ -33,7 +33,7 @@ class Post < ApplicationRecord has_one_attached :audio has_many_attached :attachments - belongs_to :user, optional: true + belongs_to :user, primary_key: :uuid, optional: true has_many :comments, as: :commentable has_many :reviews, as: :reviewable diff --git a/spec/dummy/db/migrate/20250305170132_add_uuid_to_users.rb b/spec/dummy/db/migrate/20250305170132_add_uuid_to_users.rb new file mode 100644 index 0000000000..dda59b622d --- /dev/null +++ b/spec/dummy/db/migrate/20250305170132_add_uuid_to_users.rb @@ -0,0 +1,12 @@ +class AddUuidToUsers < ActiveRecord::Migration[8.0] + def change + add_column :users, :uuid, :string, null: true + add_index :users, :uuid, unique: true + + User.find_each do |user| + user.update(uuid: SecureRandom.uuid) if user.uuid.nil? + end + + change_column_null :users, :uuid, false + end +end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 4a41fc805e..35fb4ae52a 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_01_03_192051) do +ActiveRecord::Schema[8.0].define(version: 2025_03_05_170132) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -172,7 +172,7 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "price_cents", default: 0, null: false - t.string "price_currency", default: "'USD'::character varying", null: false + t.string "price_currency", default: "USD", null: false t.string "sizes", default: [], array: true end @@ -291,10 +291,12 @@ t.datetime "updated_at", null: false t.boolean "active", default: true t.string "slug" + t.string "uuid", null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true t.index ["slug"], name: "index_users_on_slug", unique: true t.index ["team_id"], name: "index_users_on_team_id" + t.index ["uuid"], name: "index_users_on_uuid", unique: true end add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" diff --git a/spec/dummy/db/seeds.rb b/spec/dummy/db/seeds.rb index 7ecd3c415e..16f9d8b8a9 100644 --- a/spec/dummy/db/seeds.rb +++ b/spec/dummy/db/seeds.rb @@ -54,7 +54,8 @@ admin: true, manager: false, writer: false - } + }, + uuid: SecureRandom.uuid ) famous_users = [ diff --git a/spec/features/avo/belongs_to_polymorphic_spec.rb b/spec/features/avo/belongs_to_polymorphic_spec.rb index b375b13308..86d0d47261 100644 --- a/spec/features/avo/belongs_to_polymorphic_spec.rb +++ b/spec/features/avo/belongs_to_polymorphic_spec.rb @@ -76,17 +76,6 @@ expect(page.body).to have_text "Commentable" expect(field_element_by_resource_id("commentable", comment.id)).to have_link project.name, href: "/admin/resources/projects/#{project.id}" end - - context "custom primary key (UUID) handling" do - let!(:uuid_project) { create :project, id: SecureRandom.uuid, name: "UUID Project" } - let!(:comment) { create :comment, commentable: uuid_project } - - it "assigns the correct uuid to the polymorphic association" do - expect(comment.commentable_id).to eq(uuid_project.id) - end - - # ToDo spec with relation belongs_to with primary_key - end end end end diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index 2062854abc..8780159473 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -84,7 +84,7 @@ end context "custom primary key (UUID) handling" do - let!(:uuid_user) { create :user, id: SecureRandom.uuid } + let!(:uuid_user) { create :user } let!(:post) { create :post, user: uuid_user } it "displays the user link using the UUID and stores the correct foreign key" do @@ -94,7 +94,7 @@ post.reload - expect(post.user_id).to eq(uuid_user.id) + expect(post.user_id).to eq(uuid_user.uuid) end end diff --git a/spec/support/shared_contexts.rb b/spec/support/shared_contexts.rb index e31d2283da..c20a53c915 100644 --- a/spec/support/shared_contexts.rb +++ b/spec/support/shared_contexts.rb @@ -1,4 +1,5 @@ shared_context "has_admin_user" do + debugger let(:admin) { create :user, roles: {admin: true} } before :each do From ec5253ad5a5dc92d89123e55f841ada9f4f437a3 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Wed, 5 Mar 2025 19:34:56 +0100 Subject: [PATCH 11/34] delete uuid from seeds --- spec/dummy/db/seeds.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/dummy/db/seeds.rb b/spec/dummy/db/seeds.rb index 16f9d8b8a9..7ecd3c415e 100644 --- a/spec/dummy/db/seeds.rb +++ b/spec/dummy/db/seeds.rb @@ -54,8 +54,7 @@ admin: true, manager: false, writer: false - }, - uuid: SecureRandom.uuid + } ) famous_users = [ From 6b3d1cd46eda974cb1442de72714f905eadb1c82 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Wed, 5 Mar 2025 19:36:25 +0100 Subject: [PATCH 12/34] delete debugger from spec --- spec/support/shared_contexts.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/support/shared_contexts.rb b/spec/support/shared_contexts.rb index c20a53c915..e31d2283da 100644 --- a/spec/support/shared_contexts.rb +++ b/spec/support/shared_contexts.rb @@ -1,5 +1,4 @@ shared_context "has_admin_user" do - debugger let(:admin) { create :user, roles: {admin: true} } before :each do From 27958942f3fc44f9d3f361d96e242d18bc4050a7 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Wed, 5 Mar 2025 19:38:45 +0100 Subject: [PATCH 13/34] change price currency bug in schema --- spec/dummy/db/schema.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 35fb4ae52a..6fbb806d54 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -172,7 +172,7 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "price_cents", default: 0, null: false - t.string "price_currency", default: "USD", null: false + t.string "price_currency", default: "'USD'::character varying", null: false t.string "sizes", default: [], array: true end From 7f9840ebf36010ede6011301f3fb33480ec4de27 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 6 Mar 2025 12:04:44 +0100 Subject: [PATCH 14/34] undo changes with adding uuid to user --- db/factories.rb | 1 - .../db/migrate/20250306105600_remove_uuid_from_users.rb | 6 ++++++ spec/dummy/db/schema.rb | 4 +--- 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 spec/dummy/db/migrate/20250306105600_remove_uuid_from_users.rb diff --git a/db/factories.rb b/db/factories.rb index e3425b434a..15cc6c10de 100644 --- a/db/factories.rb +++ b/db/factories.rb @@ -1,6 +1,5 @@ FactoryBot.define do factory :user do - uuid { SecureRandom.uuid } first_name { Faker::Name.first_name } last_name { Faker::Name.last_name } email { Faker::Internet.email } diff --git a/spec/dummy/db/migrate/20250306105600_remove_uuid_from_users.rb b/spec/dummy/db/migrate/20250306105600_remove_uuid_from_users.rb new file mode 100644 index 0000000000..9dc2f487a4 --- /dev/null +++ b/spec/dummy/db/migrate/20250306105600_remove_uuid_from_users.rb @@ -0,0 +1,6 @@ +class RemoveUuidFromUsers < ActiveRecord::Migration[8.0] + def change + remove_index :users, :uuid + remove_column :users, :uuid, :string + end +end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 6fbb806d54..6db11c3486 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_03_05_170132) do +ActiveRecord::Schema[8.0].define(version: 2025_03_06_105600) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -291,12 +291,10 @@ t.datetime "updated_at", null: false t.boolean "active", default: true t.string "slug" - t.string "uuid", null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true t.index ["slug"], name: "index_users_on_slug", unique: true t.index ["team_id"], name: "index_users_on_team_id" - t.index ["uuid"], name: "index_users_on_uuid", unique: true end add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" From 44ec64b975b5a7f11929b4a98d2db3f573ae3700 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 6 Mar 2025 12:08:21 +0100 Subject: [PATCH 15/34] delete unnecessary migrations and relations --- spec/dummy/app/models/post.rb | 2 +- .../db/migrate/20250305170132_add_uuid_to_users.rb | 12 ------------ .../migrate/20250306105600_remove_uuid_from_users.rb | 6 ------ 3 files changed, 1 insertion(+), 19 deletions(-) delete mode 100644 spec/dummy/db/migrate/20250305170132_add_uuid_to_users.rb delete mode 100644 spec/dummy/db/migrate/20250306105600_remove_uuid_from_users.rb diff --git a/spec/dummy/app/models/post.rb b/spec/dummy/app/models/post.rb index 4cab1ddf1e..96b9b36a10 100644 --- a/spec/dummy/app/models/post.rb +++ b/spec/dummy/app/models/post.rb @@ -33,7 +33,7 @@ class Post < ApplicationRecord has_one_attached :audio has_many_attached :attachments - belongs_to :user, primary_key: :uuid, optional: true + belongs_to :user, optional: true has_many :comments, as: :commentable has_many :reviews, as: :reviewable diff --git a/spec/dummy/db/migrate/20250305170132_add_uuid_to_users.rb b/spec/dummy/db/migrate/20250305170132_add_uuid_to_users.rb deleted file mode 100644 index dda59b622d..0000000000 --- a/spec/dummy/db/migrate/20250305170132_add_uuid_to_users.rb +++ /dev/null @@ -1,12 +0,0 @@ -class AddUuidToUsers < ActiveRecord::Migration[8.0] - def change - add_column :users, :uuid, :string, null: true - add_index :users, :uuid, unique: true - - User.find_each do |user| - user.update(uuid: SecureRandom.uuid) if user.uuid.nil? - end - - change_column_null :users, :uuid, false - end -end diff --git a/spec/dummy/db/migrate/20250306105600_remove_uuid_from_users.rb b/spec/dummy/db/migrate/20250306105600_remove_uuid_from_users.rb deleted file mode 100644 index 9dc2f487a4..0000000000 --- a/spec/dummy/db/migrate/20250306105600_remove_uuid_from_users.rb +++ /dev/null @@ -1,6 +0,0 @@ -class RemoveUuidFromUsers < ActiveRecord::Migration[8.0] - def change - remove_index :users, :uuid - remove_column :users, :uuid, :string - end -end From ab787110b8ce6309087110880ad5b97857b77d5e Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 6 Mar 2025 13:21:13 +0100 Subject: [PATCH 16/34] change spec --- spec/features/avo/belongs_to_spec.rb | 38 +++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index 8780159473..d237a557ef 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -84,13 +84,45 @@ end context "custom primary key (UUID) handling" do - let!(:uuid_user) { create :user } - let!(:post) { create :post, user: uuid_user } + before do + # Create models and columns to test belongs_to relations with primary_key + unless ActiveRecord::Base.connection.column_exists?(:users, :uuid) + ActiveRecord::Base.connection.add_column(:users, :uuid, :string) + ActiveRecord::Base.connection.add_index(:users, :uuid, unique: true) + end + + class TestUser < User + self.table_name = "users" + self.primary_key = :uuid + + has_many :test_posts, class_name: "TestPost", foreign_key: :user_id, primary_key: :uuid + end + + class TestPost < Post + self.table_name = "posts" + + belongs_to :test_user, class_name: "TestUser", foreign_key: :user_id, primary_key: :uuid + end + end + + after do + # Delete unnecessary models and columns used only for spec + Object.send(:remove_const, :TestUser) + Object.send(:remove_const, :TestPost) + + if User.column_names.exclude?("uuid") + ActiveRecord::Base.connection.remove_column(:users, :uuid, :string) + ActiveRecord::Base.connection.remove_index(:users, :uuid, unique: true) + end + end + + let!(:uuid_user) { TestUser.create!(User.first.attributes.except("id", "created_at", "updated_at").merge(uuid: SecureRandom.uuid)) } + let!(:post) { TestPost.create!(user_id: uuid_user.uuid, slug: "test-post") } it "displays the user link using the UUID and stores the correct foreign key" do visit "/admin/resources/posts/#{post.slug}" - expect(page).to have_link uuid_user.name, href: "/admin/resources/users/#{uuid_user.slug}?via_record_id=#{post.slug}&via_resource_class=Avo%3A%3AResources%3A%3APost" + expect(page).to have_link uuid_user.name, href: "/admin/resources/users/#{uuid_user.uuid}?via_record_id=#{post.slug}&via_resource_class=Avo%3A%3AResources%3A%3APost" post.reload From c75c9ec24796599ca60f86e5ee899ea665109953 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 6 Mar 2025 13:51:58 +0100 Subject: [PATCH 17/34] delete changes from Gemfile.lock --- Gemfile.lock | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index 3d40554c03..fd566b1f81 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -293,6 +293,7 @@ GEM concurrent-ruby (~> 1.1) webrick (~> 1.7) websocket-driver (~> 0.7) + ffi (1.17.1-arm64-darwin) ffi (1.17.1-x86_64-linux-gnu) flay (2.13.3) erubi (~> 1.10) @@ -421,6 +422,8 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.4) + nokogiri (1.18.3-arm64-darwin) + racc (~> 1.4) nokogiri (1.18.3-x86_64-linux-gnu) racc (~> 1.4) observer (0.1.2) @@ -699,6 +702,8 @@ GEM zeitwerk (2.7.2) PLATFORMS + arm64-darwin-23 + arm64-darwin-24 x86_64-linux DEPENDENCIES From 5ed4c6d718a0983d7a4826d25b705d63dbbad793 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 6 Mar 2025 18:21:12 +0100 Subject: [PATCH 18/34] comment spec --- spec/features/avo/belongs_to_spec.rb | 119 +++++++++++++-------------- 1 file changed, 55 insertions(+), 64 deletions(-) diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index d237a557ef..a9bd52f526 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -83,53 +83,6 @@ end end - context "custom primary key (UUID) handling" do - before do - # Create models and columns to test belongs_to relations with primary_key - unless ActiveRecord::Base.connection.column_exists?(:users, :uuid) - ActiveRecord::Base.connection.add_column(:users, :uuid, :string) - ActiveRecord::Base.connection.add_index(:users, :uuid, unique: true) - end - - class TestUser < User - self.table_name = "users" - self.primary_key = :uuid - - has_many :test_posts, class_name: "TestPost", foreign_key: :user_id, primary_key: :uuid - end - - class TestPost < Post - self.table_name = "posts" - - belongs_to :test_user, class_name: "TestUser", foreign_key: :user_id, primary_key: :uuid - end - end - - after do - # Delete unnecessary models and columns used only for spec - Object.send(:remove_const, :TestUser) - Object.send(:remove_const, :TestPost) - - if User.column_names.exclude?("uuid") - ActiveRecord::Base.connection.remove_column(:users, :uuid, :string) - ActiveRecord::Base.connection.remove_index(:users, :uuid, unique: true) - end - end - - let!(:uuid_user) { TestUser.create!(User.first.attributes.except("id", "created_at", "updated_at").merge(uuid: SecureRandom.uuid)) } - let!(:post) { TestPost.create!(user_id: uuid_user.uuid, slug: "test-post") } - - it "displays the user link using the UUID and stores the correct foreign key" do - visit "/admin/resources/posts/#{post.slug}" - - expect(page).to have_link uuid_user.name, href: "/admin/resources/users/#{uuid_user.uuid}?via_record_id=#{post.slug}&via_resource_class=Avo%3A%3AResources%3A%3APost" - - post.reload - - expect(post.user_id).to eq(uuid_user.uuid) - end - end - describe "with user attached" do let!(:post) { create :post, user: admin } let!(:second_user) { create :user } @@ -188,23 +141,61 @@ class TestPost < Post end end - describe "hidden columns if current association" do - let!(:user) { create :user, first_name: "Alicia" } - let!(:comment) { create :comment, body: "a comment", user: user } - - it "hides the User column" do - visit "/admin/resources/users/#{user.id}/comments?turbo_frame=has_many_field_show_comments" - - expect(find("thead")).to have_text "Id" - expect(find("thead")).to have_text "Tiny name" - expect(find("thead")).to have_text "Commentable" - expect(find("thead")).not_to have_text "User" - expect(page).to have_text comment.id - expect(page).to have_text "a comment" - # breadcrumb contains the user's name - expect(page).to have_text user.name, count: 1 - end - end + # describe "hidden columns if current association" do + # let!(:user) { create :user, first_name: "Alicia" } + # let!(:comment) { create :comment, body: "a comment", user: user } + # + # it "hides the User column" do + # visit "/admin/resources/users/#{user.id}/comments?turbo_frame=has_many_field_show_comments" + # + # expect(find("thead")).to have_text "Id" + # expect(find("thead")).to have_text "Tiny name" + # expect(find("thead")).to have_text "Commentable" + # expect(find("thead")).not_to have_text "User" + # expect(page).to have_text comment.id + # expect(page).to have_text "a comment" + # # breadcrumb contains the user's name + # expect(page).to have_text user.name, count: 1 + # end + # end + # + # describe "with custom primary key set" do + # before(:all) do + # ActiveRecord::Base.connection.add_column(:users, :uuid, :string) unless User.column_names.include?("uuid") + # ActiveRecord::Base.connection.add_index(:users, :uuid, unique: true) unless ActiveRecord::Base.connection.index_exists?(:users, :uuid) + # User.reset_column_information + # end + # + # before do + # # Tymczasowa zmiana relacji w Post + # Post.class_eval do + # belongs_to :user, class_name: "User", foreign_key: :user_id, primary_key: :uuid, optional: true + # end + # end + # + # after do + # # Przywrócenie oryginalnej relacji + # Post.class_eval do + # belongs_to :user, optional: true + # end + # end + # + # let(:uuid_user) do + # create(:user, uuid: SecureRandom.uuid, email: "testuser@test.pl", password: "password") + # end + # + # let!(:post) { create(:post, user_id: uuid_user.uuid, slug: "test-post") } + # + # it "displays the user link using the UUID and stores the correct foreign key" do + # visit "/admin/resources/posts/#{post.slug}" + # + # expect(page).to have_link uuid_user.name, href: "/admin/resources/users/#{uuid_user.uuid}?via_record_id=#{post.slug}&via_resource_class=Avo%3A%3AResources%3A%3APost" + # + # post.reload + # + # expect(post.user_id).to eq(uuid_user.uuid) + # end + # end describe "hidden columns if current polymorphic association" do let!(:user) { create :user } From 9f636f308ee14496ca95a63bf95e6fcd900a94e5 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 6 Mar 2025 18:29:42 +0100 Subject: [PATCH 19/34] uncomment spec --- spec/features/avo/belongs_to_spec.rb | 110 +++++++++++++-------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index a9bd52f526..5c6e7fbb18 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -141,61 +141,61 @@ end end - # describe "hidden columns if current association" do - # let!(:user) { create :user, first_name: "Alicia" } - # let!(:comment) { create :comment, body: "a comment", user: user } - # - # it "hides the User column" do - # visit "/admin/resources/users/#{user.id}/comments?turbo_frame=has_many_field_show_comments" - # - # expect(find("thead")).to have_text "Id" - # expect(find("thead")).to have_text "Tiny name" - # expect(find("thead")).to have_text "Commentable" - # expect(find("thead")).not_to have_text "User" - # expect(page).to have_text comment.id - # expect(page).to have_text "a comment" - # # breadcrumb contains the user's name - # expect(page).to have_text user.name, count: 1 - # end - # end - # - # describe "with custom primary key set" do - # before(:all) do - # ActiveRecord::Base.connection.add_column(:users, :uuid, :string) unless User.column_names.include?("uuid") - # ActiveRecord::Base.connection.add_index(:users, :uuid, unique: true) unless ActiveRecord::Base.connection.index_exists?(:users, :uuid) - # User.reset_column_information - # end - # - # before do - # # Tymczasowa zmiana relacji w Post - # Post.class_eval do - # belongs_to :user, class_name: "User", foreign_key: :user_id, primary_key: :uuid, optional: true - # end - # end - # - # after do - # # Przywrócenie oryginalnej relacji - # Post.class_eval do - # belongs_to :user, optional: true - # end - # end - # - # let(:uuid_user) do - # create(:user, uuid: SecureRandom.uuid, email: "testuser@test.pl", password: "password") - # end - # - # let!(:post) { create(:post, user_id: uuid_user.uuid, slug: "test-post") } - # - # it "displays the user link using the UUID and stores the correct foreign key" do - # visit "/admin/resources/posts/#{post.slug}" - # - # expect(page).to have_link uuid_user.name, href: "/admin/resources/users/#{uuid_user.uuid}?via_record_id=#{post.slug}&via_resource_class=Avo%3A%3AResources%3A%3APost" - # - # post.reload - # - # expect(post.user_id).to eq(uuid_user.uuid) - # end - # end + describe "hidden columns if current association" do + let!(:user) { create :user, first_name: "Alicia" } + let!(:comment) { create :comment, body: "a comment", user: user } + + it "hides the User column" do + visit "/admin/resources/users/#{user.id}/comments?turbo_frame=has_many_field_show_comments" + + expect(find("thead")).to have_text "Id" + expect(find("thead")).to have_text "Tiny name" + expect(find("thead")).to have_text "Commentable" + expect(find("thead")).not_to have_text "User" + expect(page).to have_text comment.id + expect(page).to have_text "a comment" + # breadcrumb contains the user's name + expect(page).to have_text user.name, count: 1 + end + end + + describe "with custom primary key set" do + before(:all) do + ActiveRecord::Base.connection.add_column(:users, :uuid, :string) unless User.column_names.include?("uuid") + ActiveRecord::Base.connection.add_index(:users, :uuid, unique: true) unless ActiveRecord::Base.connection.index_exists?(:users, :uuid) + User.reset_column_information + end + + before do + # Set temporary relation + Post.class_eval do + belongs_to :user, class_name: "User", foreign_key: :user_id, primary_key: :uuid, optional: true + end + end + + after do + # Undo temporary relation + Post.class_eval do + belongs_to :user, optional: true + end + end + + let(:uuid_user) do + create(:user, uuid: SecureRandom.uuid, email: "testuser@test.pl", password: "password") + end + + let!(:post) { create(:post, user_id: uuid_user.uuid, slug: "test-post") } + + it "displays the user link using the UUID and stores the correct foreign key" do + visit "/admin/resources/posts/#{post.slug}" + + expect(page).to have_link uuid_user.name, href: "/admin/resources/users/#{uuid_user.uuid}?via_record_id=#{post.slug}&via_resource_class=Avo%3A%3AResources%3A%3APost" + + post.reload + + expect(post.user_id).to eq(uuid_user.uuid) + end + end describe "hidden columns if current polymorphic association" do let!(:user) { create :user } From 09d3d89323ae8ad15cfe824d1527ed58e6ca528f Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 6 Mar 2025 18:58:44 +0100 Subject: [PATCH 20/34] fix spec --- spec/features/avo/belongs_to_spec.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index 5c6e7fbb18..7292221b13 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -184,15 +184,9 @@ create(:user, uuid: SecureRandom.uuid, email: "testuser@test.pl", password: "password") end - let!(:post) { create(:post, user_id: uuid_user.uuid, slug: "test-post") } + let!(:post) { create(:post, user: uuid_user, slug: "test-post") } it "displays the user link using the UUID and stores the correct foreign key" do - visit "/admin/resources/posts/#{post.slug}" - - expect(page).to have_link uuid_user.name, href: "/admin/resources/users/#{uuid_user.uuid}?via_record_id=#{post.slug}&via_resource_class=Avo%3A%3AResources%3A%3APost" - - post.reload - expect(post.user_id).to eq(uuid_user.uuid) end end From b9643e3e52b238d6561fcccd7574e17a7b55cc86 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Fri, 7 Mar 2025 15:32:58 +0100 Subject: [PATCH 21/34] try to fix spec --- spec/features/avo/belongs_to_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index 7292221b13..fbb91d5838 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -168,6 +168,10 @@ before do # Set temporary relation + User.class_eval do + self.primary_key = "uuid" + has_many :posts, foreign_key: :user_id, primary_key: :uuid + end Post.class_eval do belongs_to :user, class_name: "User", foreign_key: :user_id, primary_key: :uuid, optional: true end @@ -175,6 +179,10 @@ after do # Undo temporary relation + User.class_eval do + self.primary_key = "id" + has_many :posts, inverse_of: :user + end Post.class_eval do belongs_to :user, optional: true end From e0808bc76d1f97d0392d3c9c700737e2e2f568a2 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Mon, 10 Mar 2025 17:55:10 +0100 Subject: [PATCH 22/34] add new model, add uuid to event, fix spec --- db/factories.rb | 5 +++ spec/dummy/app/avo/resources/volunteer.rb | 14 +++++++ .../controllers/avo/volunteers_controller.rb | 4 ++ spec/dummy/app/models/event.rb | 1 + spec/dummy/app/models/volunteer.rb | 6 +++ .../20250310162810_add_uuid_to_events.rb | 6 +++ .../20250310162931_create_volunteers.rb | 12 ++++++ spec/dummy/db/schema.rb | 16 ++++++-- spec/features/avo/belongs_to_spec.rb | 38 ++----------------- 9 files changed, 65 insertions(+), 37 deletions(-) create mode 100644 spec/dummy/app/avo/resources/volunteer.rb create mode 100644 spec/dummy/app/controllers/avo/volunteers_controller.rb create mode 100644 spec/dummy/app/models/volunteer.rb create mode 100644 spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb create mode 100644 spec/dummy/db/migrate/20250310162931_create_volunteers.rb diff --git a/db/factories.rb b/db/factories.rb index dfc6ef3f9b..fc8418015c 100644 --- a/db/factories.rb +++ b/db/factories.rb @@ -144,6 +144,11 @@ body { Faker::Lorem.paragraphs(number: rand(1...3)).join("\n") } end + factory :volunteer do + name { Faker::Name.name } + role { Faker::Job.title } + end + factory :store do name { Faker::Company.name } size { ["small", "medium", "large"].sample } diff --git a/spec/dummy/app/avo/resources/volunteer.rb b/spec/dummy/app/avo/resources/volunteer.rb new file mode 100644 index 0000000000..6e46ab8654 --- /dev/null +++ b/spec/dummy/app/avo/resources/volunteer.rb @@ -0,0 +1,14 @@ +class Avo::Resources::Volunteer < Avo::BaseResource + # self.includes = [] + # self.attachments = [] + # self.search = { + # query: -> { query.ransack(id_eq: params[:q], m: "or").result(distinct: false) } + # } + + def fields + field :id, as: :id + field :name, as: :text + field :role, as: :text + field :event_uuid, as: :text + end +end diff --git a/spec/dummy/app/controllers/avo/volunteers_controller.rb b/spec/dummy/app/controllers/avo/volunteers_controller.rb new file mode 100644 index 0000000000..a7c5acde59 --- /dev/null +++ b/spec/dummy/app/controllers/avo/volunteers_controller.rb @@ -0,0 +1,4 @@ +# This controller has been generated to enable Rails' resource routes. +# More information on https://docs.avohq.io/3.0/controllers.html +class Avo::VolunteersController < Avo::ResourcesController +end diff --git a/spec/dummy/app/models/event.rb b/spec/dummy/app/models/event.rb index 0841e5e929..8db3d94b27 100644 --- a/spec/dummy/app/models/event.rb +++ b/spec/dummy/app/models/event.rb @@ -15,6 +15,7 @@ class Event < ApplicationRecord belongs_to :location, optional: true + has_many :volunteers, foreign_key: 'event_uuid' has_one_attached :profile_photo has_one_attached :cover_photo diff --git a/spec/dummy/app/models/volunteer.rb b/spec/dummy/app/models/volunteer.rb new file mode 100644 index 0000000000..f594f4dc67 --- /dev/null +++ b/spec/dummy/app/models/volunteer.rb @@ -0,0 +1,6 @@ +class Volunteer < ApplicationRecord + belongs_to :event, foreign_key: 'event_uuid', primary_key: 'uuid' + + validates :name, presence: true + validates :role, presence: true +end diff --git a/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb b/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb new file mode 100644 index 0000000000..7f01a71b23 --- /dev/null +++ b/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb @@ -0,0 +1,6 @@ +class AddUuidToEvents < ActiveRecord::Migration[8.0] + def change + add_column :events, :uuid, :uuid, default: 'gen_random_uuid()', null: false + add_index :events, :uuid, unique: true + end +end diff --git a/spec/dummy/db/migrate/20250310162931_create_volunteers.rb b/spec/dummy/db/migrate/20250310162931_create_volunteers.rb new file mode 100644 index 0000000000..48c700585a --- /dev/null +++ b/spec/dummy/db/migrate/20250310162931_create_volunteers.rb @@ -0,0 +1,12 @@ +class CreateVolunteers < ActiveRecord::Migration[8.0] + def change + create_table :volunteers do |t| + t.string :name + t.string :role + t.uuid :event_uuid, null: false + + t.timestamps + end + add_index :volunteers, :event_uuid + end +end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 6db11c3486..501cc9c399 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_03_06_105600) do +ActiveRecord::Schema[8.0].define(version: 2025_03_10_162931) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -114,7 +114,9 @@ t.datetime "updated_at", null: false t.text "body" t.bigint "location_id" + t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false t.index ["location_id"], name: "index_events_on_location_id" + t.index ["uuid"], name: "index_events_on_uuid", unique: true end create_table "fish", force: :cascade do |t| @@ -172,8 +174,7 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "price_cents", default: 0, null: false - t.string "price_currency", default: "'USD'::character varying", null: false - t.string "sizes", default: [], array: true + t.string "price_currency", default: "USD", null: false end create_table "projects", force: :cascade do |t| @@ -297,6 +298,15 @@ t.index ["team_id"], name: "index_users_on_team_id" end + create_table "volunteers", force: :cascade do |t| + t.string "name" + t.string "role" + t.uuid "event_uuid", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["event_uuid"], name: "index_volunteers_on_event_uuid" + end + add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "comments", "users" diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index fbb91d5838..0199f68fa2 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -160,42 +160,12 @@ end describe "with custom primary key set" do - before(:all) do - ActiveRecord::Base.connection.add_column(:users, :uuid, :string) unless User.column_names.include?("uuid") - ActiveRecord::Base.connection.add_index(:users, :uuid, unique: true) unless ActiveRecord::Base.connection.index_exists?(:users, :uuid) - User.reset_column_information - end - - before do - # Set temporary relation - User.class_eval do - self.primary_key = "uuid" - has_many :posts, foreign_key: :user_id, primary_key: :uuid - end - Post.class_eval do - belongs_to :user, class_name: "User", foreign_key: :user_id, primary_key: :uuid, optional: true - end - end - - after do - # Undo temporary relation - User.class_eval do - self.primary_key = "id" - has_many :posts, inverse_of: :user - end - Post.class_eval do - belongs_to :user, optional: true - end - end - - let(:uuid_user) do - create(:user, uuid: SecureRandom.uuid, email: "testuser@test.pl", password: "password") - end + let(:event) { create(:event, name: "Sample Event") } - let!(:post) { create(:post, user: uuid_user, slug: "test-post") } + let!(:volunteer) { create(:volunteer, event: event) } - it "displays the user link using the UUID and stores the correct foreign key" do - expect(post.user_id).to eq(uuid_user.uuid) + it "displays the event link using the UUID and stores the correct foreign key" do + expect(volunteer.event_uuid).to eq(event.uuid) end end From dd17f6b98fc30e4d523f7a2a740f0557b51e103c Mon Sep 17 00:00:00 2001 From: Nevelito Date: Mon, 10 Mar 2025 18:04:31 +0100 Subject: [PATCH 23/34] fix standardrb errors --- spec/dummy/app/models/event.rb | 3 +-- spec/dummy/app/models/volunteer.rb | 2 +- spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/spec/dummy/app/models/event.rb b/spec/dummy/app/models/event.rb index 8db3d94b27..8efb2ae26b 100644 --- a/spec/dummy/app/models/event.rb +++ b/spec/dummy/app/models/event.rb @@ -14,8 +14,7 @@ class Event < ApplicationRecord has_rich_text :body belongs_to :location, optional: true - - has_many :volunteers, foreign_key: 'event_uuid' + has_many :volunteers, foreign_key: "event_uuid" has_one_attached :profile_photo has_one_attached :cover_photo diff --git a/spec/dummy/app/models/volunteer.rb b/spec/dummy/app/models/volunteer.rb index f594f4dc67..7ec8f233b1 100644 --- a/spec/dummy/app/models/volunteer.rb +++ b/spec/dummy/app/models/volunteer.rb @@ -1,5 +1,5 @@ class Volunteer < ApplicationRecord - belongs_to :event, foreign_key: 'event_uuid', primary_key: 'uuid' + belongs_to :event, foreign_key: "event_uuid", primary_key: "uuid" validates :name, presence: true validates :role, presence: true diff --git a/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb b/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb index 7f01a71b23..cfe45874ed 100644 --- a/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb +++ b/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb @@ -1,6 +1,6 @@ class AddUuidToEvents < ActiveRecord::Migration[8.0] def change - add_column :events, :uuid, :uuid, default: 'gen_random_uuid()', null: false + add_column :events, :uuid, :uuid, default: "gen_random_uuid()", null: false add_index :events, :uuid, unique: true end end From 74370e7eb2922aca5e4e84ca26570612afe80a76 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Mon, 10 Mar 2025 18:16:37 +0100 Subject: [PATCH 24/34] fix bugs --- spec/dummy/app/models/volunteer.rb | 3 --- spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/spec/dummy/app/models/volunteer.rb b/spec/dummy/app/models/volunteer.rb index 7ec8f233b1..25209732fe 100644 --- a/spec/dummy/app/models/volunteer.rb +++ b/spec/dummy/app/models/volunteer.rb @@ -1,6 +1,3 @@ class Volunteer < ApplicationRecord belongs_to :event, foreign_key: "event_uuid", primary_key: "uuid" - - validates :name, presence: true - validates :role, presence: true end diff --git a/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb b/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb index cfe45874ed..d1ac131bee 100644 --- a/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb +++ b/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb @@ -1,6 +1,6 @@ class AddUuidToEvents < ActiveRecord::Migration[8.0] def change - add_column :events, :uuid, :uuid, default: "gen_random_uuid()", null: false + add_column :events, :uuid, :uuid add_index :events, :uuid, unique: true end end From 6504ea9819288cf34d4f8d3d2c4a771a53ae8b8c Mon Sep 17 00:00:00 2001 From: Nevelito Date: Mon, 10 Mar 2025 18:41:16 +0100 Subject: [PATCH 25/34] return changes from schema --- spec/dummy/app/avo/resources/volunteer.rb | 1 - spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb | 2 +- .../db/migrate/20250310173855_remove_uuid_from_events.rb | 6 ++++++ .../db/migrate/20250310173912_drop_volunteers_table.rb | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 spec/dummy/db/migrate/20250310173855_remove_uuid_from_events.rb create mode 100644 spec/dummy/db/migrate/20250310173912_drop_volunteers_table.rb diff --git a/spec/dummy/app/avo/resources/volunteer.rb b/spec/dummy/app/avo/resources/volunteer.rb index 6e46ab8654..6c1606d533 100644 --- a/spec/dummy/app/avo/resources/volunteer.rb +++ b/spec/dummy/app/avo/resources/volunteer.rb @@ -4,7 +4,6 @@ class Avo::Resources::Volunteer < Avo::BaseResource # self.search = { # query: -> { query.ransack(id_eq: params[:q], m: "or").result(distinct: false) } # } - def fields field :id, as: :id field :name, as: :text diff --git a/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb b/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb index d1ac131bee..cfe45874ed 100644 --- a/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb +++ b/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb @@ -1,6 +1,6 @@ class AddUuidToEvents < ActiveRecord::Migration[8.0] def change - add_column :events, :uuid, :uuid + add_column :events, :uuid, :uuid, default: "gen_random_uuid()", null: false add_index :events, :uuid, unique: true end end diff --git a/spec/dummy/db/migrate/20250310173855_remove_uuid_from_events.rb b/spec/dummy/db/migrate/20250310173855_remove_uuid_from_events.rb new file mode 100644 index 0000000000..d02a56265b --- /dev/null +++ b/spec/dummy/db/migrate/20250310173855_remove_uuid_from_events.rb @@ -0,0 +1,6 @@ +class RemoveUuidFromEvents < ActiveRecord::Migration[8.0] + def change + remove_index :events, :uuid + remove_column :events, :uuid + end +end diff --git a/spec/dummy/db/migrate/20250310173912_drop_volunteers_table.rb b/spec/dummy/db/migrate/20250310173912_drop_volunteers_table.rb new file mode 100644 index 0000000000..b2ce1d9c87 --- /dev/null +++ b/spec/dummy/db/migrate/20250310173912_drop_volunteers_table.rb @@ -0,0 +1,5 @@ +class DropVolunteersTable < ActiveRecord::Migration[8.0] + def change + drop_table :volunteers, if_exists: true + end +end From aff6f4395906667b405661a2190eb99034099726 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Mon, 10 Mar 2025 18:45:27 +0100 Subject: [PATCH 26/34] changes --- spec/dummy/db/schema.rb | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 501cc9c399..e0792afcda 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_03_10_162931) do +ActiveRecord::Schema[8.0].define(version: 2025_03_10_173912) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -114,9 +114,7 @@ t.datetime "updated_at", null: false t.text "body" t.bigint "location_id" - t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false t.index ["location_id"], name: "index_events_on_location_id" - t.index ["uuid"], name: "index_events_on_uuid", unique: true end create_table "fish", force: :cascade do |t| @@ -298,15 +296,6 @@ t.index ["team_id"], name: "index_users_on_team_id" end - create_table "volunteers", force: :cascade do |t| - t.string "name" - t.string "role" - t.uuid "event_uuid", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["event_uuid"], name: "index_volunteers_on_event_uuid" - end - add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "comments", "users" From a1b9396ffae72493c0156762525bddde5f05099e Mon Sep 17 00:00:00 2001 From: Nevelito Date: Mon, 10 Mar 2025 19:12:07 +0100 Subject: [PATCH 27/34] fix bugs --- db/factories.rb | 1 + .../20250310173855_remove_uuid_from_events.rb | 6 ------ .../20250310173912_drop_volunteers_table.rb | 5 ----- ...s.rb => 20250310175239_add_uuid_to_events.rb} | 2 +- ...rs.rb => 20250310175357_create_volunteers.rb} | 0 spec/dummy/db/schema.rb | 16 ++++++++++++++-- 6 files changed, 16 insertions(+), 14 deletions(-) delete mode 100644 spec/dummy/db/migrate/20250310173855_remove_uuid_from_events.rb delete mode 100644 spec/dummy/db/migrate/20250310173912_drop_volunteers_table.rb rename spec/dummy/db/migrate/{20250310162810_add_uuid_to_events.rb => 20250310175239_add_uuid_to_events.rb} (59%) rename spec/dummy/db/migrate/{20250310162931_create_volunteers.rb => 20250310175357_create_volunteers.rb} (100%) diff --git a/db/factories.rb b/db/factories.rb index fc8418015c..e8083e9012 100644 --- a/db/factories.rb +++ b/db/factories.rb @@ -138,6 +138,7 @@ end factory :event do + uuid { SecureRandom.uuid } location { create :location } name { Faker::Lorem.sentence } event_time { DateTime.now } diff --git a/spec/dummy/db/migrate/20250310173855_remove_uuid_from_events.rb b/spec/dummy/db/migrate/20250310173855_remove_uuid_from_events.rb deleted file mode 100644 index d02a56265b..0000000000 --- a/spec/dummy/db/migrate/20250310173855_remove_uuid_from_events.rb +++ /dev/null @@ -1,6 +0,0 @@ -class RemoveUuidFromEvents < ActiveRecord::Migration[8.0] - def change - remove_index :events, :uuid - remove_column :events, :uuid - end -end diff --git a/spec/dummy/db/migrate/20250310173912_drop_volunteers_table.rb b/spec/dummy/db/migrate/20250310173912_drop_volunteers_table.rb deleted file mode 100644 index b2ce1d9c87..0000000000 --- a/spec/dummy/db/migrate/20250310173912_drop_volunteers_table.rb +++ /dev/null @@ -1,5 +0,0 @@ -class DropVolunteersTable < ActiveRecord::Migration[8.0] - def change - drop_table :volunteers, if_exists: true - end -end diff --git a/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb b/spec/dummy/db/migrate/20250310175239_add_uuid_to_events.rb similarity index 59% rename from spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb rename to spec/dummy/db/migrate/20250310175239_add_uuid_to_events.rb index cfe45874ed..d1ac131bee 100644 --- a/spec/dummy/db/migrate/20250310162810_add_uuid_to_events.rb +++ b/spec/dummy/db/migrate/20250310175239_add_uuid_to_events.rb @@ -1,6 +1,6 @@ class AddUuidToEvents < ActiveRecord::Migration[8.0] def change - add_column :events, :uuid, :uuid, default: "gen_random_uuid()", null: false + add_column :events, :uuid, :uuid add_index :events, :uuid, unique: true end end diff --git a/spec/dummy/db/migrate/20250310162931_create_volunteers.rb b/spec/dummy/db/migrate/20250310175357_create_volunteers.rb similarity index 100% rename from spec/dummy/db/migrate/20250310162931_create_volunteers.rb rename to spec/dummy/db/migrate/20250310175357_create_volunteers.rb diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index e0792afcda..5822b3bfef 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_03_10_173912) do +ActiveRecord::Schema[8.0].define(version: 2025_03_10_175357) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -114,7 +114,9 @@ t.datetime "updated_at", null: false t.text "body" t.bigint "location_id" + t.uuid "uuid" t.index ["location_id"], name: "index_events_on_location_id" + t.index ["uuid"], name: "index_events_on_uuid", unique: true end create_table "fish", force: :cascade do |t| @@ -172,7 +174,8 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "price_cents", default: 0, null: false - t.string "price_currency", default: "USD", null: false + t.string "price_currency", default: "'USD'::character varying", null: false + t.string "sizes", default: [], array: true end create_table "projects", force: :cascade do |t| @@ -296,6 +299,15 @@ t.index ["team_id"], name: "index_users_on_team_id" end + create_table "volunteers", force: :cascade do |t| + t.string "name" + t.string "role" + t.uuid "event_uuid", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["event_uuid"], name: "index_volunteers_on_event_uuid" + end + add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "comments", "users" From 700db5baa307b99eed117bfcc190143455101abb Mon Sep 17 00:00:00 2001 From: Nevelito Date: Mon, 10 Mar 2025 19:22:57 +0100 Subject: [PATCH 28/34] change migration version --- spec/dummy/db/migrate/20250310175239_add_uuid_to_events.rb | 2 +- spec/dummy/db/migrate/20250310175357_create_volunteers.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/dummy/db/migrate/20250310175239_add_uuid_to_events.rb b/spec/dummy/db/migrate/20250310175239_add_uuid_to_events.rb index d1ac131bee..edc51c74d1 100644 --- a/spec/dummy/db/migrate/20250310175239_add_uuid_to_events.rb +++ b/spec/dummy/db/migrate/20250310175239_add_uuid_to_events.rb @@ -1,4 +1,4 @@ -class AddUuidToEvents < ActiveRecord::Migration[8.0] +class AddUuidToEvents < ActiveRecord::Migration[6.1] def change add_column :events, :uuid, :uuid add_index :events, :uuid, unique: true diff --git a/spec/dummy/db/migrate/20250310175357_create_volunteers.rb b/spec/dummy/db/migrate/20250310175357_create_volunteers.rb index 48c700585a..b56ee3164c 100644 --- a/spec/dummy/db/migrate/20250310175357_create_volunteers.rb +++ b/spec/dummy/db/migrate/20250310175357_create_volunteers.rb @@ -1,4 +1,4 @@ -class CreateVolunteers < ActiveRecord::Migration[8.0] +class CreateVolunteers < ActiveRecord::Migration[6.1] def change create_table :volunteers do |t| t.string :name From 7ef911ea1c6f24f8a90a3a5c4cc97ef6ca520921 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 13 Mar 2025 17:58:52 +0100 Subject: [PATCH 29/34] request changes --- lib/avo/fields/belongs_to_field.rb | 18 +++++++++++------- spec/dummy/app/avo/resources/volunteer.rb | 7 +------ spec/dummy/app/models/event.rb | 2 +- spec/features/avo/belongs_to_spec.rb | 7 ++++++- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 34a33399fe..4e9b15f621 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -117,9 +117,6 @@ def options def primary_key @primary_key ||= reflection.association_primary_key - # Quick fix for "Polymorphic associations do not support computing the class." - rescue - nil end def values_for_type(model = nil) @@ -133,7 +130,6 @@ def values_for_type(model = nil) end query.all.limit(Avo.configuration.associations_lookup_list_limit).map do |record| - # to_param uses slug so checking primary_key is unnecessary [resource.new(record: record).record_title, record.to_param] end.tap do |options| options << t("avo.more_records_available") if options.size == Avo.configuration.associations_lookup_list_limit @@ -222,14 +218,22 @@ def fill_field(record, key, value, params) else found_record = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param) - record_id = found_record&.send(primary_key.presence || :id) + record_id = if found_record.present? + found_record.send(primary_key.presence || :id) + else + found_record + end record.send(:"#{polymorphic_as}_id=", record_id) end else - found_record = value.present? ? target_resource(record:).find_record(value) : nil + found_record = value.blank? ? value : target_resource(record:).find_record(value) - record.send(:"#{key}=", found_record&.send(primary_key.presence || :id)) + if found_record.present? + record.send(:"#{key}=", found_record.send(primary_key.presence || :id)) + else + record.send(:"#{key}=", found_record) + end end record diff --git a/spec/dummy/app/avo/resources/volunteer.rb b/spec/dummy/app/avo/resources/volunteer.rb index 6c1606d533..7c4d000510 100644 --- a/spec/dummy/app/avo/resources/volunteer.rb +++ b/spec/dummy/app/avo/resources/volunteer.rb @@ -1,13 +1,8 @@ class Avo::Resources::Volunteer < Avo::BaseResource - # self.includes = [] - # self.attachments = [] - # self.search = { - # query: -> { query.ransack(id_eq: params[:q], m: "or").result(distinct: false) } - # } def fields field :id, as: :id field :name, as: :text field :role, as: :text - field :event_uuid, as: :text + field :event, as: :belongs_to, foreign_key: :event_uuid, primary_key: :uuid, placeholder: "—" end end diff --git a/spec/dummy/app/models/event.rb b/spec/dummy/app/models/event.rb index 8efb2ae26b..19ad09cc64 100644 --- a/spec/dummy/app/models/event.rb +++ b/spec/dummy/app/models/event.rb @@ -14,7 +14,7 @@ class Event < ApplicationRecord has_rich_text :body belongs_to :location, optional: true - has_many :volunteers, foreign_key: "event_uuid" + has_many :volunteers, foreign_key: :event_uuid, primary_key: :uuid has_one_attached :profile_photo has_one_attached :cover_photo diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index 0199f68fa2..fb06103ff0 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -162,10 +162,15 @@ describe "with custom primary key set" do let(:event) { create(:event, name: "Sample Event") } - let!(:volunteer) { create(:volunteer, event: event) } + let!(:volunteer) { create(:volunteer, event_uuid: event.uuid) } it "displays the event link using the UUID and stores the correct foreign key" do + visit "/admin/resources/volunteers/#{volunteer.id}" + + expect(page).to have_link event.name, href: "/admin/resources/events/#{event.id}?via_record_id=#{volunteer.id}&via_resource_class=Avo%3A%3AResources%3A%3AVolunteer" + expect(volunteer.event_uuid).to eq(event.uuid) + expect(volunteer.event).to eq(event) end end From 912c9fdd6449b3ed0aa73af3dcf31346b30b6d29 Mon Sep 17 00:00:00 2001 From: Paul Bob Date: Sat, 12 Apr 2025 09:12:16 +0300 Subject: [PATCH 30/34] wip --- lib/avo/fields/belongs_to_field.rb | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 4e9b15f621..8d12e58609 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -216,24 +216,16 @@ def fill_field(record, key, value, params) if valid_model_class.blank? || id_from_param.blank? record.send(:"#{polymorphic_as}_id=", nil) else - found_record = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param) - - record_id = if found_record.present? - found_record.send(primary_key.presence || :id) - else - found_record - end + record_id = target_resource(record:, polymorphic_model_class: value.safe_constantize) + .find_record(id_from_param) + .send(primary_key.presence || :id) record.send(:"#{polymorphic_as}_id=", record_id) end else - found_record = value.blank? ? value : target_resource(record:).find_record(value) + record_id = value.blank? ? value : target_resource(record:).find_record(value).send(primary_key.presence || :id) - if found_record.present? - record.send(:"#{key}=", found_record.send(primary_key.presence || :id)) - else - record.send(:"#{key}=", found_record) - end + record.send(:"#{key}=", record_id) end record From 8705e62c3cbdd6d80ff843df21d7ba56990b3db0 Mon Sep 17 00:00:00 2001 From: Paul Bob Date: Wed, 16 Apr 2025 20:54:12 +0300 Subject: [PATCH 31/34] fix polymorphic --- lib/avo/fields/belongs_to_field.rb | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index 8d12e58609..df274dabfe 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -115,10 +115,6 @@ def options values_for_type end - def primary_key - @primary_key ||= reflection.association_primary_key - end - def values_for_type(model = nil) resource = target_resource resource = Avo.resource_manager.get_resource_by_model_class model if model.present? @@ -216,14 +212,12 @@ def fill_field(record, key, value, params) if valid_model_class.blank? || id_from_param.blank? record.send(:"#{polymorphic_as}_id=", nil) else - record_id = target_resource(record:, polymorphic_model_class: value.safe_constantize) - .find_record(id_from_param) - .send(primary_key.presence || :id) + record_id = target_resource(record:, polymorphic_model_class: value.safe_constantize).find_record(id_from_param).id record.send(:"#{polymorphic_as}_id=", record_id) end else - record_id = value.blank? ? value : target_resource(record:).find_record(value).send(primary_key.presence || :id) + record_id = value.blank? ? value : target_resource(record:).find_record(value).send(reflection.association_primary_key.presence || :id) record.send(:"#{key}=", record_id) end From ab48b1606b350759c64e7fbd2768a5756e83c1e1 Mon Sep 17 00:00:00 2001 From: Paul Bob Date: Thu, 17 Apr 2025 19:48:41 +0300 Subject: [PATCH 32/34] update dummy --- lib/avo/fields/belongs_to_field.rb | 2 +- spec/dummy/app/models/event.rb | 2 ++ spec/dummy/app/models/volunteer.rb | 2 +- spec/dummy/db/migrate/20250310175357_create_volunteers.rb | 5 +++-- spec/dummy/db/schema.rb | 6 +++--- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/avo/fields/belongs_to_field.rb b/lib/avo/fields/belongs_to_field.rb index df274dabfe..3b8ae8e1c0 100644 --- a/lib/avo/fields/belongs_to_field.rb +++ b/lib/avo/fields/belongs_to_field.rb @@ -217,7 +217,7 @@ def fill_field(record, key, value, params) record.send(:"#{polymorphic_as}_id=", record_id) end else - record_id = value.blank? ? value : target_resource(record:).find_record(value).send(reflection.association_primary_key.presence || :id) + record_id = value.blank? ? value : target_resource(record:).find_record(value).send(reflection.association_primary_key) record.send(:"#{key}=", record_id) end diff --git a/spec/dummy/app/models/event.rb b/spec/dummy/app/models/event.rb index 9e43812aca..978c18109f 100644 --- a/spec/dummy/app/models/event.rb +++ b/spec/dummy/app/models/event.rb @@ -18,6 +18,8 @@ class Event < ApplicationRecord has_one_attached :profile_photo has_one_attached :cover_photo + before_create -> { self.uuid = SecureRandom.uuid } + def first_user User.first end diff --git a/spec/dummy/app/models/volunteer.rb b/spec/dummy/app/models/volunteer.rb index 25209732fe..d0821b7d7c 100644 --- a/spec/dummy/app/models/volunteer.rb +++ b/spec/dummy/app/models/volunteer.rb @@ -1,3 +1,3 @@ class Volunteer < ApplicationRecord - belongs_to :event, foreign_key: "event_uuid", primary_key: "uuid" + belongs_to :event, primary_key: "uuid" end diff --git a/spec/dummy/db/migrate/20250310175357_create_volunteers.rb b/spec/dummy/db/migrate/20250310175357_create_volunteers.rb index b56ee3164c..ca2fb84d08 100644 --- a/spec/dummy/db/migrate/20250310175357_create_volunteers.rb +++ b/spec/dummy/db/migrate/20250310175357_create_volunteers.rb @@ -3,10 +3,11 @@ def change create_table :volunteers do |t| t.string :name t.string :role - t.uuid :event_uuid, null: false + t.uuid :event_id, null: false t.timestamps end - add_index :volunteers, :event_uuid + + add_index :volunteers, :event_id end end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 5822b3bfef..1afdd8cb38 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -174,7 +174,7 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "price_cents", default: 0, null: false - t.string "price_currency", default: "'USD'::character varying", null: false + t.string "price_currency", default: "USD", null: false t.string "sizes", default: [], array: true end @@ -302,10 +302,10 @@ create_table "volunteers", force: :cascade do |t| t.string "name" t.string "role" - t.uuid "event_uuid", null: false + t.uuid "event_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["event_uuid"], name: "index_volunteers_on_event_uuid" + t.index ["event_id"], name: "index_volunteers_on_event_id" end add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" From 0c923bb45144e429f38aa43f733498078bc7a4a1 Mon Sep 17 00:00:00 2001 From: Paul Bob Date: Thu, 17 Apr 2025 19:56:35 +0300 Subject: [PATCH 33/34] test --- spec/features/avo/belongs_to_spec.rb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/spec/features/avo/belongs_to_spec.rb b/spec/features/avo/belongs_to_spec.rb index fb06103ff0..d351d947cb 100644 --- a/spec/features/avo/belongs_to_spec.rb +++ b/spec/features/avo/belongs_to_spec.rb @@ -160,17 +160,16 @@ end describe "with custom primary key set" do - let(:event) { create(:event, name: "Sample Event") } + let!(:event) { create(:event, name: "Sample Event") } - let!(:volunteer) { create(:volunteer, event_uuid: event.uuid) } + it "find event by uuid" do + visit avo.new_resources_volunteer_path - it "displays the event link using the UUID and stores the correct foreign key" do - visit "/admin/resources/volunteers/#{volunteer.id}" + select event.name, from: "volunteer[event_id]" - expect(page).to have_link event.name, href: "/admin/resources/events/#{event.id}?via_record_id=#{volunteer.id}&via_resource_class=Avo%3A%3AResources%3A%3AVolunteer" + click_on "Save" - expect(volunteer.event_uuid).to eq(event.uuid) - expect(volunteer.event).to eq(event) + expect(Volunteer.last).to have_attributes(event_id: event.uuid) end end From 60c550082801e38059a6466abf9c4e701d1d2286 Mon Sep 17 00:00:00 2001 From: Paul Bob Date: Thu, 17 Apr 2025 19:57:40 +0300 Subject: [PATCH 34/34] wip --- spec/dummy/app/avo/resources/volunteer.rb | 2 +- spec/dummy/app/models/event.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/dummy/app/avo/resources/volunteer.rb b/spec/dummy/app/avo/resources/volunteer.rb index 7c4d000510..9f639c485c 100644 --- a/spec/dummy/app/avo/resources/volunteer.rb +++ b/spec/dummy/app/avo/resources/volunteer.rb @@ -3,6 +3,6 @@ def fields field :id, as: :id field :name, as: :text field :role, as: :text - field :event, as: :belongs_to, foreign_key: :event_uuid, primary_key: :uuid, placeholder: "—" + field :event, as: :belongs_to, placeholder: "—" end end diff --git a/spec/dummy/app/models/event.rb b/spec/dummy/app/models/event.rb index 978c18109f..ee6de84853 100644 --- a/spec/dummy/app/models/event.rb +++ b/spec/dummy/app/models/event.rb @@ -14,7 +14,7 @@ class Event < ApplicationRecord has_rich_text :body belongs_to :location, optional: true - has_many :volunteers, foreign_key: :event_uuid, primary_key: :uuid + has_many :volunteers, primary_key: :uuid has_one_attached :profile_photo has_one_attached :cover_photo