Class: RuboCop::Cop::Rails::BulkChangeTable
- Inherits:
-
Base
- Object
- Base
- RuboCop::Cop::Rails::BulkChangeTable
- Includes:
- DatabaseTypeResolvable
- Defined in:
- lib/rubocop/cop/rails/bulk_change_table.rb
Overview
Checks whether alter queries are combinable.
If combinable queries are detected, it suggests to you
to use change_table
with bulk: true
instead.
This option causes the migration to generate a single
ALTER TABLE statement combining multiple column alterations.
The bulk
option is only supported on the MySQL and
the PostgreSQL (5.2 later) adapter; thus it will
automatically detect an adapter from development
environment
in config/database.yml
or the environment variable DATABASE_URL
when the Database
option is not set.
If the adapter is not mysql2
, trilogy
, postgresql
, or postgis
,
this Cop ignores offenses.
Defined Under Namespace
Classes: AlterMethodsRecorder
Constant Summary collapse
- MSG_FOR_CHANGE_TABLE =
<<~MSG.chomp You can combine alter queries using `bulk: true` options. MSG
- MSG_FOR_ALTER_METHODS =
<<~MSG.chomp You can use `change_table :%<table>s, bulk: true` to combine alter queries. MSG
- MIGRATION_METHODS =
%i[change up down].freeze
- COMBINABLE_TRANSFORMATIONS =
%i[ primary_key column string text integer bigint float decimal numeric datetime timestamp time date binary boolean json virtual remove change timestamps remove_timestamps ].freeze
- COMBINABLE_ALTER_METHODS =
%i[ add_column remove_column remove_columns change_column add_timestamps remove_timestamps ].freeze
- MYSQL_COMBINABLE_TRANSFORMATIONS =
%i[rename index remove_index].freeze
- MYSQL_COMBINABLE_ALTER_METHODS =
%i[rename_column add_index remove_index].freeze
- POSTGRESQL_COMBINABLE_TRANSFORMATIONS =
%i[change_default].freeze
- POSTGRESQL_COMBINABLE_ALTER_METHODS =
%i[change_column_default].freeze
Constants included from DatabaseTypeResolvable
DatabaseTypeResolvable::MYSQL, DatabaseTypeResolvable::POSTGRESQL
Instance Method Summary collapse
Methods included from DatabaseTypeResolvable
Instance Method Details
#on_def(node) ⇒ Object
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/rubocop/cop/rails/bulk_change_table.rb', line 119 def on_def(node) return unless support_bulk_alter? return unless MIGRATION_METHODS.include?(node.method_name) return unless node.body recorder = AlterMethodsRecorder.new node.body.child_nodes.each do |child_node| if call_to_combinable_alter_method? child_node recorder.process(child_node) else recorder.flush end end recorder.offensive_nodes.each { |n| add_offense_for_alter_methods(n) } end |
#on_send(node) ⇒ Object
137 138 139 140 141 142 143 144 145 146 |
# File 'lib/rubocop/cop/rails/bulk_change_table.rb', line 137 def on_send(node) return unless support_bulk_alter? return unless node.command?(:change_table) return if (node) return unless node.block_node send_nodes = send_nodes_from_change_table_block(node.block_node.body) add_offense_for_change_table(node) if count_transformations(send_nodes) > 1 end |