activerecord 5.0.7.2 → 6.0.3.4
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +708 -2040
- data/MIT-LICENSE +3 -1
- data/README.rdoc +9 -7
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record.rb +37 -22
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +249 -247
- data/lib/active_record/association_relation.rb +18 -14
- data/lib/active_record/associations.rb +1603 -1592
- data/lib/active_record/associations/alias_tracker.rb +24 -34
- data/lib/active_record/associations/association.rb +114 -55
- data/lib/active_record/associations/association_scope.rb +94 -94
- data/lib/active_record/associations/belongs_to_association.rb +58 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +18 -25
- data/lib/active_record/associations/builder/belongs_to.rb +43 -54
- data/lib/active_record/associations/builder/collection_association.rb +7 -18
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
- data/lib/active_record/associations/builder/has_many.rb +4 -0
- data/lib/active_record/associations/builder/has_one.rb +37 -1
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +86 -254
- data/lib/active_record/associations/collection_proxy.rb +158 -122
- data/lib/active_record/associations/foreign_association.rb +9 -0
- data/lib/active_record/associations/has_many_association.rb +23 -30
- data/lib/active_record/associations/has_many_through_association.rb +58 -44
- data/lib/active_record/associations/has_one_association.rb +59 -54
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency.rb +143 -176
- data/lib/active_record/associations/join_dependency/join_association.rb +38 -87
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +12 -12
- data/lib/active_record/associations/preloader.rb +90 -103
- data/lib/active_record/associations/preloader/association.rb +86 -100
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +26 -14
- data/lib/active_record/attribute_assignment.rb +54 -61
- data/lib/active_record/attribute_decorators.rb +38 -17
- data/lib/active_record/attribute_methods.rb +66 -106
- data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
- data/lib/active_record/attribute_methods/dirty.rb +179 -109
- data/lib/active_record/attribute_methods/primary_key.rb +85 -92
- data/lib/active_record/attribute_methods/query.rb +4 -3
- data/lib/active_record/attribute_methods/read.rb +20 -49
- data/lib/active_record/attribute_methods/serialization.rb +29 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
- data/lib/active_record/attribute_methods/write.rb +34 -33
- data/lib/active_record/attributes.rb +38 -25
- data/lib/active_record/autosave_association.rb +54 -35
- data/lib/active_record/base.rb +27 -24
- data/lib/active_record/callbacks.rb +64 -35
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +11 -12
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +552 -323
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -75
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +228 -147
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
- data/lib/active_record/connection_adapters/abstract_adapter.rb +367 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +396 -562
- data/lib/active_record/connection_adapters/column.rb +41 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
- data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +34 -31
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
- data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +259 -266
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
- data/lib/active_record/connection_handling.rb +143 -40
- data/lib/active_record/core.rb +201 -163
- data/lib/active_record/counter_cache.rb +60 -28
- data/lib/active_record/database_configurations.rb +233 -0
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/define_callbacks.rb +22 -0
- data/lib/active_record/dynamic_matchers.rb +87 -87
- data/lib/active_record/enum.rb +60 -23
- data/lib/active_record/errors.rb +114 -18
- data/lib/active_record/explain.rb +4 -4
- data/lib/active_record/explain_registry.rb +3 -1
- data/lib/active_record/explain_subscriber.rb +9 -4
- data/lib/active_record/fixture_set/file.rb +13 -8
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +194 -504
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +150 -99
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +116 -25
- data/lib/active_record/internal_metadata.rb +16 -19
- data/lib/active_record/legacy_yaml_adapter.rb +4 -2
- data/lib/active_record/locking/optimistic.rb +77 -87
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +48 -29
- data/lib/active_record/middleware/database_selector.rb +74 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/migration.rb +369 -302
- data/lib/active_record/migration/command_recorder.rb +134 -100
- data/lib/active_record/migration/compatibility.rb +174 -56
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/model_schema.rb +131 -127
- data/lib/active_record/nested_attributes.rb +213 -202
- data/lib/active_record/no_touching.rb +12 -3
- data/lib/active_record/null_relation.rb +12 -34
- data/lib/active_record/persistence.rb +446 -77
- data/lib/active_record/query_cache.rb +13 -12
- data/lib/active_record/querying.rb +37 -24
- data/lib/active_record/railtie.rb +128 -36
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +312 -177
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +214 -252
- data/lib/active_record/relation.rb +440 -318
- data/lib/active_record/relation/batches.rb +98 -52
- data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
- data/lib/active_record/relation/calculations.rb +212 -173
- data/lib/active_record/relation/delegation.rb +72 -69
- data/lib/active_record/relation/finder_methods.rb +207 -247
- data/lib/active_record/relation/from_clause.rb +6 -8
- data/lib/active_record/relation/merger.rb +78 -62
- data/lib/active_record/relation/predicate_builder.rb +83 -105
- data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +476 -334
- data/lib/active_record/relation/record_fetch_warning.rb +5 -3
- data/lib/active_record/relation/spawn_methods.rb +8 -8
- data/lib/active_record/relation/where_clause.rb +111 -96
- data/lib/active_record/relation/where_clause_factory.rb +6 -11
- data/lib/active_record/result.rb +69 -40
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +83 -99
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +71 -69
- data/lib/active_record/schema_migration.rb +16 -6
- data/lib/active_record/scoping.rb +20 -20
- data/lib/active_record/scoping/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +47 -27
- data/lib/active_record/secure_token.rb +4 -2
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +63 -28
- data/lib/active_record/store.rb +121 -41
- data/lib/active_record/suppressor.rb +6 -3
- data/lib/active_record/table_metadata.rb +39 -18
- data/lib/active_record/tasks/database_tasks.rb +271 -81
- data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
- data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +225 -0
- data/lib/active_record/timestamp.rb +70 -36
- data/lib/active_record/touch_later.rb +8 -6
- data/lib/active_record/transactions.rb +141 -157
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type.rb +23 -18
- data/lib/active_record/type/adapter_specific_registry.rb +44 -48
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +16 -9
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +2 -1
- data/lib/active_record/type/type_map.rb +14 -17
- data/lib/active_record/type/unsigned_integer.rb +16 -0
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/type_caster/connection.rb +17 -12
- data/lib/active_record/type_caster/map.rb +5 -4
- data/lib/active_record/validations.rb +7 -5
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +4 -3
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +29 -42
- data/lib/active_record/version.rb +3 -1
- data/lib/arel.rb +62 -0
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes.rb +22 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/collectors/bind.rb +24 -0
- data/lib/arel/collectors/composite.rb +31 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +20 -0
- data/lib/arel/collectors/substitute_binds.rb +28 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes.rb +68 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +52 -0
- data/lib/arel/nodes/bind_param.rb +36 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +50 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +18 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +8 -0
- data/lib/arel/nodes/in.rb +8 -0
- data/lib/arel/nodes/infix_operation.rb +80 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +50 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +16 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +27 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +45 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +256 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/visitors/depth_first.rb +203 -0
- data/lib/arel/visitors/dot.rb +296 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +156 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +158 -0
- data/lib/arel/visitors/oracle12.rb +65 -0
- data/lib/arel/visitors/postgresql.rb +109 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +888 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors/where_sql.rb +22 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/rails/generators/active_record.rb +7 -5
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration.rb +17 -3
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- metadata +137 -52
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -20
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
class Migration
|
3
5
|
# <tt>ActiveRecord::Migration::CommandRecorder</tt> records commands done during
|
@@ -12,6 +14,8 @@ module ActiveRecord
|
|
12
14
|
# * change_column
|
13
15
|
# * change_column_default (must supply a :from and :to option)
|
14
16
|
# * change_column_null
|
17
|
+
# * change_column_comment (must supply a :from and :to option)
|
18
|
+
# * change_table_comment (must supply a :from and :to option)
|
15
19
|
# * create_join_table
|
16
20
|
# * create_table
|
17
21
|
# * disable_extension
|
@@ -28,12 +32,14 @@ module ActiveRecord
|
|
28
32
|
# * rename_index
|
29
33
|
# * rename_table
|
30
34
|
class CommandRecorder
|
31
|
-
ReversibleAndIrreversibleMethods = [
|
35
|
+
ReversibleAndIrreversibleMethods = [
|
36
|
+
:create_table, :create_join_table, :rename_table, :add_column, :remove_column,
|
32
37
|
:rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,
|
33
38
|
:change_column_default, :add_reference, :remove_reference, :transaction,
|
34
39
|
:drop_join_table, :drop_table, :execute_block, :enable_extension, :disable_extension,
|
35
40
|
:change_column, :execute, :remove_columns, :change_column_null,
|
36
|
-
:add_foreign_key, :remove_foreign_key
|
41
|
+
:add_foreign_key, :remove_foreign_key,
|
42
|
+
:change_column_comment, :change_table_comment
|
37
43
|
]
|
38
44
|
include JoinTable
|
39
45
|
|
@@ -83,7 +89,7 @@ module ActiveRecord
|
|
83
89
|
# invert the +command+.
|
84
90
|
def inverse_of(command, args, &block)
|
85
91
|
method = :"invert_#{command}"
|
86
|
-
raise IrreversibleMigration,
|
92
|
+
raise IrreversibleMigration, <<~MSG unless respond_to?(method, true)
|
87
93
|
This migration uses #{command}, which is not automatically reversible.
|
88
94
|
To make the migration reversible you can either:
|
89
95
|
1. Define #up and #down methods in place of the #change method.
|
@@ -92,147 +98,175 @@ module ActiveRecord
|
|
92
98
|
send(method, args, &block)
|
93
99
|
end
|
94
100
|
|
95
|
-
def respond_to?(*args) # :nodoc:
|
96
|
-
super || delegate.respond_to?(*args)
|
97
|
-
end
|
98
|
-
|
99
101
|
ReversibleAndIrreversibleMethods.each do |method|
|
100
102
|
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
101
103
|
def #{method}(*args, &block) # def create_table(*args, &block)
|
102
104
|
record(:"#{method}", args, &block) # record(:create_table, args, &block)
|
103
105
|
end # end
|
104
106
|
EOV
|
107
|
+
ruby2_keywords(method) if respond_to?(:ruby2_keywords, true)
|
105
108
|
end
|
106
109
|
alias :add_belongs_to :add_reference
|
107
110
|
alias :remove_belongs_to :remove_reference
|
108
111
|
|
109
|
-
def change_table(table_name, options
|
112
|
+
def change_table(table_name, **options) # :nodoc:
|
110
113
|
yield delegate.update_table_definition(table_name, self)
|
111
114
|
end
|
112
115
|
|
116
|
+
def replay(migration)
|
117
|
+
commands.each do |cmd, args, block|
|
118
|
+
migration.send(cmd, *args, &block)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
113
122
|
private
|
123
|
+
module StraightReversions # :nodoc:
|
124
|
+
private
|
125
|
+
{
|
126
|
+
execute_block: :execute_block,
|
127
|
+
create_table: :drop_table,
|
128
|
+
create_join_table: :drop_join_table,
|
129
|
+
add_column: :remove_column,
|
130
|
+
add_timestamps: :remove_timestamps,
|
131
|
+
add_reference: :remove_reference,
|
132
|
+
add_foreign_key: :remove_foreign_key,
|
133
|
+
enable_extension: :disable_extension
|
134
|
+
}.each do |cmd, inv|
|
135
|
+
[[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
|
136
|
+
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
137
|
+
def invert_#{method}(args, &block) # def invert_create_table(args, &block)
|
138
|
+
[:#{inverse}, args, block] # [:drop_table, args, block]
|
139
|
+
end # end
|
140
|
+
EOV
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
include StraightReversions
|
146
|
+
|
147
|
+
def invert_transaction(args)
|
148
|
+
sub_recorder = CommandRecorder.new(delegate)
|
149
|
+
sub_recorder.revert { yield }
|
150
|
+
|
151
|
+
invertions_proc = proc {
|
152
|
+
sub_recorder.replay(self)
|
153
|
+
}
|
154
|
+
|
155
|
+
[:transaction, args, invertions_proc]
|
156
|
+
end
|
114
157
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
execute_block: :execute_block,
|
119
|
-
create_table: :drop_table,
|
120
|
-
create_join_table: :drop_join_table,
|
121
|
-
add_column: :remove_column,
|
122
|
-
add_timestamps: :remove_timestamps,
|
123
|
-
add_reference: :remove_reference,
|
124
|
-
enable_extension: :disable_extension
|
125
|
-
}.each do |cmd, inv|
|
126
|
-
[[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
|
127
|
-
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
128
|
-
def invert_#{method}(args, &block) # def invert_create_table(args, &block)
|
129
|
-
[:#{inverse}, args, block] # [:drop_table, args, block]
|
130
|
-
end # end
|
131
|
-
EOV
|
158
|
+
def invert_drop_table(args, &block)
|
159
|
+
if args.size == 1 && block == nil
|
160
|
+
raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
|
132
161
|
end
|
162
|
+
super
|
133
163
|
end
|
134
|
-
end
|
135
164
|
|
136
|
-
|
165
|
+
def invert_rename_table(args)
|
166
|
+
[:rename_table, args.reverse]
|
167
|
+
end
|
137
168
|
|
138
|
-
|
139
|
-
|
140
|
-
|
169
|
+
def invert_remove_column(args)
|
170
|
+
raise ActiveRecord::IrreversibleMigration, "remove_column is only reversible if given a type." if args.size <= 2
|
171
|
+
super
|
141
172
|
end
|
142
|
-
super
|
143
|
-
end
|
144
173
|
|
145
|
-
|
146
|
-
|
147
|
-
|
174
|
+
def invert_rename_index(args)
|
175
|
+
[:rename_index, [args.first] + args.last(2).reverse]
|
176
|
+
end
|
148
177
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
end
|
178
|
+
def invert_rename_column(args)
|
179
|
+
[:rename_column, [args.first] + args.last(2).reverse]
|
180
|
+
end
|
153
181
|
|
154
|
-
|
155
|
-
|
156
|
-
|
182
|
+
def invert_add_index(args)
|
183
|
+
table, columns, options = *args
|
184
|
+
options ||= {}
|
157
185
|
|
158
|
-
|
159
|
-
|
160
|
-
|
186
|
+
options_hash = options.slice(:name, :algorithm)
|
187
|
+
options_hash[:column] = columns if !options_hash[:name]
|
188
|
+
|
189
|
+
[:remove_index, [table, options_hash]]
|
190
|
+
end
|
161
191
|
|
162
|
-
|
163
|
-
|
164
|
-
|
192
|
+
def invert_remove_index(args)
|
193
|
+
table, options_or_column = *args
|
194
|
+
if (options = options_or_column).is_a?(Hash)
|
195
|
+
unless options[:column]
|
196
|
+
raise ActiveRecord::IrreversibleMigration, "remove_index is only reversible if given a :column option."
|
197
|
+
end
|
198
|
+
options = options.dup
|
199
|
+
[:add_index, [table, options.delete(:column), options]]
|
200
|
+
elsif (column = options_or_column).present?
|
201
|
+
[:add_index, [table, column]]
|
202
|
+
end
|
203
|
+
end
|
165
204
|
|
166
|
-
|
167
|
-
|
205
|
+
alias :invert_add_belongs_to :invert_add_reference
|
206
|
+
alias :invert_remove_belongs_to :invert_remove_reference
|
168
207
|
|
169
|
-
|
170
|
-
|
208
|
+
def invert_change_column_default(args)
|
209
|
+
table, column, options = *args
|
171
210
|
|
172
|
-
|
173
|
-
|
174
|
-
if (options = options_or_column).is_a?(Hash)
|
175
|
-
unless options[:column]
|
176
|
-
raise ActiveRecord::IrreversibleMigration, "remove_index is only reversible if given a :column option."
|
211
|
+
unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
|
212
|
+
raise ActiveRecord::IrreversibleMigration, "change_column_default is only reversible if given a :from and :to option."
|
177
213
|
end
|
178
|
-
|
179
|
-
[:
|
180
|
-
elsif (column = options_or_column).present?
|
181
|
-
[:add_index, [table, column]]
|
214
|
+
|
215
|
+
[:change_column_default, [table, column, from: options[:to], to: options[:from]]]
|
182
216
|
end
|
183
|
-
end
|
184
217
|
|
185
|
-
|
186
|
-
|
218
|
+
def invert_change_column_null(args)
|
219
|
+
args[2] = !args[2]
|
220
|
+
[:change_column_null, args]
|
221
|
+
end
|
187
222
|
|
188
|
-
|
189
|
-
|
223
|
+
def invert_remove_foreign_key(args)
|
224
|
+
options = args.extract_options!
|
225
|
+
from_table, to_table = args
|
190
226
|
|
191
|
-
|
192
|
-
raise ActiveRecord::IrreversibleMigration, "change_column_default is only reversible if given a :from and :to option."
|
193
|
-
end
|
227
|
+
to_table ||= options.delete(:to_table)
|
194
228
|
|
195
|
-
|
196
|
-
end
|
229
|
+
raise ActiveRecord::IrreversibleMigration, "remove_foreign_key is only reversible if given a second table" if to_table.nil?
|
197
230
|
|
198
|
-
|
199
|
-
|
200
|
-
[:change_column_null, args]
|
201
|
-
end
|
231
|
+
reversed_args = [from_table, to_table]
|
232
|
+
reversed_args << options unless options.empty?
|
202
233
|
|
203
|
-
|
204
|
-
|
205
|
-
add_options ||= {}
|
234
|
+
[:add_foreign_key, reversed_args]
|
235
|
+
end
|
206
236
|
|
207
|
-
|
208
|
-
options =
|
209
|
-
|
210
|
-
options
|
211
|
-
|
212
|
-
|
237
|
+
def invert_change_column_comment(args)
|
238
|
+
table, column, options = *args
|
239
|
+
|
240
|
+
unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
|
241
|
+
raise ActiveRecord::IrreversibleMigration, "change_column_comment is only reversible if given a :from and :to option."
|
242
|
+
end
|
243
|
+
|
244
|
+
[:change_column_comment, [table, column, from: options[:to], to: options[:from]]]
|
213
245
|
end
|
214
246
|
|
215
|
-
|
216
|
-
|
247
|
+
def invert_change_table_comment(args)
|
248
|
+
table, options = *args
|
217
249
|
|
218
|
-
|
219
|
-
|
220
|
-
|
250
|
+
unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
|
251
|
+
raise ActiveRecord::IrreversibleMigration, "change_table_comment is only reversible if given a :from and :to option."
|
252
|
+
end
|
221
253
|
|
222
|
-
|
223
|
-
|
254
|
+
[:change_table_comment, [table, from: options[:to], to: options[:from]]]
|
255
|
+
end
|
224
256
|
|
225
|
-
|
226
|
-
|
257
|
+
def respond_to_missing?(method, _)
|
258
|
+
super || delegate.respond_to?(method)
|
259
|
+
end
|
227
260
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
261
|
+
# Forwards any missing method call to the \target.
|
262
|
+
def method_missing(method, *args, &block)
|
263
|
+
if delegate.respond_to?(method)
|
264
|
+
delegate.public_send(method, *args, &block)
|
265
|
+
else
|
266
|
+
super
|
267
|
+
end
|
234
268
|
end
|
235
|
-
|
269
|
+
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
236
270
|
end
|
237
271
|
end
|
238
272
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
class Migration
|
3
5
|
module Compatibility # :nodoc: all
|
@@ -5,61 +7,189 @@ module ActiveRecord
|
|
5
7
|
version = version.to_s
|
6
8
|
name = "V#{version.tr('.', '_')}"
|
7
9
|
unless const_defined?(name)
|
8
|
-
versions = constants.grep(/\AV[0-9_]+\z/).map { |s| s.to_s.delete(
|
10
|
+
versions = constants.grep(/\AV[0-9_]+\z/).map { |s| s.to_s.delete("V").tr("_", ".").inspect }
|
9
11
|
raise ArgumentError, "Unknown migration version #{version.inspect}; expected one of #{versions.sort.join(', ')}"
|
10
12
|
end
|
11
13
|
const_get(name)
|
12
14
|
end
|
13
15
|
|
14
|
-
|
16
|
+
V6_0 = Current
|
15
17
|
|
16
|
-
|
18
|
+
class V5_2 < V6_0
|
17
19
|
module TableDefinition
|
18
|
-
def
|
19
|
-
options[:
|
20
|
+
def timestamps(**options)
|
21
|
+
options[:precision] ||= nil
|
20
22
|
super
|
21
23
|
end
|
22
|
-
|
24
|
+
end
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
+
module CommandRecorder
|
27
|
+
def invert_transaction(args, &block)
|
28
|
+
[:transaction, args, block]
|
29
|
+
end
|
30
|
+
|
31
|
+
def invert_change_column_comment(args)
|
32
|
+
table_name, column_name, comment = args
|
33
|
+
[:change_column_comment, [table_name, column_name, from: comment, to: comment]]
|
34
|
+
end
|
35
|
+
|
36
|
+
def invert_change_table_comment(args)
|
37
|
+
table_name, comment = args
|
38
|
+
[:change_table_comment, [table_name, from: comment, to: comment]]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_table(table_name, **options)
|
43
|
+
if block_given?
|
44
|
+
super { |t| yield compatible_table_definition(t) }
|
45
|
+
else
|
26
46
|
super
|
27
47
|
end
|
28
48
|
end
|
29
49
|
|
30
|
-
def
|
50
|
+
def change_table(table_name, **options)
|
31
51
|
if block_given?
|
32
|
-
super
|
33
|
-
class << t
|
34
|
-
prepend TableDefinition
|
35
|
-
end
|
36
|
-
yield t
|
37
|
-
end
|
52
|
+
super { |t| yield compatible_table_definition(t) }
|
38
53
|
else
|
39
54
|
super
|
40
55
|
end
|
41
56
|
end
|
42
57
|
|
43
|
-
def
|
58
|
+
def create_join_table(table_1, table_2, **options)
|
44
59
|
if block_given?
|
45
|
-
super
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
60
|
+
super { |t| yield compatible_table_definition(t) }
|
61
|
+
else
|
62
|
+
super
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def add_timestamps(table_name, **options)
|
67
|
+
options[:precision] ||= nil
|
68
|
+
super
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
def compatible_table_definition(t)
|
73
|
+
class << t
|
74
|
+
prepend TableDefinition
|
75
|
+
end
|
76
|
+
t
|
77
|
+
end
|
78
|
+
|
79
|
+
def command_recorder
|
80
|
+
recorder = super
|
81
|
+
class << recorder
|
82
|
+
prepend CommandRecorder
|
50
83
|
end
|
84
|
+
recorder
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
class V5_1 < V5_2
|
89
|
+
def change_column(table_name, column_name, type, options = {})
|
90
|
+
if connection.adapter_name == "PostgreSQL"
|
91
|
+
super(table_name, column_name, type, options.except(:default, :null, :comment))
|
92
|
+
connection.change_column_default(table_name, column_name, options[:default]) if options.key?(:default)
|
93
|
+
connection.change_column_null(table_name, column_name, options[:null], options[:default]) if options.key?(:null)
|
94
|
+
connection.change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
|
51
95
|
else
|
52
96
|
super
|
53
97
|
end
|
54
98
|
end
|
55
99
|
|
56
|
-
def
|
100
|
+
def create_table(table_name, **options)
|
101
|
+
if connection.adapter_name == "Mysql2"
|
102
|
+
super(table_name, options: "ENGINE=InnoDB", **options)
|
103
|
+
else
|
104
|
+
super
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
class V5_0 < V5_1
|
110
|
+
module TableDefinition
|
111
|
+
def primary_key(name, type = :primary_key, **options)
|
112
|
+
type = :integer if type == :primary_key
|
113
|
+
super
|
114
|
+
end
|
115
|
+
|
116
|
+
def references(*args, **options)
|
117
|
+
super(*args, type: :integer, **options)
|
118
|
+
end
|
119
|
+
alias :belongs_to :references
|
120
|
+
end
|
121
|
+
|
122
|
+
def create_table(table_name, **options)
|
123
|
+
if connection.adapter_name == "PostgreSQL"
|
124
|
+
if options[:id] == :uuid && !options.key?(:default)
|
125
|
+
options[:default] = "uuid_generate_v4()"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
unless connection.adapter_name == "Mysql2" && options[:id] == :bigint
|
130
|
+
if [:integer, :bigint].include?(options[:id]) && !options.key?(:default)
|
131
|
+
options[:default] = nil
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# Since 5.1 PostgreSQL adapter uses bigserial type for primary
|
136
|
+
# keys by default and MySQL uses bigint. This compat layer makes old migrations utilize
|
137
|
+
# serial/int type instead -- the way it used to work before 5.1.
|
138
|
+
unless options.key?(:id)
|
139
|
+
options[:id] = :integer
|
140
|
+
end
|
141
|
+
|
142
|
+
super
|
143
|
+
end
|
144
|
+
|
145
|
+
def create_join_table(table_1, table_2, column_options: {}, **options)
|
146
|
+
column_options.reverse_merge!(type: :integer)
|
147
|
+
super
|
148
|
+
end
|
149
|
+
|
150
|
+
def add_column(table_name, column_name, type, **options)
|
151
|
+
if type == :primary_key
|
152
|
+
type = :integer
|
153
|
+
options[:primary_key] = true
|
154
|
+
end
|
155
|
+
super
|
156
|
+
end
|
157
|
+
|
158
|
+
def add_reference(table_name, ref_name, **options)
|
159
|
+
super(table_name, ref_name, type: :integer, **options)
|
160
|
+
end
|
161
|
+
alias :add_belongs_to :add_reference
|
162
|
+
|
163
|
+
private
|
164
|
+
def compatible_table_definition(t)
|
165
|
+
class << t
|
166
|
+
prepend TableDefinition
|
167
|
+
end
|
168
|
+
super
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
class V4_2 < V5_0
|
173
|
+
module TableDefinition
|
174
|
+
def references(*, **options)
|
175
|
+
options[:index] ||= false
|
176
|
+
super
|
177
|
+
end
|
178
|
+
alias :belongs_to :references
|
179
|
+
|
180
|
+
def timestamps(**options)
|
181
|
+
options[:null] = true if options[:null].nil?
|
182
|
+
super
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def add_reference(table_name, ref_name, **options)
|
57
187
|
options[:index] ||= false
|
58
188
|
super
|
59
189
|
end
|
60
190
|
alias :add_belongs_to :add_reference
|
61
191
|
|
62
|
-
def add_timestamps(
|
192
|
+
def add_timestamps(table_name, **options)
|
63
193
|
options[:null] = true if options[:null].nil?
|
64
194
|
super
|
65
195
|
end
|
@@ -70,7 +200,7 @@ module ActiveRecord
|
|
70
200
|
if options[:name].present?
|
71
201
|
options[:name].to_s
|
72
202
|
else
|
73
|
-
index_name(table_name, column: column_names)
|
203
|
+
connection.index_name(table_name, column: column_names)
|
74
204
|
end
|
75
205
|
super
|
76
206
|
end
|
@@ -82,44 +212,32 @@ module ActiveRecord
|
|
82
212
|
end
|
83
213
|
|
84
214
|
private
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
unless index_name_exists?(table_name, index_name, true)
|
90
|
-
if options.is_a?(Hash) && options.has_key?(:name)
|
91
|
-
options_without_column = options.dup
|
92
|
-
options_without_column.delete :column
|
93
|
-
index_name_without_column = index_name(table_name, options_without_column)
|
94
|
-
|
95
|
-
return index_name_without_column if index_name_exists?(table_name, index_name_without_column, false)
|
215
|
+
def compatible_table_definition(t)
|
216
|
+
class << t
|
217
|
+
prepend TableDefinition
|
96
218
|
end
|
97
|
-
|
98
|
-
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
|
219
|
+
super
|
99
220
|
end
|
100
221
|
|
101
|
-
|
102
|
-
|
103
|
-
end
|
222
|
+
def index_name_for_remove(table_name, options = {})
|
223
|
+
index_name = connection.index_name(table_name, options)
|
104
224
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
end
|
225
|
+
unless connection.index_name_exists?(table_name, index_name)
|
226
|
+
if options.is_a?(Hash) && options.has_key?(:name)
|
227
|
+
options_without_column = options.dup
|
228
|
+
options_without_column.delete :column
|
229
|
+
index_name_without_column = connection.index_name(table_name, options_without_column)
|
111
230
|
|
112
|
-
|
113
|
-
|
231
|
+
if connection.index_name_exists?(table_name, index_name_without_column)
|
232
|
+
return index_name_without_column
|
233
|
+
end
|
234
|
+
end
|
114
235
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
" class #{self.class.name} < ActiveRecord::Migration[4.2]"
|
121
|
-
super
|
122
|
-
end
|
236
|
+
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
|
237
|
+
end
|
238
|
+
|
239
|
+
index_name
|
240
|
+
end
|
123
241
|
end
|
124
242
|
end
|
125
243
|
end
|