Class: RuboCop::Cop::Rails::AddColumnIndex

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
RangeHelp
Defined in:
lib/rubocop/cop/rails/add_column_index.rb

Overview

Checks for migrations using ‘add_column` that have an `index` key. `add_column` does not accept `index`, but also does not raise an error for extra keys, so it is possible to mistakenly add the key without realizing it will not actually add an index.

Examples:

# bad (will not add an index)
add_column :table, :column, :integer, index: true

# good
add_column :table, :column, :integer
add_index :table, :column

Constant Summary collapse

MSG =
'`add_column` does not accept an `index` key, use `add_index` instead.'
RESTRICT_ON_SEND =
%i[add_column].freeze

Instance Method Summary collapse

Instance Method Details

#add_column_with_index(node) ⇒ Object



27
28
29
30
31
32
# File 'lib/rubocop/cop/rails/add_column_index.rb', line 27

def_node_matcher :add_column_with_index, <<~PATTERN
  (
    send nil? :add_column $_table $_column
      <(hash <$(pair {(sym :index) (str "index")} $_) ...>) ...>
  )
PATTERN

#on_send(node) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/rubocop/cop/rails/add_column_index.rb', line 34

def on_send(node)
  table, column, pair, value = add_column_with_index(node)
  return unless pair

  add_offense(pair) do |corrector|
    corrector.remove(index_range(pair))

    add_index = "add_index #{table.source}, #{column.source}"
    add_index_opts = ''

    if value.hash_type?
      hash = value.source_range.adjust(begin_pos: 1, end_pos: -1).source.strip
      add_index_opts = ", #{hash}"
    end

    corrector.insert_after(node, "\n#{add_index}#{add_index_opts}")
  end
end