Module: SafeMigrations::CommandRecorderExtension

Defined in:
lib/safe_migrations/command_recorder_extension.rb

Constant Summary collapse

SAFE_METHODS =
i[
  safe_create_table
  safe_drop_table
  safe_add_column
  safe_remove_column
  safe_rename_column
  safe_add_index
  safe_remove_index
  safe_add_foreign_key
  safe_remove_foreign_key
  safe_add_column_and_index
  safe_remove_column_and_index
  safe_change_column
  safe_change_column_null
  safe_add_reference
  safe_remove_reference
  safe_add_check_constraint
  safe_remove_check_constraint
  safe_change_column_default
].freeze
SAFE_REVERSIBLE_MAP =
{
  safe_create_table: :safe_drop_table,
  safe_add_column: :safe_remove_column,
  safe_remove_column: :safe_add_column,
  safe_add_index: :safe_remove_index,
  safe_remove_index: :safe_add_index,
  safe_add_foreign_key: :safe_remove_foreign_key,
  safe_remove_foreign_key: :safe_add_foreign_key,
  safe_add_column_and_index: :safe_remove_column_and_index,
  safe_remove_column_and_index: :safe_add_column_and_index,
  safe_change_column_null: :safe_change_column_null,
  safe_rename_column: :safe_rename_column,
  safe_add_reference: :safe_remove_reference,
  safe_add_check_constraint: :safe_remove_check_constraint,
  safe_change_column_default: :safe_change_column_default
}.freeze

Class Method Summary collapse

Class Method Details

.applyObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/safe_migrations/command_recorder_extension.rb', line 43

def self.apply
  ActiveRecord::Migration::CommandRecorder.class_eval do
    SAFE_METHODS.each do |method|
      define_method(:"#{method}") do |*args, &block|
        record(:"#{method}", args, &block)
      end
      ruby2_keywords(method)
    end

    SAFE_REVERSIBLE_MAP.each do |cmd, inv|
      define_method(:"invert_#{cmd}") do |args, &block|
        [inv, args, block]
      end
    end

    # Special case for safe_rename_column (swap column names)
    def invert_safe_rename_column(args)
      table, old_col, new_col = args
      [:safe_rename_column, [table, new_col, old_col]]
    end

    # Special case for safe_change_column_null (needs invert value)
    def invert_safe_change_column_null(args)
      table, column, value = args
      [:safe_change_column_null, [table, column, !value]]
    end

    def invert_safe_change_column_default(args)
      table, column, extra = args
      reverted_extra = { to: extra[:from], from: extra[:to] }
      [:safe_change_column_default, [table, column, reverted_extra]]
    end
  end
end