Sha256: 39f5fd1b7a06d9931d3b9cbad6f890e8bd69cf66620eee6863ac55715e9b4b9c

Contents?: true

Size: 1.59 KB

Versions: 1

Compression:

Stored size: 1.59 KB

Contents

module AdaptiveAlias
  module Hooks
    module ActiveRecordPersistence
      def _update_record
        AdaptiveAlias.rescue_statement_invalid(model_klass: self.class) do
          attribute_set_fix!
          super
        end
      end

      def _create_record(*)
        AdaptiveAlias.rescue_statement_invalid(model_klass: self.class) do
          attribute_set_fix!
          super
        end
      end

      private

      def attribute_set_fix!
        if attribute_names.any?{|name| self.class.attribute_aliases[name] }
          attributes = @attributes.instance_variable_get(:@attributes)
          attributes = attributes.instance_variable_get(:@delegate_hash) if attributes.is_a?(ActiveModel::LazyAttributeHash)

          delete_duplicate_keys!(attributes)

          attributes.transform_keys! do |key|
            self.class.attribute_aliases[key] || key
          end
        end
      end

      # delete duplicate keys caused by instantiate after migration but before patch removal.
      def delete_duplicate_keys!(attributes)
        duplicate_keys = {}
        delete_keys = []
        attributes.each do |key, _|
          aliased_key = self.class.attribute_aliases[key] || key
          delete_keys << key if duplicate_keys[aliased_key] # delete old key and keep the new one
          duplicate_keys[aliased_key] = true
        end

        delete_keys.each{|s| attributes.delete(s) }
      end
    end
  end
end

# Nested module include is not supported until ruby 3.0
class ActiveRecord::Base
  prepend AdaptiveAlias::Hooks::ActiveRecordPersistence
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
adaptive_alias-1.3.0 lib/adaptive_alias/hooks/active_record_persistence.rb