class ActiveRecord::PredicateBuilder::PolymorphicArrayValue

:nodoc:

def convert_to_id(value)

def convert_to_id(value)
  case value
  when Base
    value._read_attribute(primary_key(value))
  when Relation
    value.select(primary_key(value))
  else
    value
  end
end

def initialize(associated_table, values)

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

def klass(value)

def klass(value)
  case value
  when Base
    value.class
  when Relation
    value.klass
  end
end

def primary_key(value)

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

def queries

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

def type_to_ids_mapping

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