From 0eea6e0a9381d78e5d239dd63298766eea313054 Mon Sep 17 00:00:00 2001 From: Nevelito Date: Thu, 13 Feb 2025 16:28:40 +0100 Subject: [PATCH] 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 9e6f8a8ab..96c5861c3 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