Class: RuboCop::Cop::Rails::ReversibleMigration

Inherits:
RuboCop::Cop
  • Object
show all
Defined in:
lib/rubocop/cop/rails/reversible_migration.rb

Overview

This cop checks whether the change method of the migration file is reversible.

Examples:

# bad
def change
  change_table :users do |t|
    t.remove :name
  end
end

# good
def change
  create_table :users do |t|
    t.string :name
  end
end

# good
def change
  reversible do |dir|
    change_table :users do |t|
      dir.up do
        t.column :name, :string
      end

      dir.down do
        t.remove :name
      end
    end
  end
end
# drop_table

# bad
def change
  drop_table :users
end

# good
def change
  drop_table :users do |t|
    t.string :name
  end
end
# change_column_default

# bad
def change
  change_column_default(:suppliers, :qualification, 'new')
end

# good
def change
  change_column_default(:posts, :state, from: nil, to: "draft")
end
# remove_column

# bad
def change
  remove_column(:suppliers, :qualification)
end

# good
def change
  remove_column(:suppliers, :qualification, :string)
end
# remove_foreign_key

# bad
def change
  remove_foreign_key :accounts, column: :owner_id
end

# good
def change
  remove_foreign_key :accounts, :branches
end

# good
def change
  remove_foreign_key :accounts, to_table: :branches
end
# change_table

# bad
def change
  change_table :users do |t|
    t.remove :name
    t.change_default :authorized, 1
    t.change :price, :string
  end
end

# good
def change
  change_table :users do |t|
    t.string :name
  end
end

# good
def change
  reversible do |dir|
    change_table :users do |t|
      dir.up do
        t.change :price, :string
      end

      dir.down do
        t.change :price, :integer
      end
    end
  end
end

See Also:

Constant Summary collapse

MSG =
'%<action>s is not reversible.'

Instance Method Summary collapse

Instance Method Details

#on_block(node) ⇒ Object



167
168
169
170
171
172
173
# File 'lib/rubocop/cop/rails/reversible_migration.rb', line 167

def on_block(node)
  return unless within_change_method?(node)
  return if within_reversible_or_up_only_block?(node)
  return if node.body.nil?

  check_change_table_node(node.send_node, node.body)
end

#on_send(node) ⇒ Object



156
157
158
159
160
161
162
163
164
165
# File 'lib/rubocop/cop/rails/reversible_migration.rb', line 156

def on_send(node)
  return unless within_change_method?(node)
  return if within_reversible_or_up_only_block?(node)

  check_irreversible_schema_statement_node(node)
  check_drop_table_node(node)
  check_reversible_hash_node(node)
  check_remove_column_node(node)
  check_remove_foreign_key_node(node)
end