activerecord 6.1.7 → 7.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +616 -1290
- data/MIT-LICENSE +1 -1
- data/README.rdoc +31 -31
- data/examples/performance.rb +2 -2
- data/lib/active_record/aggregations.rb +17 -14
- data/lib/active_record/association_relation.rb +2 -12
- data/lib/active_record/associations/alias_tracker.rb +25 -19
- data/lib/active_record/associations/association.rb +60 -21
- data/lib/active_record/associations/association_scope.rb +17 -12
- data/lib/active_record/associations/belongs_to_association.rb +37 -11
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -4
- data/lib/active_record/associations/builder/association.rb +11 -5
- data/lib/active_record/associations/builder/belongs_to.rb +41 -14
- data/lib/active_record/associations/builder/collection_association.rb +10 -3
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -7
- data/lib/active_record/associations/builder/has_many.rb +4 -4
- data/lib/active_record/associations/builder/has_one.rb +4 -4
- data/lib/active_record/associations/builder/singular_association.rb +6 -2
- data/lib/active_record/associations/collection_association.rb +46 -36
- data/lib/active_record/associations/collection_proxy.rb +44 -16
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/errors.rb +265 -0
- data/lib/active_record/associations/foreign_association.rb +10 -3
- data/lib/active_record/associations/has_many_association.rb +29 -19
- data/lib/active_record/associations/has_many_through_association.rb +19 -8
- data/lib/active_record/associations/has_one_association.rb +20 -10
- data/lib/active_record/associations/has_one_through_association.rb +1 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +30 -27
- data/lib/active_record/associations/join_dependency.rb +28 -20
- data/lib/active_record/associations/nested_error.rb +47 -0
- data/lib/active_record/associations/preloader/association.rb +212 -53
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +153 -0
- data/lib/active_record/associations/preloader/through_association.rb +50 -16
- data/lib/active_record/associations/preloader.rb +50 -121
- data/lib/active_record/associations/singular_association.rb +15 -3
- data/lib/active_record/associations/through_association.rb +25 -14
- data/lib/active_record/associations.rb +429 -522
- data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
- data/lib/active_record/attribute_assignment.rb +1 -5
- data/lib/active_record/attribute_methods/before_type_cast.rb +24 -2
- data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
- data/lib/active_record/attribute_methods/dirty.rb +73 -22
- data/lib/active_record/attribute_methods/primary_key.rb +47 -27
- data/lib/active_record/attribute_methods/query.rb +31 -19
- data/lib/active_record/attribute_methods/read.rb +14 -11
- data/lib/active_record/attribute_methods/serialization.rb +174 -37
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +15 -9
- data/lib/active_record/attribute_methods/write.rb +12 -15
- data/lib/active_record/attribute_methods.rb +164 -52
- data/lib/active_record/attributes.rb +57 -54
- data/lib/active_record/autosave_association.rb +74 -57
- data/lib/active_record/base.rb +27 -5
- data/lib/active_record/callbacks.rb +19 -35
- data/lib/active_record/coders/column_serializer.rb +61 -0
- data/lib/active_record/coders/json.rb +1 -1
- data/lib/active_record/coders/yaml_column.rb +70 -46
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +284 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +79 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +325 -604
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +199 -60
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +230 -64
- data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -131
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +21 -20
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +186 -31
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +378 -143
- data/lib/active_record/connection_adapters/abstract/transaction.rb +361 -76
- data/lib/active_record/connection_adapters/abstract_adapter.rb +624 -163
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +348 -165
- data/lib/active_record/connection_adapters/column.rb +13 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +29 -130
- data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -55
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +10 -1
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +8 -2
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +45 -14
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +107 -68
- data/lib/active_record/connection_adapters/pool_config.rb +26 -16
- data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
- data/lib/active_record/connection_adapters/postgresql/column.rb +30 -1
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +114 -54
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +8 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +5 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -14
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +12 -3
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +137 -104
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +92 -2
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +173 -3
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +403 -77
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +520 -253
- data/lib/active_record/connection_adapters/schema_cache.rb +326 -102
- data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +78 -55
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +68 -54
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +66 -22
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +372 -130
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +229 -0
- data/lib/active_record/connection_adapters.rb +130 -6
- data/lib/active_record/connection_handling.rb +132 -146
- data/lib/active_record/core.rb +310 -253
- data/lib/active_record/counter_cache.rb +68 -34
- data/lib/active_record/database_configurations/connection_url_resolver.rb +10 -4
- data/lib/active_record/database_configurations/database_config.rb +34 -10
- data/lib/active_record/database_configurations/hash_config.rb +107 -31
- data/lib/active_record/database_configurations/url_config.rb +38 -13
- data/lib/active_record/database_configurations.rb +96 -60
- data/lib/active_record/delegated_type.rb +90 -20
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +4 -2
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +3 -3
- data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +68 -0
- data/lib/active_record/encryption/configurable.rb +60 -0
- data/lib/active_record/encryption/context.rb +42 -0
- data/lib/active_record/encryption/contexts.rb +76 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +230 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +175 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +170 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +157 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +53 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
- data/lib/active_record/encryption/message_serializer.rb +96 -0
- data/lib/active_record/encryption/null_encryptor.rb +25 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
- data/lib/active_record/encryption/scheme.rb +100 -0
- data/lib/active_record/encryption.rb +58 -0
- data/lib/active_record/enum.rb +170 -62
- data/lib/active_record/errors.rb +210 -27
- data/lib/active_record/explain.rb +21 -12
- data/lib/active_record/explain_registry.rb +11 -6
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +15 -1
- data/lib/active_record/fixture_set/model_metadata.rb +14 -4
- data/lib/active_record/fixture_set/render_context.rb +2 -0
- data/lib/active_record/fixture_set/table_row.rb +70 -14
- data/lib/active_record/fixture_set/table_rows.rb +4 -4
- data/lib/active_record/fixtures.rb +179 -112
- data/lib/active_record/future_result.rb +178 -0
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +85 -31
- data/lib/active_record/insert_all.rb +148 -32
- data/lib/active_record/integration.rb +14 -10
- data/lib/active_record/internal_metadata.rb +123 -23
- data/lib/active_record/legacy_yaml_adapter.rb +2 -39
- data/lib/active_record/locking/optimistic.rb +43 -27
- data/lib/active_record/locking/pessimistic.rb +15 -6
- data/lib/active_record/log_subscriber.rb +41 -29
- data/lib/active_record/marshalling.rb +59 -0
- data/lib/active_record/message_pack.rb +124 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +10 -10
- data/lib/active_record/middleware/database_selector.rb +23 -13
- data/lib/active_record/middleware/shard_selector.rb +62 -0
- data/lib/active_record/migration/command_recorder.rb +113 -16
- data/lib/active_record/migration/compatibility.rb +235 -46
- data/lib/active_record/migration/default_strategy.rb +22 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration/join_table.rb +1 -1
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +374 -177
- data/lib/active_record/model_schema.rb +145 -158
- data/lib/active_record/nested_attributes.rb +61 -23
- data/lib/active_record/no_touching.rb +3 -3
- data/lib/active_record/normalization.rb +163 -0
- data/lib/active_record/persistence.rb +282 -283
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +18 -25
- data/lib/active_record/query_logs.rb +189 -0
- data/lib/active_record/query_logs_formatter.rb +41 -0
- data/lib/active_record/querying.rb +44 -9
- data/lib/active_record/railtie.rb +229 -71
- data/lib/active_record/railties/controller_runtime.rb +25 -11
- data/lib/active_record/railties/databases.rake +189 -256
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +41 -3
- data/lib/active_record/reflection.rb +332 -103
- data/lib/active_record/relation/batches/batch_enumerator.rb +38 -9
- data/lib/active_record/relation/batches.rb +200 -65
- data/lib/active_record/relation/calculations.rb +301 -112
- data/lib/active_record/relation/delegation.rb +33 -22
- data/lib/active_record/relation/finder_methods.rb +123 -52
- data/lib/active_record/relation/merger.rb +26 -19
- data/lib/active_record/relation/predicate_builder/array_handler.rb +2 -2
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +38 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -7
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
- data/lib/active_record/relation/predicate_builder.rb +29 -22
- data/lib/active_record/relation/query_attribute.rb +30 -12
- data/lib/active_record/relation/query_methods.rb +870 -163
- data/lib/active_record/relation/record_fetch_warning.rb +10 -9
- data/lib/active_record/relation/spawn_methods.rb +7 -6
- data/lib/active_record/relation/where_clause.rb +15 -36
- data/lib/active_record/relation.rb +736 -145
- data/lib/active_record/result.rb +67 -54
- data/lib/active_record/runtime_registry.rb +71 -13
- data/lib/active_record/sanitization.rb +84 -34
- data/lib/active_record/schema.rb +39 -23
- data/lib/active_record/schema_dumper.rb +90 -31
- data/lib/active_record/schema_migration.rb +74 -23
- data/lib/active_record/scoping/default.rb +72 -15
- data/lib/active_record/scoping/named.rb +6 -13
- data/lib/active_record/scoping.rb +65 -34
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +21 -3
- data/lib/active_record/serialization.rb +6 -1
- data/lib/active_record/signed_id.rb +30 -9
- data/lib/active_record/statement_cache.rb +7 -7
- data/lib/active_record/store.rb +10 -10
- data/lib/active_record/suppressor.rb +13 -15
- data/lib/active_record/table_metadata.rb +7 -3
- data/lib/active_record/tasks/database_tasks.rb +288 -149
- data/lib/active_record/tasks/mysql_database_tasks.rb +16 -7
- data/lib/active_record/tasks/postgresql_database_tasks.rb +35 -26
- data/lib/active_record/tasks/sqlite_database_tasks.rb +16 -7
- data/lib/active_record/test_databases.rb +1 -1
- data/lib/active_record/test_fixtures.rb +173 -155
- data/lib/active_record/testing/query_assertions.rb +121 -0
- data/lib/active_record/timestamp.rb +32 -19
- data/lib/active_record/token_for.rb +123 -0
- data/lib/active_record/touch_later.rb +12 -7
- data/lib/active_record/transaction.rb +132 -0
- data/lib/active_record/transactions.rb +118 -41
- data/lib/active_record/translation.rb +3 -5
- data/lib/active_record/type/adapter_specific_registry.rb +32 -14
- data/lib/active_record/type/hash_lookup_type_map.rb +34 -1
- data/lib/active_record/type/internal/timezone.rb +7 -2
- data/lib/active_record/type/serialized.rb +9 -7
- data/lib/active_record/type/time.rb +4 -0
- data/lib/active_record/type/type_map.rb +17 -20
- data/lib/active_record/type.rb +1 -2
- data/lib/active_record/type_caster/connection.rb +4 -4
- data/lib/active_record/validations/absence.rb +1 -1
- data/lib/active_record/validations/associated.rb +13 -7
- data/lib/active_record/validations/numericality.rb +5 -4
- data/lib/active_record/validations/presence.rb +5 -28
- data/lib/active_record/validations/uniqueness.rb +65 -15
- data/lib/active_record/validations.rb +12 -5
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +444 -32
- data/lib/arel/alias_predication.rb +1 -1
- data/lib/arel/attributes/attribute.rb +0 -8
- data/lib/arel/collectors/bind.rb +2 -0
- data/lib/arel/collectors/composite.rb +7 -0
- data/lib/arel/collectors/sql_string.rb +1 -1
- data/lib/arel/collectors/substitute_binds.rb +1 -1
- data/lib/arel/crud.rb +28 -22
- data/lib/arel/delete_manager.rb +18 -4
- data/lib/arel/errors.rb +10 -0
- data/lib/arel/factory_methods.rb +4 -0
- data/lib/arel/filter_predications.rb +9 -0
- data/lib/arel/insert_manager.rb +2 -3
- data/lib/arel/nodes/binary.rb +6 -7
- data/lib/arel/nodes/bound_sql_literal.rb +65 -0
- data/lib/arel/nodes/casted.rb +1 -1
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/delete_statement.rb +12 -13
- data/lib/arel/nodes/filter.rb +10 -0
- data/lib/arel/nodes/fragments.rb +35 -0
- data/lib/arel/nodes/function.rb +1 -0
- data/lib/arel/nodes/homogeneous_in.rb +1 -9
- data/lib/arel/nodes/insert_statement.rb +2 -2
- data/lib/arel/nodes/leading_join.rb +8 -0
- data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
- data/lib/arel/nodes/node.rb +115 -5
- data/lib/arel/nodes/select_core.rb +2 -2
- data/lib/arel/nodes/select_statement.rb +2 -2
- data/lib/arel/nodes/sql_literal.rb +13 -0
- data/lib/arel/nodes/table_alias.rb +4 -0
- data/lib/arel/nodes/update_statement.rb +8 -3
- data/lib/arel/nodes.rb +7 -2
- data/lib/arel/predications.rb +14 -4
- data/lib/arel/select_manager.rb +11 -5
- data/lib/arel/table.rb +9 -6
- data/lib/arel/tree_manager.rb +8 -15
- data/lib/arel/update_manager.rb +20 -5
- data/lib/arel/visitors/dot.rb +81 -90
- data/lib/arel/visitors/mysql.rb +23 -5
- data/lib/arel/visitors/postgresql.rb +1 -22
- data/lib/arel/visitors/sqlite.rb +25 -0
- data/lib/arel/visitors/to_sql.rb +170 -36
- data/lib/arel/visitors/visitor.rb +2 -2
- data/lib/arel.rb +23 -4
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +4 -1
- data/lib/rails/generators/active_record/migration.rb +3 -1
- data/lib/rails/generators/active_record/model/USAGE +113 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
- data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
- data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
- metadata +103 -17
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
- data/lib/active_record/null_relation.rb +0 -67
@@ -2,35 +2,44 @@
|
|
2
2
|
|
3
3
|
module ActiveRecord
|
4
4
|
class Migration
|
5
|
-
#
|
5
|
+
# = \Migration Command Recorder
|
6
|
+
#
|
7
|
+
# +ActiveRecord::Migration::CommandRecorder+ records commands done during
|
6
8
|
# a migration and knows how to reverse those commands. The CommandRecorder
|
7
9
|
# knows how to invert the following commands:
|
8
10
|
#
|
9
11
|
# * add_column
|
10
12
|
# * add_foreign_key
|
11
13
|
# * add_check_constraint
|
14
|
+
# * add_exclusion_constraint
|
15
|
+
# * add_unique_constraint
|
12
16
|
# * add_index
|
13
17
|
# * add_reference
|
14
18
|
# * add_timestamps
|
15
|
-
# *
|
16
|
-
# * change_column_default (must supply a :from and :to option)
|
19
|
+
# * change_column_default (must supply a +:from+ and +:to+ option)
|
17
20
|
# * change_column_null
|
18
|
-
# * change_column_comment (must supply a
|
19
|
-
# * change_table_comment (must supply a
|
21
|
+
# * change_column_comment (must supply a +:from+ and +:to+ option)
|
22
|
+
# * change_table_comment (must supply a +:from+ and +:to+ option)
|
23
|
+
# * create_enum
|
20
24
|
# * create_join_table
|
21
25
|
# * create_table
|
22
26
|
# * disable_extension
|
27
|
+
# * drop_enum (must supply a list of values)
|
23
28
|
# * drop_join_table
|
24
29
|
# * drop_table (must supply a block)
|
25
30
|
# * enable_extension
|
26
31
|
# * remove_column (must supply a type)
|
27
|
-
# * remove_columns (must
|
32
|
+
# * remove_columns (must supply a +:type+ option)
|
28
33
|
# * remove_foreign_key (must supply a second table)
|
29
34
|
# * remove_check_constraint
|
35
|
+
# * remove_exclusion_constraint
|
36
|
+
# * remove_unique_constraint
|
30
37
|
# * remove_index
|
31
38
|
# * remove_reference
|
32
39
|
# * remove_timestamps
|
33
40
|
# * rename_column
|
41
|
+
# * rename_enum (must supply a +:to+ option)
|
42
|
+
# * rename_enum_value (must supply a +:from+ and +:to+ option)
|
34
43
|
# * rename_index
|
35
44
|
# * rename_table
|
36
45
|
class CommandRecorder
|
@@ -42,7 +51,10 @@ module ActiveRecord
|
|
42
51
|
:change_column, :execute, :remove_columns, :change_column_null,
|
43
52
|
:add_foreign_key, :remove_foreign_key,
|
44
53
|
:change_column_comment, :change_table_comment,
|
45
|
-
:add_check_constraint, :remove_check_constraint
|
54
|
+
:add_check_constraint, :remove_check_constraint,
|
55
|
+
:add_exclusion_constraint, :remove_exclusion_constraint,
|
56
|
+
:add_unique_constraint, :remove_unique_constraint,
|
57
|
+
:create_enum, :drop_enum, :rename_enum, :add_enum_value, :rename_enum_value,
|
46
58
|
]
|
47
59
|
include JoinTable
|
48
60
|
|
@@ -112,13 +124,21 @@ module ActiveRecord
|
|
112
124
|
record(:"#{method}", args, &block) # record(:create_table, args, &block)
|
113
125
|
end # end
|
114
126
|
EOV
|
115
|
-
ruby2_keywords(method)
|
127
|
+
ruby2_keywords(method)
|
116
128
|
end
|
117
129
|
alias :add_belongs_to :add_reference
|
118
130
|
alias :remove_belongs_to :remove_reference
|
119
131
|
|
120
132
|
def change_table(table_name, **options) # :nodoc:
|
121
|
-
|
133
|
+
if delegate.supports_bulk_alter? && options[:bulk]
|
134
|
+
recorder = self.class.new(self.delegate)
|
135
|
+
recorder.reverting = @reverting
|
136
|
+
yield recorder.delegate.update_table_definition(table_name, recorder)
|
137
|
+
commands = recorder.commands
|
138
|
+
@commands << [:change_table, [table_name], -> t { bulk_change_table(table_name, commands) }]
|
139
|
+
else
|
140
|
+
yield delegate.update_table_definition(table_name, self)
|
141
|
+
end
|
122
142
|
end
|
123
143
|
|
124
144
|
def replay(migration)
|
@@ -140,7 +160,10 @@ module ActiveRecord
|
|
140
160
|
add_reference: :remove_reference,
|
141
161
|
add_foreign_key: :remove_foreign_key,
|
142
162
|
add_check_constraint: :remove_check_constraint,
|
143
|
-
|
163
|
+
add_exclusion_constraint: :remove_exclusion_constraint,
|
164
|
+
add_unique_constraint: :remove_unique_constraint,
|
165
|
+
enable_extension: :disable_extension,
|
166
|
+
create_enum: :drop_enum
|
144
167
|
}.each do |cmd, inv|
|
145
168
|
[[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
|
146
169
|
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
@@ -154,9 +177,9 @@ module ActiveRecord
|
|
154
177
|
|
155
178
|
include StraightReversions
|
156
179
|
|
157
|
-
def invert_transaction(args)
|
180
|
+
def invert_transaction(args, &block)
|
158
181
|
sub_recorder = CommandRecorder.new(delegate)
|
159
|
-
sub_recorder.revert
|
182
|
+
sub_recorder.revert(&block)
|
160
183
|
|
161
184
|
invertions_proc = proc {
|
162
185
|
sub_recorder.replay(self)
|
@@ -165,7 +188,17 @@ module ActiveRecord
|
|
165
188
|
[:transaction, args, invertions_proc]
|
166
189
|
end
|
167
190
|
|
191
|
+
def invert_create_table(args, &block)
|
192
|
+
if args.last.is_a?(Hash)
|
193
|
+
args.last.delete(:if_not_exists)
|
194
|
+
end
|
195
|
+
super
|
196
|
+
end
|
197
|
+
|
168
198
|
def invert_drop_table(args, &block)
|
199
|
+
if args.last.is_a?(Hash)
|
200
|
+
args.last.delete(:if_exists)
|
201
|
+
end
|
169
202
|
if args.size == 1 && block == nil
|
170
203
|
raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
|
171
204
|
end
|
@@ -173,7 +206,10 @@ module ActiveRecord
|
|
173
206
|
end
|
174
207
|
|
175
208
|
def invert_rename_table(args)
|
176
|
-
|
209
|
+
old_name, new_name, options = args
|
210
|
+
args = [new_name, old_name]
|
211
|
+
args << options if options
|
212
|
+
[:rename_table, args]
|
177
213
|
end
|
178
214
|
|
179
215
|
def invert_remove_column(args)
|
@@ -235,6 +271,11 @@ module ActiveRecord
|
|
235
271
|
[:change_column_null, args]
|
236
272
|
end
|
237
273
|
|
274
|
+
def invert_add_foreign_key(args)
|
275
|
+
args.last.delete(:validate) if args.last.is_a?(Hash)
|
276
|
+
super
|
277
|
+
end
|
278
|
+
|
238
279
|
def invert_remove_foreign_key(args)
|
239
280
|
options = args.extract_options!
|
240
281
|
from_table, to_table = args
|
@@ -269,24 +310,80 @@ module ActiveRecord
|
|
269
310
|
[:change_table_comment, [table, from: options[:to], to: options[:from]]]
|
270
311
|
end
|
271
312
|
|
313
|
+
def invert_add_check_constraint(args)
|
314
|
+
if (options = args.last).is_a?(Hash)
|
315
|
+
options.delete(:validate)
|
316
|
+
options[:if_exists] = options.delete(:if_not_exists) if options.key?(:if_not_exists)
|
317
|
+
end
|
318
|
+
super
|
319
|
+
end
|
320
|
+
|
272
321
|
def invert_remove_check_constraint(args)
|
273
322
|
raise ActiveRecord::IrreversibleMigration, "remove_check_constraint is only reversible if given an expression." if args.size < 2
|
323
|
+
|
324
|
+
if (options = args.last).is_a?(Hash)
|
325
|
+
options[:if_not_exists] = options.delete(:if_exists) if options.key?(:if_exists)
|
326
|
+
end
|
327
|
+
super
|
328
|
+
end
|
329
|
+
|
330
|
+
def invert_remove_exclusion_constraint(args)
|
331
|
+
raise ActiveRecord::IrreversibleMigration, "remove_exclusion_constraint is only reversible if given an expression." if args.size < 2
|
332
|
+
super
|
333
|
+
end
|
334
|
+
|
335
|
+
def invert_add_unique_constraint(args)
|
336
|
+
options = args.dup.extract_options!
|
337
|
+
|
338
|
+
raise ActiveRecord::IrreversibleMigration, "add_unique_constraint is not reversible if given an using_index." if options[:using_index]
|
274
339
|
super
|
275
340
|
end
|
276
341
|
|
342
|
+
def invert_remove_unique_constraint(args)
|
343
|
+
_table, columns = args.dup.tap(&:extract_options!)
|
344
|
+
|
345
|
+
raise ActiveRecord::IrreversibleMigration, "remove_unique_constraint is only reversible if given an column_name." if columns.blank?
|
346
|
+
super
|
347
|
+
end
|
348
|
+
|
349
|
+
def invert_drop_enum(args)
|
350
|
+
_enum, values = args.dup.tap(&:extract_options!)
|
351
|
+
raise ActiveRecord::IrreversibleMigration, "drop_enum is only reversible if given a list of enum values." unless values
|
352
|
+
super
|
353
|
+
end
|
354
|
+
|
355
|
+
def invert_rename_enum(args)
|
356
|
+
name, options = args
|
357
|
+
|
358
|
+
unless options.is_a?(Hash) && options.has_key?(:to)
|
359
|
+
raise ActiveRecord::IrreversibleMigration, "rename_enum is only reversible if given a :to option."
|
360
|
+
end
|
361
|
+
|
362
|
+
[:rename_enum, [options[:to], to: name]]
|
363
|
+
end
|
364
|
+
|
365
|
+
def invert_rename_enum_value(args)
|
366
|
+
type_name, options = args
|
367
|
+
|
368
|
+
unless options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
|
369
|
+
raise ActiveRecord::IrreversibleMigration, "rename_enum_value is only reversible if given a :from and :to option."
|
370
|
+
end
|
371
|
+
|
372
|
+
[:rename_enum_value, [type_name, from: options[:to], to: options[:from]]]
|
373
|
+
end
|
374
|
+
|
277
375
|
def respond_to_missing?(method, _)
|
278
376
|
super || delegate.respond_to?(method)
|
279
377
|
end
|
280
378
|
|
281
379
|
# Forwards any missing method call to the \target.
|
282
|
-
def method_missing(method,
|
380
|
+
def method_missing(method, ...)
|
283
381
|
if delegate.respond_to?(method)
|
284
|
-
delegate.public_send(method,
|
382
|
+
delegate.public_send(method, ...)
|
285
383
|
else
|
286
384
|
super
|
287
385
|
end
|
288
386
|
end
|
289
|
-
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
290
387
|
end
|
291
388
|
end
|
292
389
|
end
|
@@ -13,45 +13,236 @@ module ActiveRecord
|
|
13
13
|
const_get(name)
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
# This file exists to ensure that old migrations run the same way they did before a Rails upgrade.
|
17
|
+
# e.g. if you write a migration on Rails 6.1, then upgrade to Rails 7, the migration should do the same thing to your
|
18
|
+
# database as it did when you were running Rails 6.1
|
19
|
+
#
|
20
|
+
# "Current" is an alias for `ActiveRecord::Migration`, it represents the current Rails version.
|
21
|
+
# New migration functionality that will never be backward compatible should be added directly to `ActiveRecord::Migration`.
|
22
|
+
#
|
23
|
+
# There are classes for each prior Rails version. Each class descends from the *next* Rails version, so:
|
24
|
+
# 5.2 < 6.0 < 6.1 < 7.0 < 7.1 < 7.2
|
25
|
+
#
|
26
|
+
# If you are introducing new migration functionality that should only apply from Rails 7 onward, then you should
|
27
|
+
# find the class that immediately precedes it (6.1), and override the relevant migration methods to undo your changes.
|
28
|
+
#
|
29
|
+
# For example, Rails 6 added a default value for the `precision` option on datetime columns. So in this file, the `V5_2`
|
30
|
+
# class sets the value of `precision` to `nil` if it's not explicitly provided. This way, the default value will not apply
|
31
|
+
# for migrations written for 5.2, but will for migrations written for 6.0.
|
32
|
+
V7_2 = Current
|
33
|
+
|
34
|
+
class V7_1 < V7_2
|
35
|
+
end
|
17
36
|
|
18
|
-
class
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
37
|
+
class V7_0 < V7_1
|
38
|
+
module LegacyIndexName
|
39
|
+
private
|
40
|
+
def legacy_index_name(table_name, options)
|
41
|
+
if Hash === options
|
42
|
+
if options[:column]
|
43
|
+
"index_#{table_name}_on_#{Array(options[:column]) * '_and_'}"
|
44
|
+
elsif options[:name]
|
45
|
+
options[:name]
|
46
|
+
else
|
47
|
+
raise ArgumentError, "You must specify the index name"
|
48
|
+
end
|
49
|
+
else
|
50
|
+
legacy_index_name(table_name, index_name_options(options))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def index_name_options(column_names)
|
55
|
+
if expression_column_name?(column_names)
|
56
|
+
column_names = column_names.scan(/\w+/).join("_")
|
57
|
+
end
|
58
|
+
|
59
|
+
{ column: column_names }
|
60
|
+
end
|
61
|
+
|
62
|
+
def expression_column_name?(column_name)
|
63
|
+
column_name.is_a?(String) && /\W/.match?(column_name)
|
64
|
+
end
|
23
65
|
end
|
24
66
|
|
25
67
|
module TableDefinition
|
68
|
+
include LegacyIndexName
|
69
|
+
|
70
|
+
def column(name, type, **options)
|
71
|
+
options[:_skip_validate_options] = true
|
72
|
+
super
|
73
|
+
end
|
74
|
+
|
75
|
+
def change(name, type, **options)
|
76
|
+
options[:_skip_validate_options] = true
|
77
|
+
super
|
78
|
+
end
|
79
|
+
|
80
|
+
def index(column_name, **options)
|
81
|
+
options[:name] = legacy_index_name(name, column_name) if options[:name].nil?
|
82
|
+
super
|
83
|
+
end
|
84
|
+
|
26
85
|
def references(*args, **options)
|
27
|
-
options[:
|
86
|
+
options[:_skip_validate_options] = true
|
28
87
|
super
|
29
88
|
end
|
30
|
-
|
89
|
+
|
90
|
+
private
|
91
|
+
def raise_on_if_exist_options(options)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
include LegacyIndexName
|
96
|
+
|
97
|
+
def add_column(table_name, column_name, type, **options)
|
98
|
+
options[:_skip_validate_options] = true
|
99
|
+
super
|
100
|
+
end
|
101
|
+
|
102
|
+
def add_index(table_name, column_name, **options)
|
103
|
+
options[:name] = legacy_index_name(table_name, column_name) if options[:name].nil?
|
104
|
+
super
|
105
|
+
end
|
106
|
+
|
107
|
+
def add_reference(table_name, ref_name, **options)
|
108
|
+
options[:_skip_validate_options] = true
|
109
|
+
super
|
31
110
|
end
|
111
|
+
alias :add_belongs_to :add_reference
|
32
112
|
|
33
113
|
def create_table(table_name, **options)
|
34
|
-
|
35
|
-
|
36
|
-
|
114
|
+
options[:_uses_legacy_table_name] = true
|
115
|
+
options[:_skip_validate_options] = true
|
116
|
+
|
117
|
+
super
|
118
|
+
end
|
119
|
+
|
120
|
+
def rename_table(table_name, new_name, **options)
|
121
|
+
options[:_uses_legacy_table_name] = true
|
122
|
+
options[:_uses_legacy_index_name] = true
|
123
|
+
super
|
124
|
+
end
|
125
|
+
|
126
|
+
def change_column(table_name, column_name, type, **options)
|
127
|
+
options[:_skip_validate_options] = true
|
128
|
+
if connection.adapter_name == "Mysql2" || connection.adapter_name == "Trilogy"
|
129
|
+
options[:collation] ||= :no_collation
|
130
|
+
end
|
131
|
+
super
|
132
|
+
end
|
133
|
+
|
134
|
+
def change_column_null(table_name, column_name, null, default = nil)
|
135
|
+
super(table_name, column_name, !!null, default)
|
136
|
+
end
|
137
|
+
|
138
|
+
def disable_extension(name, **options)
|
139
|
+
if connection.adapter_name == "PostgreSQL"
|
140
|
+
options[:force] = :cascade
|
141
|
+
end
|
142
|
+
super
|
143
|
+
end
|
144
|
+
|
145
|
+
def add_foreign_key(from_table, to_table, **options)
|
146
|
+
if connection.adapter_name == "PostgreSQL" && options[:deferrable] == true
|
147
|
+
options[:deferrable] = :immediate
|
148
|
+
end
|
149
|
+
super
|
150
|
+
end
|
151
|
+
|
152
|
+
private
|
153
|
+
def compatible_table_definition(t)
|
154
|
+
class << t
|
155
|
+
prepend TableDefinition
|
156
|
+
end
|
37
157
|
super
|
38
158
|
end
|
159
|
+
end
|
160
|
+
|
161
|
+
class V6_1 < V7_0
|
162
|
+
class PostgreSQLCompat
|
163
|
+
def self.compatible_timestamp_type(type, connection)
|
164
|
+
if connection.adapter_name == "PostgreSQL"
|
165
|
+
# For Rails <= 6.1, :datetime was aliased to :timestamp
|
166
|
+
# See: https://github.com/rails/rails/blob/v6.1.3.2/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L108
|
167
|
+
# From Rails 7 onwards, you can define what :datetime resolves to (the default is still :timestamp)
|
168
|
+
# See `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type`
|
169
|
+
type.to_sym == :datetime ? :timestamp : type
|
170
|
+
else
|
171
|
+
type
|
172
|
+
end
|
173
|
+
end
|
39
174
|
end
|
40
175
|
|
41
|
-
def
|
42
|
-
if
|
43
|
-
|
44
|
-
|
176
|
+
def add_column(table_name, column_name, type, **options)
|
177
|
+
if type == :datetime
|
178
|
+
options[:precision] ||= nil
|
179
|
+
end
|
180
|
+
|
181
|
+
type = PostgreSQLCompat.compatible_timestamp_type(type, connection)
|
182
|
+
super
|
183
|
+
end
|
184
|
+
|
185
|
+
def change_column(table_name, column_name, type, **options)
|
186
|
+
if type == :datetime
|
187
|
+
options[:precision] ||= nil
|
188
|
+
end
|
189
|
+
|
190
|
+
type = PostgreSQLCompat.compatible_timestamp_type(type, connection)
|
191
|
+
super
|
192
|
+
end
|
193
|
+
|
194
|
+
module TableDefinition
|
195
|
+
def new_column_definition(name, type, **options)
|
196
|
+
type = PostgreSQLCompat.compatible_timestamp_type(type, @conn)
|
197
|
+
super
|
198
|
+
end
|
199
|
+
|
200
|
+
def change(name, type, index: nil, **options)
|
201
|
+
options[:precision] ||= nil
|
202
|
+
super
|
203
|
+
end
|
204
|
+
|
205
|
+
def column(name, type, index: nil, **options)
|
206
|
+
options[:precision] ||= nil
|
45
207
|
super
|
46
208
|
end
|
209
|
+
|
210
|
+
private
|
211
|
+
def raise_on_if_exist_options(options)
|
212
|
+
end
|
47
213
|
end
|
48
214
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
215
|
+
private
|
216
|
+
def compatible_table_definition(t)
|
217
|
+
class << t
|
218
|
+
prepend TableDefinition
|
219
|
+
end
|
53
220
|
super
|
54
221
|
end
|
222
|
+
end
|
223
|
+
|
224
|
+
class V6_0 < V6_1
|
225
|
+
class ReferenceDefinition < ConnectionAdapters::ReferenceDefinition
|
226
|
+
def index_options(table_name)
|
227
|
+
as_options(index)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
module TableDefinition
|
232
|
+
def references(*args, **options)
|
233
|
+
options[:_uses_legacy_reference_index_name] = true
|
234
|
+
super
|
235
|
+
end
|
236
|
+
alias :belongs_to :references
|
237
|
+
|
238
|
+
def column(name, type, index: nil, **options)
|
239
|
+
options[:precision] ||= nil
|
240
|
+
super
|
241
|
+
end
|
242
|
+
|
243
|
+
private
|
244
|
+
def raise_on_if_exist_options(options)
|
245
|
+
end
|
55
246
|
end
|
56
247
|
|
57
248
|
def add_reference(table_name, ref_name, **options)
|
@@ -69,7 +260,7 @@ module ActiveRecord
|
|
69
260
|
class << t
|
70
261
|
prepend TableDefinition
|
71
262
|
end
|
72
|
-
|
263
|
+
super
|
73
264
|
end
|
74
265
|
end
|
75
266
|
|
@@ -79,6 +270,18 @@ module ActiveRecord
|
|
79
270
|
options[:precision] ||= nil
|
80
271
|
super
|
81
272
|
end
|
273
|
+
|
274
|
+
def column(name, type, index: nil, **options)
|
275
|
+
options[:precision] ||= nil
|
276
|
+
super
|
277
|
+
end
|
278
|
+
|
279
|
+
private
|
280
|
+
def raise_on_if_exist_options(options)
|
281
|
+
end
|
282
|
+
|
283
|
+
def raise_on_duplicate_column(name)
|
284
|
+
end
|
82
285
|
end
|
83
286
|
|
84
287
|
module CommandRecorder
|
@@ -95,30 +298,6 @@ module ActiveRecord
|
|
95
298
|
end
|
96
299
|
end
|
97
300
|
|
98
|
-
def create_table(table_name, **options)
|
99
|
-
if block_given?
|
100
|
-
super { |t| yield compatible_table_definition(t) }
|
101
|
-
else
|
102
|
-
super
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def change_table(table_name, **options)
|
107
|
-
if block_given?
|
108
|
-
super { |t| yield compatible_table_definition(t) }
|
109
|
-
else
|
110
|
-
super
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def create_join_table(table_1, table_2, **options)
|
115
|
-
if block_given?
|
116
|
-
super { |t| yield compatible_table_definition(t) }
|
117
|
-
else
|
118
|
-
super
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
301
|
def add_timestamps(table_name, **options)
|
123
302
|
options[:precision] ||= nil
|
124
303
|
super
|
@@ -154,7 +333,7 @@ module ActiveRecord
|
|
154
333
|
end
|
155
334
|
|
156
335
|
def create_table(table_name, **options)
|
157
|
-
if connection.adapter_name == "Mysql2"
|
336
|
+
if connection.adapter_name == "Mysql2" || connection.adapter_name == "Trilogy"
|
158
337
|
super(table_name, options: "ENGINE=InnoDB", **options)
|
159
338
|
else
|
160
339
|
super
|
@@ -173,6 +352,10 @@ module ActiveRecord
|
|
173
352
|
super(*args, type: :integer, **options)
|
174
353
|
end
|
175
354
|
alias :belongs_to :references
|
355
|
+
|
356
|
+
private
|
357
|
+
def raise_on_if_exist_options(options)
|
358
|
+
end
|
176
359
|
end
|
177
360
|
|
178
361
|
def create_table(table_name, **options)
|
@@ -182,7 +365,7 @@ module ActiveRecord
|
|
182
365
|
end
|
183
366
|
end
|
184
367
|
|
185
|
-
unless connection.adapter_name
|
368
|
+
unless ["Mysql2", "Trilogy"].include?(connection.adapter_name) && options[:id] == :bigint
|
186
369
|
if [:integer, :bigint].include?(options[:id]) && !options.key?(:default)
|
187
370
|
options[:default] = nil
|
188
371
|
end
|
@@ -207,6 +390,8 @@ module ActiveRecord
|
|
207
390
|
if type == :primary_key
|
208
391
|
type = :integer
|
209
392
|
options[:primary_key] = true
|
393
|
+
elsif type == :datetime
|
394
|
+
options[:precision] ||= nil
|
210
395
|
end
|
211
396
|
super
|
212
397
|
end
|
@@ -237,6 +422,10 @@ module ActiveRecord
|
|
237
422
|
options[:null] = true if options[:null].nil?
|
238
423
|
super
|
239
424
|
end
|
425
|
+
|
426
|
+
private
|
427
|
+
def raise_on_if_exist_options(options)
|
428
|
+
end
|
240
429
|
end
|
241
430
|
|
242
431
|
def add_reference(table_name, ref_name, **options)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class Migration
|
5
|
+
# The default strategy for executing migrations. Delegates method calls
|
6
|
+
# to the connection adapter.
|
7
|
+
class DefaultStrategy < ExecutionStrategy # :nodoc:
|
8
|
+
private
|
9
|
+
def method_missing(method, ...)
|
10
|
+
connection.send(method, ...)
|
11
|
+
end
|
12
|
+
|
13
|
+
def respond_to_missing?(method, include_private = false)
|
14
|
+
connection.respond_to?(method, include_private) || super
|
15
|
+
end
|
16
|
+
|
17
|
+
def connection
|
18
|
+
migration.connection
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class Migration
|
5
|
+
# ExecutionStrategy is used by the migration to respond to any method calls
|
6
|
+
# that the migration class does not implement directly. This is the base strategy.
|
7
|
+
# All strategies should inherit from this class.
|
8
|
+
#
|
9
|
+
# The ExecutionStrategy receives the current +migration+ when initialized.
|
10
|
+
class ExecutionStrategy # :nodoc:
|
11
|
+
def initialize(migration)
|
12
|
+
@migration = migration
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
attr_reader :migration
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class PendingMigrationConnection # :nodoc:
|
5
|
+
def self.with_temporary_pool(db_config, &block)
|
6
|
+
pool = ActiveRecord::Base.connection_handler.establish_connection(db_config, owner_name: self)
|
7
|
+
|
8
|
+
yield pool
|
9
|
+
ensure
|
10
|
+
ActiveRecord::Base.connection_handler.remove_connection_pool(self.name)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.primary_class?
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.current_preventing_writes
|
18
|
+
false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|