123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::PredicateBuilder::PolymorphicArrayValue

Do not use. This class is for internal use only.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(associated_table, values) ⇒ PolymorphicArrayValue

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 6

def initialize(associated_table, values)
  @associated_table = associated_table
  @values = values
end

Instance Attribute Details

#associated_table (readonly, private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 23

attr_reader :associated_table, :values

#values (readonly, private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 23

attr_reader :associated_table, :values

Instance Method Details

#convert_to_id(value) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 44

def convert_to_id(value)
  if value.is_a?(Base)
    primary_key = primary_key(value)
    if primary_key.is_a?(Array)
      primary_key.map { |column| value._read_attribute(column) }
    else
      value._read_attribute(primary_key)
    end
  elsif value.is_a?(Relation)
    value.select(primary_key(value))
  else
    value
  end
end

#klass(value) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 36

def klass(value)
  if value.is_a?(Base)
    value.class
  elsif value.is_a?(Relation)
    value.klass
  end
end

#primary_key(value) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 32

def primary_key(value)
  associated_table.join_primary_key(klass(value))
end

#queries

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 11

def queries
  return [ associated_table.join_foreign_key => values ] if values.empty?

  type_to_ids_mapping.map do |type, ids|
    query = {}
    query[associated_table.join_foreign_type] = type if type
    query[associated_table.join_foreign_key] = ids
    query
  end
end

#type_to_ids_mapping (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 25

def type_to_ids_mapping
  default_hash = Hash.new { |hsh, key| hsh[key] = [] }
  values.each_with_object(default_hash) do |value, hash|
    hash[klass(value)&.polymorphic_name] << convert_to_id(value)
  end
end