123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::Key::Composite

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Key
Instance Chain:
self, Key
Inherits: Key
  • ::Object
Defined in: activerecord/lib/active_record/key.rb

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(columns) ⇒ Composite

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 242

def initialize(columns)
  @columns = columns.map { |column| -column.to_s }.freeze
  @name = @columns
  @inferred_key = @columns.include?("id") ? Single.new("id").freeze : self
end

Instance Attribute Details

#composite? ⇒ Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 252

def composite?
  true
end

#inferred_key (readonly)

The Key form of #inferred_id.

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 314

attr_reader :inferred_key

Instance Method Details

#_value_of(record, normalizers = nil)

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 288

def _value_of(record, normalizers = nil)
  if normalizers
    Array.new(@columns.length) do |index|
      value = record._read_attribute(@columns[index])
      normalizer = normalizers[index]
      normalizer ? normalizer.call(value) : value
    end
  else
    @columns.map { |column| record._read_attribute(column) }
  end
end

#arel_columns(table)

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 260

def arel_columns(table)
  @columns.map { |column| table[column] }
end

#cast(values, model)

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 264

def cast(values, model)
  casted = []
  @columns.zip(values) do |column, value|
    casted << model.type_for_attribute(column).cast(value)
  end
  casted
end

#expects_multiple_ids?(value) ⇒ Boolean

A single composite id is itself an ::Array, so several ids are an ::Array of Arrays. An empty ::Array carries no composite id, so it is treated as an empty set of ids.

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 303

def expects_multiple_ids?(value)
  value.is_a?(Array) && (value.empty? || value.first.is_a?(Array))
end

#include?(column) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 320

def include?(column)
  @columns.include?(column)
end

#inferred_id

When a composite key has the conventional [tenant_key, "id"] shape, associations join on "id" alone; otherwise the whole key is used.

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 309

def inferred_id
  @inferred_key.name
end

#map_value

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 272

def map_value(&)
  @columns.map(&)
end

#resolve_aliases(owner)

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 328

def resolve_aliases(owner)
  if @columns.any? { |name| owner.resolve_alias(name) != name }
    Key.for(@columns.map { |n| owner.resolve_alias(n) })
  else
    self
  end
end

#subset?(other) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 324

def subset?(other)
  @columns.all? { |column| other.include?(column) }
end

#value_of(record, normalizers = nil)

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 276

def value_of(record, normalizers = nil)
  if normalizers
    Array.new(@columns.length) do |index|
      value = record.read_attr(@columns[index])
      normalizer = normalizers[index]
      normalizer ? normalizer.call(value) : value
    end
  else
    @columns.map { |column| record.read_attr(column) }
  end
end

#where_clauses(values)

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 316

def where_clauses(values)
  values.map { |set| where_hash(set) }
end

#where_hash(values)

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 256

def where_hash(values)
  @columns.zip(values).to_h
end

#zip(other)

[ GitHub ]

  
# File 'activerecord/lib/active_record/key.rb', line 248

def zip(other, &)
  @columns.zip(other.to_a, &)
end