activerecord 4.2.0 → 6.1.7.1
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 +5 -5
- data/CHANGELOG.md +1221 -796
- data/MIT-LICENSE +4 -2
- data/README.rdoc +15 -14
- data/examples/performance.rb +33 -32
- data/examples/simple.rb +5 -4
- data/lib/active_record/aggregations.rb +267 -249
- data/lib/active_record/association_relation.rb +45 -7
- data/lib/active_record/associations/alias_tracker.rb +40 -43
- data/lib/active_record/associations/association.rb +172 -67
- data/lib/active_record/associations/association_scope.rb +105 -129
- data/lib/active_record/associations/belongs_to_association.rb +85 -59
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
- data/lib/active_record/associations/builder/association.rb +57 -43
- data/lib/active_record/associations/builder/belongs_to.rb +74 -57
- data/lib/active_record/associations/builder/collection_association.rb +15 -33
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -70
- data/lib/active_record/associations/builder/has_many.rb +13 -5
- data/lib/active_record/associations/builder/has_one.rb +44 -6
- data/lib/active_record/associations/builder/singular_association.rb +16 -10
- data/lib/active_record/associations/collection_association.rb +168 -279
- data/lib/active_record/associations/collection_proxy.rb +263 -155
- data/lib/active_record/associations/foreign_association.rb +33 -0
- data/lib/active_record/associations/has_many_association.rb +57 -84
- data/lib/active_record/associations/has_many_through_association.rb +70 -82
- data/lib/active_record/associations/has_one_association.rb +74 -47
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +54 -73
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
- data/lib/active_record/associations/join_dependency.rb +175 -164
- data/lib/active_record/associations/preloader/association.rb +107 -112
- data/lib/active_record/associations/preloader/through_association.rb +85 -65
- data/lib/active_record/associations/preloader.rb +99 -96
- data/lib/active_record/associations/singular_association.rb +18 -45
- data/lib/active_record/associations/through_association.rb +49 -24
- data/lib/active_record/associations.rb +1845 -1597
- data/lib/active_record/attribute_assignment.rb +59 -185
- data/lib/active_record/attribute_methods/before_type_cast.rb +20 -7
- data/lib/active_record/attribute_methods/dirty.rb +168 -138
- data/lib/active_record/attribute_methods/primary_key.rb +93 -83
- data/lib/active_record/attribute_methods/query.rb +8 -10
- data/lib/active_record/attribute_methods/read.rb +19 -79
- data/lib/active_record/attribute_methods/serialization.rb +49 -24
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +59 -36
- data/lib/active_record/attribute_methods/write.rb +25 -56
- data/lib/active_record/attribute_methods.rb +153 -162
- data/lib/active_record/attributes.rb +234 -70
- data/lib/active_record/autosave_association.rb +157 -69
- data/lib/active_record/base.rb +49 -50
- data/lib/active_record/callbacks.rb +234 -79
- data/lib/active_record/coders/json.rb +3 -1
- data/lib/active_record/coders/yaml_column.rb +46 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +887 -317
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +17 -41
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +301 -113
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +78 -24
- data/lib/active_record/connection_adapters/abstract/quoting.rb +187 -60
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +9 -7
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +157 -93
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +485 -253
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +909 -263
- data/lib/active_record/connection_adapters/abstract/transaction.rb +254 -92
- data/lib/active_record/connection_adapters/abstract_adapter.rb +492 -221
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +580 -608
- data/lib/active_record/connection_adapters/column.rb +67 -40
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +196 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +96 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +97 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +103 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +91 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +271 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +81 -199
- data/lib/active_record/connection_adapters/pool_config.rb +73 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +44 -11
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +78 -161
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -57
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +5 -2
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +8 -6
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +17 -13
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +6 -3
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -20
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -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/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
- data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +70 -34
- 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 +67 -51
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid.rb +25 -25
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +171 -48
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +499 -293
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +595 -382
- data/lib/active_record/connection_adapters/schema_cache.rb +191 -29
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +146 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +21 -0
- 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 +170 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +322 -389
- data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
- data/lib/active_record/connection_adapters.rb +52 -0
- data/lib/active_record/connection_handling.rb +314 -41
- data/lib/active_record/core.rb +488 -243
- data/lib/active_record/counter_cache.rb +71 -50
- data/lib/active_record/database_configurations/connection_url_resolver.rb +99 -0
- data/lib/active_record/database_configurations/database_config.rb +80 -0
- data/lib/active_record/database_configurations/hash_config.rb +96 -0
- data/lib/active_record/database_configurations/url_config.rb +53 -0
- data/lib/active_record/database_configurations.rb +273 -0
- data/lib/active_record/delegated_type.rb +209 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/dynamic_matchers.rb +87 -106
- data/lib/active_record/enum.rb +212 -94
- data/lib/active_record/errors.rb +225 -54
- data/lib/active_record/explain.rb +27 -11
- data/lib/active_record/explain_registry.rb +4 -2
- data/lib/active_record/explain_subscriber.rb +11 -6
- data/lib/active_record/fixture_set/file.rb +33 -14
- data/lib/active_record/fixture_set/model_metadata.rb +32 -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 +273 -496
- data/lib/active_record/gem_version.rb +6 -4
- data/lib/active_record/inheritance.rb +175 -110
- data/lib/active_record/insert_all.rb +212 -0
- data/lib/active_record/integration.rb +121 -29
- data/lib/active_record/internal_metadata.rb +64 -0
- data/lib/active_record/legacy_yaml_adapter.rb +52 -0
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +103 -95
- data/lib/active_record/locking/pessimistic.rb +22 -6
- data/lib/active_record/log_subscriber.rb +93 -31
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +77 -0
- data/lib/active_record/migration/command_recorder.rb +185 -90
- data/lib/active_record/migration/compatibility.rb +298 -0
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +685 -309
- data/lib/active_record/model_schema.rb +420 -113
- data/lib/active_record/nested_attributes.rb +265 -216
- data/lib/active_record/no_touching.rb +15 -2
- data/lib/active_record/null_relation.rb +24 -38
- data/lib/active_record/persistence.rb +574 -135
- data/lib/active_record/query_cache.rb +29 -23
- data/lib/active_record/querying.rb +50 -31
- data/lib/active_record/railtie.rb +175 -54
- data/lib/active_record/railties/console_sandbox.rb +3 -3
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +533 -216
- data/lib/active_record/readonly_attributes.rb +9 -4
- data/lib/active_record/reflection.rb +485 -310
- data/lib/active_record/relation/batches/batch_enumerator.rb +85 -0
- data/lib/active_record/relation/batches.rb +217 -59
- data/lib/active_record/relation/calculations.rb +326 -244
- data/lib/active_record/relation/delegation.rb +76 -84
- data/lib/active_record/relation/finder_methods.rb +318 -256
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +99 -84
- data/lib/active_record/relation/predicate_builder/array_handler.rb +26 -25
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +57 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
- data/lib/active_record/relation/predicate_builder.rb +139 -96
- data/lib/active_record/relation/query_attribute.rb +50 -0
- data/lib/active_record/relation/query_methods.rb +757 -409
- data/lib/active_record/relation/record_fetch_warning.rb +51 -0
- data/lib/active_record/relation/spawn_methods.rb +23 -21
- data/lib/active_record/relation/where_clause.rb +239 -0
- data/lib/active_record/relation.rb +554 -342
- data/lib/active_record/result.rb +91 -47
- data/lib/active_record/runtime_registry.rb +6 -4
- data/lib/active_record/sanitization.rb +134 -122
- data/lib/active_record/schema.rb +21 -24
- data/lib/active_record/schema_dumper.rb +141 -92
- data/lib/active_record/schema_migration.rb +24 -26
- data/lib/active_record/scoping/default.rb +96 -82
- data/lib/active_record/scoping/named.rb +78 -36
- data/lib/active_record/scoping.rb +45 -27
- data/lib/active_record/secure_token.rb +48 -0
- data/lib/active_record/serialization.rb +8 -6
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +89 -36
- data/lib/active_record/store.rb +133 -43
- data/lib/active_record/suppressor.rb +61 -0
- data/lib/active_record/table_metadata.rb +81 -0
- data/lib/active_record/tasks/database_tasks.rb +366 -129
- data/lib/active_record/tasks/mysql_database_tasks.rb +68 -100
- data/lib/active_record/tasks/postgresql_database_tasks.rb +87 -39
- data/lib/active_record/tasks/sqlite_database_tasks.rb +44 -19
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +291 -0
- data/lib/active_record/timestamp.rb +86 -43
- data/lib/active_record/touch_later.rb +65 -0
- data/lib/active_record/transactions.rb +181 -152
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +126 -0
- data/lib/active_record/type/date.rb +4 -41
- data/lib/active_record/type/date_time.rb +4 -38
- data/lib/active_record/type/decimal_without_scale.rb +6 -2
- data/lib/active_record/type/hash_lookup_type_map.rb +12 -5
- data/lib/active_record/type/internal/timezone.rb +17 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +33 -15
- data/lib/active_record/type/text.rb +2 -2
- data/lib/active_record/type/time.rb +21 -16
- data/lib/active_record/type/type_map.rb +16 -19
- data/lib/active_record/type/unsigned_integer.rb +9 -8
- data/lib/active_record/type.rb +84 -23
- data/lib/active_record/type_caster/connection.rb +33 -0
- data/lib/active_record/type_caster/map.rb +23 -0
- data/lib/active_record/type_caster.rb +9 -0
- data/lib/active_record/validations/absence.rb +25 -0
- data/lib/active_record/validations/associated.rb +12 -4
- data/lib/active_record/validations/length.rb +26 -0
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/presence.rb +14 -13
- data/lib/active_record/validations/uniqueness.rb +65 -48
- data/lib/active_record/validations.rb +39 -35
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +44 -28
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +41 -0
- data/lib/arel/collectors/bind.rb +29 -0
- data/lib/arel/collectors/composite.rb +39 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -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/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +126 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -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 +15 -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 +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +76 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -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 +51 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -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 +19 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +31 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -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/nodes.rb +70 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +250 -0
- data/lib/arel/select_manager.rb +270 -0
- data/lib/arel/table.rb +118 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/dot.rb +308 -0
- data/lib/arel/visitors/mysql.rb +93 -0
- data/lib/arel/visitors/postgresql.rb +120 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +899 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +54 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +43 -37
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +26 -0
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +13 -10
- data/lib/rails/generators/active_record/migration.rb +35 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +55 -22
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +175 -65
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -24
- 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 -23
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -21
- data/lib/active_record/attribute.rb +0 -149
- data/lib/active_record/attribute_decorators.rb +0 -66
- data/lib/active_record/attribute_set/builder.rb +0 -86
- data/lib/active_record/attribute_set.rb +0 -77
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -275
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
- data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
- data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
- data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/serializers/xml_serializer.rb +0 -193
- data/lib/active_record/type/big_integer.rb +0 -13
- data/lib/active_record/type/binary.rb +0 -50
- data/lib/active_record/type/boolean.rb +0 -30
- data/lib/active_record/type/decimal.rb +0 -40
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -55
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -36
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/value.rb +0 -101
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -22
- data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
- /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,221 +1,439 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_record"
|
4
|
+
require "active_support/configuration_file"
|
5
|
+
require "active_support/deprecation"
|
6
|
+
|
7
|
+
databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
|
2
8
|
|
3
9
|
db_namespace = namespace :db do
|
4
|
-
|
5
|
-
|
10
|
+
desc "Set the environment value for the database"
|
11
|
+
task "environment:set" => :load_config do
|
12
|
+
raise ActiveRecord::EnvironmentStorageError unless ActiveRecord::InternalMetadata.enabled?
|
13
|
+
ActiveRecord::InternalMetadata.create_table
|
14
|
+
ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Base.connection.migration_context.current_environment
|
15
|
+
end
|
16
|
+
|
17
|
+
task check_protected_environments: :load_config do
|
18
|
+
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
|
19
|
+
end
|
20
|
+
|
21
|
+
task load_config: :environment do
|
22
|
+
if ActiveRecord::Base.configurations.empty?
|
23
|
+
ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration
|
24
|
+
end
|
25
|
+
|
6
26
|
ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
|
7
27
|
end
|
8
28
|
|
9
29
|
namespace :create do
|
10
|
-
task :
|
30
|
+
task all: :load_config do
|
11
31
|
ActiveRecord::Tasks::DatabaseTasks.create_all
|
12
32
|
end
|
33
|
+
|
34
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
35
|
+
desc "Create #{name} database for current environment"
|
36
|
+
task name => :load_config do
|
37
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
38
|
+
ActiveRecord::Tasks::DatabaseTasks.create(db_config)
|
39
|
+
end
|
40
|
+
end
|
13
41
|
end
|
14
42
|
|
15
|
-
desc
|
16
|
-
task :
|
43
|
+
desc "Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to creating the development and test databases, except when DATABASE_URL is present."
|
44
|
+
task create: [:load_config] do
|
17
45
|
ActiveRecord::Tasks::DatabaseTasks.create_current
|
18
46
|
end
|
19
47
|
|
20
48
|
namespace :drop do
|
21
|
-
task :
|
49
|
+
task all: [:load_config, :check_protected_environments] do
|
22
50
|
ActiveRecord::Tasks::DatabaseTasks.drop_all
|
23
51
|
end
|
52
|
+
|
53
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
54
|
+
desc "Drop #{name} database for current environment"
|
55
|
+
task name => [:load_config, :check_protected_environments] do
|
56
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
57
|
+
ActiveRecord::Tasks::DatabaseTasks.drop(db_config)
|
58
|
+
end
|
59
|
+
end
|
24
60
|
end
|
25
61
|
|
26
|
-
desc
|
27
|
-
task :
|
62
|
+
desc "Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to dropping the development and test databases, except when DATABASE_URL is present."
|
63
|
+
task drop: [:load_config, :check_protected_environments] do
|
64
|
+
db_namespace["drop:_unsafe"].invoke
|
65
|
+
end
|
66
|
+
|
67
|
+
task "drop:_unsafe" => [:load_config] do
|
28
68
|
ActiveRecord::Tasks::DatabaseTasks.drop_current
|
29
69
|
end
|
30
70
|
|
31
71
|
namespace :purge do
|
32
|
-
task :
|
72
|
+
task all: [:load_config, :check_protected_environments] do
|
33
73
|
ActiveRecord::Tasks::DatabaseTasks.purge_all
|
34
74
|
end
|
35
75
|
end
|
36
76
|
|
37
|
-
# desc "
|
38
|
-
task :
|
77
|
+
# desc "Truncates tables of each database for current environment"
|
78
|
+
task truncate_all: [:load_config, :check_protected_environments] do
|
79
|
+
ActiveRecord::Tasks::DatabaseTasks.truncate_all
|
80
|
+
end
|
81
|
+
|
82
|
+
# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:purge:all to purge all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases, except when DATABASE_URL is present."
|
83
|
+
task purge: [:load_config, :check_protected_environments] do
|
39
84
|
ActiveRecord::Tasks::DatabaseTasks.purge_current
|
40
85
|
end
|
41
86
|
|
42
87
|
desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
|
43
|
-
task
|
44
|
-
ActiveRecord::
|
45
|
-
|
88
|
+
task migrate: :load_config do
|
89
|
+
original_db_config = ActiveRecord::Base.connection_db_config
|
90
|
+
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
|
91
|
+
ActiveRecord::Base.establish_connection(db_config)
|
92
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
93
|
+
end
|
94
|
+
db_namespace["_dump"].invoke
|
95
|
+
ensure
|
96
|
+
ActiveRecord::Base.establish_connection(original_db_config)
|
46
97
|
end
|
47
98
|
|
99
|
+
# IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
|
48
100
|
task :_dump do
|
49
|
-
|
50
|
-
|
51
|
-
when :sql then db_namespace["structure:dump"].invoke
|
52
|
-
else
|
53
|
-
raise "unknown schema format #{ActiveRecord::Base.schema_format}"
|
101
|
+
if ActiveRecord::Base.dump_schema_after_migration
|
102
|
+
db_namespace["schema:dump"].invoke
|
54
103
|
end
|
55
104
|
# Allow this task to be called as many times as required. An example is the
|
56
105
|
# migrate:redo task, which calls other two internally that depend on this one.
|
57
|
-
db_namespace[
|
106
|
+
db_namespace["_dump"].reenable
|
107
|
+
end
|
108
|
+
|
109
|
+
namespace :_dump do
|
110
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
111
|
+
# IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
|
112
|
+
task name do
|
113
|
+
if ActiveRecord::Base.dump_schema_after_migration
|
114
|
+
db_namespace["schema:dump:#{name}"].invoke
|
115
|
+
end
|
116
|
+
# Allow this task to be called as many times as required. An example is the
|
117
|
+
# migrate:redo task, which calls other two internally that depend on this one.
|
118
|
+
db_namespace["_dump:#{name}"].reenable
|
119
|
+
end
|
120
|
+
end
|
58
121
|
end
|
59
122
|
|
60
123
|
namespace :migrate do
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
124
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
125
|
+
desc "Migrate #{name} database for current environment"
|
126
|
+
task name => :load_config do
|
127
|
+
original_db_config = ActiveRecord::Base.connection_db_config
|
128
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
129
|
+
ActiveRecord::Base.establish_connection(db_config)
|
130
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
131
|
+
db_namespace["_dump:#{name}"].invoke
|
132
|
+
ensure
|
133
|
+
ActiveRecord::Base.establish_connection(original_db_config)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
desc "Rolls back the database one migration and re-migrates up (options: STEP=x, VERSION=x)."
|
138
|
+
task redo: :load_config do
|
139
|
+
ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:redo")
|
140
|
+
|
141
|
+
raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
|
142
|
+
|
143
|
+
if ENV["VERSION"]
|
144
|
+
db_namespace["migrate:down"].invoke
|
145
|
+
db_namespace["migrate:up"].invoke
|
66
146
|
else
|
67
|
-
db_namespace[
|
68
|
-
db_namespace[
|
147
|
+
db_namespace["rollback"].invoke
|
148
|
+
db_namespace["migrate"].invoke
|
69
149
|
end
|
70
150
|
end
|
71
151
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
task :down => [:environment, :load_config] do
|
85
|
-
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
|
86
|
-
raise 'VERSION is required - To go down one migration, run db:rollback' unless version
|
87
|
-
ActiveRecord::Migrator.run(:down, ActiveRecord::Migrator.migrations_paths, version)
|
88
|
-
db_namespace['_dump'].invoke
|
89
|
-
end
|
90
|
-
|
91
|
-
desc 'Display status of migrations'
|
92
|
-
task :status => [:environment, :load_config] do
|
93
|
-
unless ActiveRecord::SchemaMigration.table_exists?
|
94
|
-
abort 'Schema migrations table does not exist yet.'
|
95
|
-
end
|
96
|
-
db_list = ActiveRecord::SchemaMigration.normalized_versions
|
97
|
-
|
98
|
-
file_list =
|
99
|
-
ActiveRecord::Migrator.migrations_paths.flat_map do |path|
|
100
|
-
# match "20091231235959_some_name.rb" and "001_some_name.rb" pattern
|
101
|
-
Dir.foreach(path).grep(/^(\d{3,})_(.+)\.rb$/) do
|
102
|
-
version = ActiveRecord::SchemaMigration.normalize_migration_number($1)
|
103
|
-
status = db_list.delete(version) ? 'up' : 'down'
|
104
|
-
[status, version, $2.humanize]
|
105
|
-
end
|
152
|
+
namespace :redo do
|
153
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
154
|
+
desc "Rolls back #{name} database one migration and re-migrates up (options: STEP=x, VERSION=x)."
|
155
|
+
task name => :load_config do
|
156
|
+
raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
|
157
|
+
|
158
|
+
if ENV["VERSION"]
|
159
|
+
db_namespace["migrate:down:#{name}"].invoke
|
160
|
+
db_namespace["migrate:up:#{name}"].invoke
|
161
|
+
else
|
162
|
+
db_namespace["rollback:#{name}"].invoke
|
163
|
+
db_namespace["migrate:#{name}"].invoke
|
106
164
|
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# desc 'Resets your database using your migrations for the current environment'
|
170
|
+
task reset: ["db:drop", "db:create", "db:migrate"]
|
171
|
+
|
172
|
+
desc 'Runs the "up" for a given migration VERSION.'
|
173
|
+
task up: :load_config do
|
174
|
+
ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:up")
|
107
175
|
|
108
|
-
|
109
|
-
|
176
|
+
raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
177
|
+
|
178
|
+
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
179
|
+
|
180
|
+
ActiveRecord::Base.connection.migration_context.run(
|
181
|
+
:up,
|
182
|
+
ActiveRecord::Tasks::DatabaseTasks.target_version
|
183
|
+
)
|
184
|
+
db_namespace["_dump"].invoke
|
185
|
+
end
|
186
|
+
|
187
|
+
namespace :up do
|
188
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
189
|
+
task name => :load_config do
|
190
|
+
raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
191
|
+
|
192
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
193
|
+
|
194
|
+
ActiveRecord::Base.establish_connection(db_config)
|
195
|
+
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
196
|
+
ActiveRecord::Base.connection.migration_context.run(
|
197
|
+
:up,
|
198
|
+
ActiveRecord::Tasks::DatabaseTasks.target_version
|
199
|
+
)
|
200
|
+
|
201
|
+
db_namespace["_dump"].invoke
|
202
|
+
end
|
110
203
|
end
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
(
|
116
|
-
|
204
|
+
end
|
205
|
+
|
206
|
+
desc 'Runs the "down" for a given migration VERSION.'
|
207
|
+
task down: :load_config do
|
208
|
+
ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:down")
|
209
|
+
|
210
|
+
raise "VERSION is required - To go down one migration, use db:rollback" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
211
|
+
|
212
|
+
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
213
|
+
|
214
|
+
ActiveRecord::Base.connection.migration_context.run(
|
215
|
+
:down,
|
216
|
+
ActiveRecord::Tasks::DatabaseTasks.target_version
|
217
|
+
)
|
218
|
+
db_namespace["_dump"].invoke
|
219
|
+
end
|
220
|
+
|
221
|
+
namespace :down do
|
222
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
223
|
+
task name => :load_config do
|
224
|
+
raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
225
|
+
|
226
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
227
|
+
|
228
|
+
ActiveRecord::Base.establish_connection(db_config)
|
229
|
+
ActiveRecord::Tasks::DatabaseTasks.check_target_version
|
230
|
+
ActiveRecord::Base.connection.migration_context.run(
|
231
|
+
:down,
|
232
|
+
ActiveRecord::Tasks::DatabaseTasks.target_version
|
233
|
+
)
|
234
|
+
|
235
|
+
db_namespace["_dump"].invoke
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
desc "Display status of migrations"
|
241
|
+
task status: :load_config do
|
242
|
+
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
|
243
|
+
ActiveRecord::Base.establish_connection(db_config)
|
244
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate_status
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
namespace :status do
|
249
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
250
|
+
desc "Display status of migrations for #{name} database"
|
251
|
+
task name => :load_config do
|
252
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
253
|
+
ActiveRecord::Base.establish_connection(db_config)
|
254
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate_status
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
namespace :rollback do
|
261
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
262
|
+
desc "Rollback #{name} database for current environment (specify steps w/ STEP=n)."
|
263
|
+
task name => :load_config do
|
264
|
+
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
265
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
266
|
+
|
267
|
+
ActiveRecord::Base.establish_connection(db_config)
|
268
|
+
ActiveRecord::Base.connection.migration_context.rollback(step)
|
269
|
+
|
270
|
+
db_namespace["_dump"].invoke
|
117
271
|
end
|
118
|
-
puts
|
119
272
|
end
|
120
273
|
end
|
121
274
|
|
122
|
-
desc
|
123
|
-
task
|
124
|
-
|
125
|
-
|
126
|
-
|
275
|
+
desc "Rolls the schema back to the previous version (specify steps w/ STEP=n)."
|
276
|
+
task rollback: :load_config do
|
277
|
+
ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:rollback")
|
278
|
+
|
279
|
+
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
280
|
+
|
281
|
+
ActiveRecord::Base.connection.migration_context.rollback(step)
|
282
|
+
|
283
|
+
db_namespace["_dump"].invoke
|
127
284
|
end
|
128
285
|
|
129
286
|
# desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
|
130
|
-
task
|
131
|
-
step = ENV[
|
132
|
-
ActiveRecord::
|
133
|
-
db_namespace[
|
287
|
+
task forward: :load_config do
|
288
|
+
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
289
|
+
ActiveRecord::Base.connection.migration_context.forward(step)
|
290
|
+
db_namespace["_dump"].invoke
|
134
291
|
end
|
135
292
|
|
136
|
-
|
137
|
-
task :
|
138
|
-
db_namespace["drop"].invoke
|
139
|
-
db_namespace["setup"].invoke
|
140
|
-
end
|
293
|
+
desc "Drops and recreates the database from db/schema.rb for the current environment and loads the seeds."
|
294
|
+
task reset: [ "db:drop", "db:setup" ]
|
141
295
|
|
142
296
|
# desc "Retrieves the charset for the current environment's database"
|
143
|
-
task
|
297
|
+
task charset: :load_config do
|
144
298
|
puts ActiveRecord::Tasks::DatabaseTasks.charset_current
|
145
299
|
end
|
146
300
|
|
147
301
|
# desc "Retrieves the collation for the current environment's database"
|
148
|
-
task
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
$stderr.puts 'Sorry, your database adapter is not supported yet. Feel free to submit a patch.'
|
153
|
-
end
|
302
|
+
task collation: :load_config do
|
303
|
+
puts ActiveRecord::Tasks::DatabaseTasks.collation_current
|
304
|
+
rescue NoMethodError
|
305
|
+
$stderr.puts "Sorry, your database adapter is not supported yet. Feel free to submit a patch."
|
154
306
|
end
|
155
307
|
|
156
|
-
desc
|
157
|
-
task
|
158
|
-
puts "Current version: #{ActiveRecord::
|
308
|
+
desc "Retrieves the current schema version number"
|
309
|
+
task version: :load_config do
|
310
|
+
puts "Current version: #{ActiveRecord::Base.connection.migration_context.current_version}"
|
159
311
|
end
|
160
312
|
|
161
313
|
# desc "Raises an error if there are pending migrations"
|
162
|
-
task :
|
163
|
-
pending_migrations = ActiveRecord::
|
314
|
+
task abort_if_pending_migrations: :load_config do
|
315
|
+
pending_migrations = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).flat_map do |db_config|
|
316
|
+
ActiveRecord::Base.establish_connection(db_config)
|
317
|
+
|
318
|
+
ActiveRecord::Base.connection.migration_context.open.pending_migrations
|
319
|
+
end
|
164
320
|
|
165
321
|
if pending_migrations.any?
|
166
322
|
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
167
323
|
pending_migrations.each do |pending_migration|
|
168
|
-
puts
|
324
|
+
puts " %4d %s" % [pending_migration.version, pending_migration.name]
|
325
|
+
end
|
326
|
+
abort %{Run `bin/rails db:migrate` to update your database then try again.}
|
327
|
+
end
|
328
|
+
ensure
|
329
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
|
330
|
+
end
|
331
|
+
|
332
|
+
namespace :abort_if_pending_migrations do
|
333
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
334
|
+
# desc "Raises an error if there are pending migrations for #{name} database"
|
335
|
+
task name => :load_config do
|
336
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
337
|
+
ActiveRecord::Base.establish_connection(db_config)
|
338
|
+
|
339
|
+
pending_migrations = ActiveRecord::Base.connection.migration_context.open.pending_migrations
|
340
|
+
|
341
|
+
if pending_migrations.any?
|
342
|
+
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
343
|
+
pending_migrations.each do |pending_migration|
|
344
|
+
puts " %4d %s" % [pending_migration.version, pending_migration.name]
|
345
|
+
end
|
346
|
+
abort %{Run `bin/rails db:migrate:#{name}` to update your database then try again.}
|
347
|
+
end
|
169
348
|
end
|
170
|
-
abort %{Run `rake db:migrate` to update your database then try again.}
|
171
349
|
end
|
172
350
|
end
|
173
351
|
|
174
|
-
desc
|
175
|
-
task :
|
352
|
+
desc "Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)"
|
353
|
+
task setup: ["db:create", :environment, "db:schema:load", :seed]
|
354
|
+
|
355
|
+
desc "Runs setup if database does not exist, or runs migrations if it does"
|
356
|
+
task prepare: :load_config do
|
357
|
+
seed = false
|
358
|
+
|
359
|
+
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
|
360
|
+
ActiveRecord::Base.establish_connection(db_config)
|
361
|
+
|
362
|
+
# Skipped when no database
|
363
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
364
|
+
|
365
|
+
if ActiveRecord::Base.dump_schema_after_migration
|
366
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, ActiveRecord::Base.schema_format)
|
367
|
+
end
|
368
|
+
rescue ActiveRecord::NoDatabaseError
|
369
|
+
config_name = db_config.name
|
370
|
+
ActiveRecord::Tasks::DatabaseTasks.create_current(db_config.env_name, config_name)
|
371
|
+
|
372
|
+
if File.exist?(ActiveRecord::Tasks::DatabaseTasks.dump_filename(config_name))
|
373
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(
|
374
|
+
db_config,
|
375
|
+
ActiveRecord::Base.schema_format,
|
376
|
+
nil
|
377
|
+
)
|
378
|
+
else
|
379
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
380
|
+
end
|
381
|
+
|
382
|
+
seed = true
|
383
|
+
end
|
384
|
+
|
385
|
+
ActiveRecord::Base.establish_connection
|
386
|
+
ActiveRecord::Tasks::DatabaseTasks.load_seed if seed
|
387
|
+
end
|
176
388
|
|
177
|
-
desc
|
178
|
-
task :
|
179
|
-
db_namespace[
|
389
|
+
desc "Loads the seed data from db/seeds.rb"
|
390
|
+
task seed: :load_config do
|
391
|
+
db_namespace["abort_if_pending_migrations"].invoke
|
180
392
|
ActiveRecord::Tasks::DatabaseTasks.load_seed
|
181
393
|
end
|
182
394
|
|
395
|
+
namespace :seed do
|
396
|
+
desc "Truncates tables of each database for current environment and loads the seeds"
|
397
|
+
task replant: [:load_config, :truncate_all, :seed]
|
398
|
+
end
|
399
|
+
|
183
400
|
namespace :fixtures do
|
184
|
-
desc "
|
185
|
-
task
|
186
|
-
require
|
401
|
+
desc "Loads fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z. Specify an alternative path (e.g. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
|
402
|
+
task load: :load_config do
|
403
|
+
require "active_record/fixtures"
|
187
404
|
|
188
405
|
base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
|
189
406
|
|
190
|
-
fixtures_dir = if ENV[
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
407
|
+
fixtures_dir = if ENV["FIXTURES_DIR"]
|
408
|
+
File.join base_dir, ENV["FIXTURES_DIR"]
|
409
|
+
else
|
410
|
+
base_dir
|
411
|
+
end
|
195
412
|
|
196
|
-
fixture_files = if ENV[
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
413
|
+
fixture_files = if ENV["FIXTURES"]
|
414
|
+
ENV["FIXTURES"].split(",")
|
415
|
+
else
|
416
|
+
files = Dir[File.join(fixtures_dir, "**/*.{yml}")]
|
417
|
+
files.reject! { |f| f.start_with?(File.join(fixtures_dir, "files")) }
|
418
|
+
files.map! { |f| f[fixtures_dir.to_s.size..-5].delete_prefix("/") }
|
419
|
+
end
|
202
420
|
|
203
421
|
ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
|
204
422
|
end
|
205
423
|
|
206
|
-
# desc "Search for a fixture given a LABEL or ID. Specify an alternative path (
|
207
|
-
task
|
208
|
-
require
|
424
|
+
# desc "Search for a fixture given a LABEL or ID. Specify an alternative path (e.g. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
|
425
|
+
task identify: :load_config do
|
426
|
+
require "active_record/fixtures"
|
209
427
|
|
210
|
-
label, id = ENV[
|
211
|
-
raise
|
428
|
+
label, id = ENV["LABEL"], ENV["ID"]
|
429
|
+
raise "LABEL or ID required" if label.blank? && id.blank?
|
212
430
|
|
213
431
|
puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::FixtureSet.identify(label)}.) if label
|
214
432
|
|
215
433
|
base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
|
216
434
|
|
217
435
|
Dir["#{base_dir}/**/*.yml"].each do |file|
|
218
|
-
if data =
|
436
|
+
if data = ActiveSupport::ConfigurationFile.parse(file)
|
219
437
|
data.each_key do |key|
|
220
438
|
key_id = ActiveRecord::FixtureSet.identify(key)
|
221
439
|
|
@@ -229,134 +447,229 @@ db_namespace = namespace :db do
|
|
229
447
|
end
|
230
448
|
|
231
449
|
namespace :schema do
|
232
|
-
desc
|
233
|
-
task
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
450
|
+
desc "Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`)"
|
451
|
+
task dump: :load_config do
|
452
|
+
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
|
453
|
+
ActiveRecord::Base.establish_connection(db_config)
|
454
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config)
|
238
455
|
end
|
239
|
-
|
456
|
+
|
457
|
+
db_namespace["schema:dump"].reenable
|
240
458
|
end
|
241
459
|
|
242
|
-
desc
|
243
|
-
task :
|
244
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(
|
460
|
+
desc "Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the database"
|
461
|
+
task load: [:load_config, :check_protected_environments] do
|
462
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(ActiveRecord::Base.schema_format, ENV["SCHEMA"])
|
245
463
|
end
|
246
464
|
|
247
|
-
task :
|
465
|
+
task load_if_ruby: ["db:create", :environment] do
|
466
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
467
|
+
Using `bin/rails db:schema:load_if_ruby` is deprecated and will be removed in Rails 7.0.
|
468
|
+
Configure the format using `config.active_record.schema_format = :ruby` to use `schema.rb` and run `bin/rails db:schema:load` instead.
|
469
|
+
MSG
|
248
470
|
db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
|
249
471
|
end
|
250
472
|
|
251
|
-
namespace :
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
473
|
+
namespace :dump do
|
474
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
475
|
+
desc "Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) for #{name} database"
|
476
|
+
task name => :load_config do
|
477
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env, name: name)
|
478
|
+
ActiveRecord::Base.establish_connection(db_config)
|
479
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config)
|
480
|
+
db_namespace["schema:dump:#{name}"].reenable
|
481
|
+
end
|
260
482
|
end
|
483
|
+
end
|
261
484
|
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
485
|
+
namespace :load do
|
486
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
487
|
+
desc "Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the #{name} database"
|
488
|
+
task name => :load_config do
|
489
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env, name: name)
|
490
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, ActiveRecord::Base.schema_format, ENV["SCHEMA"])
|
491
|
+
end
|
266
492
|
end
|
267
493
|
end
|
268
494
|
|
269
|
-
|
495
|
+
namespace :cache do
|
496
|
+
desc "Creates a db/schema_cache.yml file."
|
497
|
+
task dump: :load_config do
|
498
|
+
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
|
499
|
+
ActiveRecord::Base.establish_connection(db_config)
|
500
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
|
501
|
+
db_config.name,
|
502
|
+
schema_cache_path: db_config.schema_cache_path,
|
503
|
+
)
|
504
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(
|
505
|
+
ActiveRecord::Base.connection,
|
506
|
+
filename,
|
507
|
+
)
|
508
|
+
end
|
509
|
+
end
|
270
510
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
f.puts ActiveRecord::Base.connection.dump_schema_information
|
282
|
-
f.print "\n"
|
511
|
+
desc "Clears a db/schema_cache.yml file."
|
512
|
+
task clear: :load_config do
|
513
|
+
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
|
514
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
|
515
|
+
db_config.name,
|
516
|
+
schema_cache_path: db_config.schema_cache_path,
|
517
|
+
)
|
518
|
+
ActiveRecord::Tasks::DatabaseTasks.clear_schema_cache(
|
519
|
+
filename,
|
520
|
+
)
|
283
521
|
end
|
284
522
|
end
|
285
|
-
db_namespace['structure:dump'].reenable
|
286
523
|
end
|
524
|
+
end
|
287
525
|
|
288
|
-
|
289
|
-
|
290
|
-
|
526
|
+
namespace :structure do
|
527
|
+
desc "Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
|
528
|
+
task dump: :load_config do
|
529
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
530
|
+
Using `bin/rails db:structure:dump` is deprecated and will be removed in Rails 7.0.
|
531
|
+
Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:dump` instead.
|
532
|
+
MSG
|
533
|
+
|
534
|
+
db_namespace["schema:dump"].invoke
|
535
|
+
db_namespace["structure:dump"].reenable
|
291
536
|
end
|
292
537
|
|
293
|
-
|
294
|
-
|
538
|
+
desc "Recreates the databases from the structure.sql file"
|
539
|
+
task load: [:load_config, :check_protected_environments] do
|
540
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
541
|
+
Using `bin/rails db:structure:load` is deprecated and will be removed in Rails 7.0.
|
542
|
+
Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load` instead.
|
543
|
+
MSG
|
544
|
+
db_namespace["schema:load"].invoke
|
295
545
|
end
|
296
|
-
end
|
297
|
-
|
298
|
-
namespace :test do
|
299
546
|
|
300
|
-
task :
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
547
|
+
task load_if_sql: ["db:create", :environment] do
|
548
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
549
|
+
Using `bin/rails db:structure:load_if_sql` is deprecated and will be removed in Rails 7.0.
|
550
|
+
Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load` instead.
|
551
|
+
MSG
|
552
|
+
db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :sql
|
305
553
|
end
|
306
554
|
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
555
|
+
namespace :dump do
|
556
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
557
|
+
desc "Dumps the #{name} database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
|
558
|
+
task name => :load_config do
|
559
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
560
|
+
Using `bin/rails db:structure:dump:#{name}` is deprecated and will be removed in Rails 7.0.
|
561
|
+
Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:dump:#{name}` instead.
|
562
|
+
MSG
|
563
|
+
db_namespace["schema:dump:#{name}"].invoke
|
564
|
+
db_namespace["structure:dump:#{name}"].reenable
|
565
|
+
end
|
314
566
|
end
|
315
567
|
end
|
316
568
|
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
569
|
+
namespace :load do
|
570
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
571
|
+
desc "Recreates the #{name} database from the structure.sql file"
|
572
|
+
task name => :load_config do
|
573
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
574
|
+
Using `bin/rails db:structure:load:#{name}` is deprecated and will be removed in Rails 7.0.
|
575
|
+
Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:schema:load:#{name}` instead.
|
576
|
+
MSG
|
577
|
+
db_namespace["schema:load:#{name}"].invoke
|
326
578
|
end
|
327
579
|
end
|
328
580
|
end
|
581
|
+
end
|
329
582
|
|
330
|
-
|
331
|
-
|
332
|
-
|
583
|
+
namespace :test do
|
584
|
+
# desc "Recreate the test database from the current schema"
|
585
|
+
task load: %w(db:test:purge) do
|
586
|
+
db_namespace["test:load_schema"].invoke
|
333
587
|
end
|
334
588
|
|
335
|
-
# desc "Recreate the test database from
|
336
|
-
task :
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
589
|
+
# desc "Recreate the test database from an existent schema file (schema.rb or structure.sql, depending on `config.active_record.schema_format`)"
|
590
|
+
task load_schema: %w(db:test:purge) do
|
591
|
+
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
|
592
|
+
ActiveRecord::Schema.verbose = false
|
593
|
+
ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
|
594
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.name)
|
595
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, ActiveRecord::Base.schema_format, filename)
|
596
|
+
end
|
597
|
+
ensure
|
598
|
+
if should_reconnect
|
599
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
|
342
600
|
end
|
343
601
|
end
|
344
602
|
|
345
|
-
# desc "Recreate the test database from
|
346
|
-
task :
|
347
|
-
|
348
|
-
|
349
|
-
|
603
|
+
# desc "Recreate the test database from an existent structure.sql file"
|
604
|
+
task load_structure: %w(db:test:purge) do
|
605
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
606
|
+
Using `bin/rails db:test:load_structure` is deprecated and will be removed in Rails 7.0.
|
607
|
+
Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:test:load_schema` instead.
|
608
|
+
MSG
|
609
|
+
db_namespace["test:load_schema"].invoke
|
610
|
+
end
|
350
611
|
|
351
612
|
# desc "Empty the test database"
|
352
|
-
task :
|
353
|
-
ActiveRecord::
|
613
|
+
task purge: %w(load_config check_protected_environments) do
|
614
|
+
ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
|
615
|
+
ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
|
616
|
+
end
|
354
617
|
end
|
355
618
|
|
356
|
-
# desc '
|
357
|
-
task :
|
619
|
+
# desc 'Load the test schema'
|
620
|
+
task prepare: :load_config do
|
358
621
|
unless ActiveRecord::Base.configurations.blank?
|
359
|
-
db_namespace[
|
622
|
+
db_namespace["test:load"].invoke
|
623
|
+
end
|
624
|
+
end
|
625
|
+
|
626
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
627
|
+
# desc "Recreate the #{name} test database"
|
628
|
+
namespace :load do
|
629
|
+
task name => "db:test:purge:#{name}" do
|
630
|
+
db_namespace["test:load_schema:#{name}"].invoke
|
631
|
+
end
|
632
|
+
end
|
633
|
+
|
634
|
+
# desc "Recreate the #{name} test database from an existent schema.rb file"
|
635
|
+
namespace :load_schema do
|
636
|
+
task name => "db:test:purge:#{name}" do
|
637
|
+
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
|
638
|
+
ActiveRecord::Schema.verbose = false
|
639
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(name)
|
640
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", name: name)
|
641
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, ActiveRecord::Base.schema_format, filename)
|
642
|
+
ensure
|
643
|
+
if should_reconnect
|
644
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
|
645
|
+
end
|
646
|
+
end
|
647
|
+
end
|
648
|
+
|
649
|
+
# desc "Recreate the #{name} test database from an existent structure.sql file"
|
650
|
+
namespace :load_structure do
|
651
|
+
task name => "db:test:purge:#{name}" do
|
652
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
653
|
+
Using `bin/rails db:test:load_structure:#{name}` is deprecated and will be removed in Rails 7.0.
|
654
|
+
Configure the format using `config.active_record.schema_format = :sql` to use `structure.sql` and run `bin/rails db:test:load_structure:#{name}` instead.
|
655
|
+
MSG
|
656
|
+
db_namespace["test:load_schema:#{name}"].invoke
|
657
|
+
end
|
658
|
+
end
|
659
|
+
|
660
|
+
# desc "Empty the #{name} test database"
|
661
|
+
namespace :purge do
|
662
|
+
task name => %w(load_config check_protected_environments) do
|
663
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", name: name)
|
664
|
+
ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
|
665
|
+
end
|
666
|
+
end
|
667
|
+
|
668
|
+
# desc 'Load the #{name} database test schema'
|
669
|
+
namespace :prepare do
|
670
|
+
task name => :load_config do
|
671
|
+
db_namespace["test:load:#{name}"].invoke
|
672
|
+
end
|
360
673
|
end
|
361
674
|
end
|
362
675
|
end
|
@@ -365,15 +678,19 @@ end
|
|
365
678
|
namespace :railties do
|
366
679
|
namespace :install do
|
367
680
|
# desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
|
368
|
-
task :
|
369
|
-
to_load = ENV[
|
681
|
+
task migrations: :'db:load_config' do
|
682
|
+
to_load = ENV["FROM"].blank? ? :all : ENV["FROM"].split(",").map(&:strip)
|
370
683
|
railties = {}
|
371
684
|
Rails.application.migration_railties.each do |railtie|
|
372
685
|
next unless to_load == :all || to_load.include?(railtie.railtie_name)
|
373
686
|
|
374
|
-
if railtie.respond_to?(:paths) && (path = railtie.paths[
|
687
|
+
if railtie.respond_to?(:paths) && (path = railtie.paths["db/migrate"].first)
|
375
688
|
railties[railtie.railtie_name] = path
|
376
689
|
end
|
690
|
+
|
691
|
+
unless ENV["MIGRATIONS_PATH"].blank?
|
692
|
+
railties[railtie.railtie_name] = railtie.root + ENV["MIGRATIONS_PATH"]
|
693
|
+
end
|
377
694
|
end
|
378
695
|
|
379
696
|
on_skip = Proc.new do |name, migration|
|
@@ -384,8 +701,8 @@ namespace :railties do
|
|
384
701
|
puts "Copied migration #{migration.basename} from #{name}"
|
385
702
|
end
|
386
703
|
|
387
|
-
ActiveRecord::Migration.copy(ActiveRecord::
|
388
|
-
:
|
704
|
+
ActiveRecord::Migration.copy(ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first, railties,
|
705
|
+
on_skip: on_skip, on_copy: on_copy)
|
389
706
|
end
|
390
707
|
end
|
391
708
|
end
|