class ActiveRecord::ConnectionAdapters::ReferenceDefinition

:nodoc:

def add_to(table)

def add_to(table)
  columns.each do |name, type, options|
    table.column(name, type, **options)
  end
  if index
    table.index(column_names, **index_options(table.name))
  end
  if foreign_key
    table.foreign_key(foreign_table_name, **foreign_key_options)
  end
end

def as_options(value)

def as_options(value)
  value.is_a?(Hash) ? value : {}
end

def column_name

def column_name
  "#{name}_id"
end

def column_names

def column_names
  columns.map(&:first)
end

def columns

def columns
  result = [[column_name, type, options]]
  if polymorphic
    result.unshift(["#{name}_type", :string, polymorphic_options])
  end
  result
end

def foreign_key_options

def foreign_key_options
  as_options(foreign_key).merge(column: column_name)
end

def foreign_table_name

def foreign_table_name
  foreign_key_options.fetch(:to_table) do
    Base.pluralize_table_names ? name.to_s.pluralize : name
  end
end

def index_options(table_name)

def index_options(table_name)
  index_options = as_options(index)
  # legacy reference index names are used on versions 6.0 and earlier
  return index_options if options[:_uses_legacy_reference_index_name]
  index_options[:name] ||= polymorphic_index_name(table_name) if polymorphic
  index_options
end

def initialize(

:nodoc:
def initialize(
  name,
  polymorphic: false,
  index: true,
  foreign_key: false,
  type: :bigint,
  **options
)
  @name = name
  @polymorphic = polymorphic
  @index = index
  @foreign_key = foreign_key
  @type = type
  @options = options
  if polymorphic && foreign_key
    raise ArgumentError, "Cannot add a foreign key to a polymorphic relation"
  end
end

def polymorphic_index_name(table_name)

def polymorphic_index_name(table_name)
  "index_#{table_name}_on_#{name}"
end

def polymorphic_options

def polymorphic_options
  as_options(polymorphic).merge(options.slice(:null, :first, :after))
end