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(
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