module ActiveRecord::ConnectionAdapters::ColumnDumper
The goal of this module is to move Adapter specific column definitions to the Adapter instead of having it in the schema dumper itself. This code represents the normal case. We can then redefine how certain data types may be handled in the schema dumper on the Adapter level by over-writing this code inside the database specific adapters
Public Instance Methods
column_spec(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 9 def column_spec(column) spec = Hash[prepare_column_options(column).map { |k, v| [k, "#{k}: #{v}"] }] spec[:name] = column.name.inspect spec[:type] = schema_type(column).to_s spec end
column_spec_for_primary_key(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 16 def column_spec_for_primary_key(column) return {} if default_primary_key?(column) spec = { id: schema_type(column).inspect } spec.merge!(prepare_column_options(column).except!(:null)) end
migration_keys()
click to toggle source
Lists the valid migration options
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 55 def migration_keys [:name, :limit, :precision, :scale, :default, :null, :collation, :comment] end
prepare_column_options(column)
click to toggle source
This can be overridden on an Adapter level basis to support other extended datatypes (Example: Adding an array option in the PostgreSQL::ColumnDumper)
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 25 def prepare_column_options(column) spec = {} if limit = schema_limit(column) spec[:limit] = limit end if precision = schema_precision(column) spec[:precision] = precision end if scale = schema_scale(column) spec[:scale] = scale end default = schema_default(column) if column.has_default? spec[:default] = default unless default.nil? spec[:null] = 'false' unless column.null if collation = schema_collation(column) spec[:collation] = collation end spec[:comment] = column.comment.inspect if column.comment.present? spec end
Private Instance Methods
default_primary_key?(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 61 def default_primary_key?(column) schema_type(column) == :integer end
schema_collation(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 100 def schema_collation(column) column.collation.inspect if column.collation end
schema_default(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 86 def schema_default(column) type = lookup_cast_type_from_column(column) default = type.deserialize(column.default) if default.nil? schema_expression(column) else type.type_cast_for_schema(default) end end
schema_expression(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 96 def schema_expression(column) "-> { #{column.default_function.inspect} }" if column.default_function end
schema_limit(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 73 def schema_limit(column) limit = column.limit unless column.bigint? limit.inspect if limit && limit != native_database_types[column.type][:limit] end
schema_precision(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 78 def schema_precision(column) column.precision.inspect if column.precision end
schema_scale(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 82 def schema_scale(column) column.scale.inspect if column.scale end
schema_type(column)
click to toggle source
# File lib/active_record/connection_adapters/abstract/schema_dumper.rb, line 65 def schema_type(column) if column.bigint? :bigint else column.type end end