Class: RuboCop::Cop::Rails::BulkChangeTable
- Inherits:
-
Base
- Object
- Base
- RuboCop::Cop::Rails::BulkChangeTable
- 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` when the `Database` option is not set. If the adapter is not `mysql2` or `postgresql`, 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
- MYSQL =
'mysql'- POSTGRESQL =
'postgresql'- 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
Instance Method Summary collapse
Instance Method Details
#on_def(node) ⇒ Object
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/rubocop/cop/rails/bulk_change_table.rb', line 134 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
152 153 154 155 156 157 158 159 160 161 |
# File 'lib/rubocop/cop/rails/bulk_change_table.rb', line 152 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 |