Sha256: 3ab0a7d02ebd36b3041e3111a62ac8d05db461447b6f8c4779131d04e4f8ce13

Contents?: true

Size: 1.37 KB

Versions: 4

Compression:

Stored size: 1.37 KB

Contents

module ActiveRecord
  class TableMetadata # :nodoc:
    # This attr_reader is private in ActiveRecord 6.0.x and public in 6.1.x. This makes sure it is always available in
    # the Spanner adapter.
    attr_reader :arel_table
  end

  module ActiveRecordBigqueryAdapterBaseExtension
    extend ActiveSupport::Concern

    class_methods do
      def bigquery_adapter?
        connection.adapter_name == 'bigquery'
      end

      def _insert_record(values)
        return super unless bigquery_adapter?

        primary_key = self.primary_key
        primary_key_value = nil

        if primary_key && values.is_a?(Hash)
          primary_key_value = values[primary_key]
        end

        metadata = TableMetadata.new(self, arel_table)
        connection.insert_async(arel_table.name, values_for_insert(metadata, values))
        primary_key_value
      end

      def values_for_insert(metadata, values)
        values.collect do |key, value|
          unwrapped_value = unwrap_attribute(value)
          type = metadata.type(key)
          [metadata.arel_table[key].name, type.serialize(unwrapped_value)]
        end.to_h
      end

      def unwrap_attribute(attr_or_value)
        if attr_or_value.is_a?(ActiveModel::Attribute)
          attr_or_value.value
        else
          attr_or_value
        end
      end
    end
  end

  Base.prepend(ActiveRecordBigqueryAdapterBaseExtension)
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
activerecord-bigquery-adapter-1.0.3 lib/activerecord_bigquery_adapter/base.rb
activerecord-bigquery-adapter-1.0.2 lib/activerecord_bigquery_adapter/base.rb
activerecord-bigquery-adapter-1.0.1 lib/activerecord_bigquery_adapter/base.rb
activerecord-bigquery-adapter-1.0.0 lib/activerecord_bigquery_adapter/base.rb