123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array

Do not use. This class is for internal use only.
Relationships & Source Files
Namespace Children
Classes:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: ActiveModel::Type::Value
Defined in: activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb

Class Method Summary

::ActiveModel::Type::Value - Inherited

.new

Initializes a type with three basic configuration settings: precision, limit, and scale.

Instance Attribute Summary

::ActiveModel::Type::Helpers::Mutable - Included

::ActiveModel::Type::Value - Inherited

#limit, #precision, #scale,
#binary?

These predicates are not documented, as I need to look further into their use, and see if they can be removed entirely.

#mutable?, #serialized?

Instance Method Summary

::ActiveModel::Type::Helpers::Mutable - Included

#cast,
#changed_in_place?

raw_old_value will be the _before_type_cast version of the value (likely a string).

::ActiveModel::Type::Value - Inherited

#==, #as_json, #assert_valid_value,
#cast

::ActiveRecord::Type casts a value from user input (e.g. from a setter).

#changed?

Determines whether a value has changed for dirty checking.

#changed_in_place?

Determines whether the mutable value has been modified since it was read.

#deserialize

Converts a value from database input to the appropriate ruby type.

#eql?
#hash,
#serializable?

Returns true if this type can convert value to a type that is usable by the database.

#serialize

Casts a value from the ruby type to a type that the database knows how to understand.

#type

Returns the unique type name as a ::Symbol.

#cast_value

Convenience method for types which do not need separate type casting behavior for user and database inputs.

#force_equality?, #map,
#type_cast_for_schema

::ActiveRecord::Type casts a value for schema dumping.

#value_constructed_by_mass_assignment?

::ActiveModel::Type::SerializeCastValue - Included

Constructor Details

.new(subtype, delimiter = ",") ⇒ Array

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 15

def initialize(subtype, delimiter = ",")
  @subtype = subtype
  @delimiter = delimiter

  @pg_encoder = PG::TextEncoder::Array.new name: "#{type}[]", delimiter: delimiter
  @pg_decoder = PG::TextDecoder::Array.new name: "#{type}[]", delimiter: delimiter
end

Instance Attribute Details

#delimiter (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 12

attr_reader :subtype, :delimiter

#limit (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 13

delegate :type, :user_input_in_time_zone, :limit, :precision, :scale, to: :subtype

#precision (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 13

delegate :type, :user_input_in_time_zone, :limit, :precision, :scale, to: :subtype

#scale (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 13

delegate :type, :user_input_in_time_zone, :limit, :precision, :scale, to: :subtype

#subtype (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 12

attr_reader :subtype, :delimiter

#type (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 13

delegate :type, :user_input_in_time_zone, :limit, :precision, :scale, to: :subtype

#user_input_in_time_zone (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 13

delegate :type, :user_input_in_time_zone, :limit, :precision, :scale, to: :subtype

Instance Method Details

#==(other)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 56

def ==(other)
  other.is_a?(Array) &&
    subtype == other.subtype &&
    delimiter == other.delimiter
end

#cast(value)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 34

def cast(value)
  if value.is_a?(::String)
    value = begin
      @pg_decoder.decode(value)
    rescue TypeError
      # malformed array string is treated as [], will raise in PG 2.0 gem
      # this keeps a consistent implementation
      []
    end
  end
  type_cast_array(value, :cast)
end

#changed_in_place?(raw_old_value, new_value) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 71

def changed_in_place?(raw_old_value, new_value)
  deserialize(raw_old_value) != new_value
end

#deserialize(value)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 23

def deserialize(value)
  case value
  when ::String
    type_cast_array(@pg_decoder.decode(value), :deserialize)
  when Data
    type_cast_array(value.values, :deserialize)
  else
    super
  end
end

#force_equality?(value) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 75

def force_equality?(value)
  value.is_a?(::Array)
end

#map(value, &block)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 67

def map(value, &block)
  value.is_a?(::Array) ? value.map(&block) : subtype.map(value, &block)
end

#serialize(value)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 47

def serialize(value)
  if value.is_a?(::Array)
    casted_values = type_cast_array(value, :serialize)
    Data.new(@pg_encoder, casted_values)
  else
    super
  end
end

#type_cast_array(value, method) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 80

def type_cast_array(value, method)
  if value.is_a?(::Array)
    value.map { |item| type_cast_array(item, method) }
  else
    @subtype.public_send(method, value)
  end
end

#type_cast_for_schema(value)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb', line 62

def type_cast_for_schema(value)
  return super unless value.is_a?(::Array)
  "[" + value.map { |v| subtype.type_cast_for_schema(v) }.join(", ") + "]"
end