activerecord 4.2.8 → 6.0.0
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.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +612 -1583
- data/MIT-LICENSE +4 -2
- data/README.rdoc +13 -12
- data/examples/performance.rb +33 -32
- data/examples/simple.rb +5 -4
- data/lib/active_record.rb +41 -22
- data/lib/active_record/aggregations.rb +267 -251
- data/lib/active_record/association_relation.rb +11 -6
- data/lib/active_record/associations.rb +1737 -1597
- data/lib/active_record/associations/alias_tracker.rb +29 -35
- data/lib/active_record/associations/association.rb +125 -58
- data/lib/active_record/associations/association_scope.rb +103 -132
- data/lib/active_record/associations/belongs_to_association.rb +65 -60
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +27 -40
- data/lib/active_record/associations/builder/belongs_to.rb +69 -55
- data/lib/active_record/associations/builder/collection_association.rb +10 -33
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +52 -66
- data/lib/active_record/associations/builder/has_many.rb +8 -4
- data/lib/active_record/associations/builder/has_one.rb +46 -5
- data/lib/active_record/associations/builder/singular_association.rb +16 -10
- data/lib/active_record/associations/collection_association.rb +134 -286
- data/lib/active_record/associations/collection_proxy.rb +241 -146
- data/lib/active_record/associations/foreign_association.rb +10 -1
- data/lib/active_record/associations/has_many_association.rb +34 -97
- data/lib/active_record/associations/has_many_through_association.rb +60 -87
- data/lib/active_record/associations/has_one_association.rb +61 -49
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency.rb +137 -167
- data/lib/active_record/associations/join_dependency/join_association.rb +38 -88
- 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/preloader.rb +90 -92
- data/lib/active_record/associations/preloader/association.rb +90 -123
- data/lib/active_record/associations/preloader/through_association.rb +85 -65
- data/lib/active_record/associations/singular_association.rb +18 -39
- data/lib/active_record/associations/through_association.rb +38 -18
- data/lib/active_record/attribute_assignment.rb +56 -183
- data/lib/active_record/attribute_decorators.rb +39 -15
- data/lib/active_record/attribute_methods.rb +120 -135
- data/lib/active_record/attribute_methods/before_type_cast.rb +13 -8
- data/lib/active_record/attribute_methods/dirty.rb +174 -144
- data/lib/active_record/attribute_methods/primary_key.rb +91 -83
- data/lib/active_record/attribute_methods/query.rb +6 -5
- data/lib/active_record/attribute_methods/read.rb +20 -76
- data/lib/active_record/attribute_methods/serialization.rb +40 -20
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +58 -36
- data/lib/active_record/attribute_methods/write.rb +32 -54
- data/lib/active_record/attributes.rb +214 -82
- data/lib/active_record/autosave_association.rb +91 -37
- data/lib/active_record/base.rb +57 -45
- data/lib/active_record/callbacks.rb +100 -74
- data/lib/active_record/coders/json.rb +3 -1
- data/lib/active_record/coders/yaml_column.rb +24 -12
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +796 -296
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +234 -115
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +82 -23
- data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -46
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +356 -227
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +664 -244
- data/lib/active_record/connection_adapters/abstract/transaction.rb +191 -83
- data/lib/active_record/connection_adapters/abstract_adapter.rb +460 -204
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +510 -627
- data/lib/active_record/connection_adapters/column.rb +56 -43
- data/lib/active_record/connection_adapters/connection_specification.rb +174 -152
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +58 -188
- data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -114
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +50 -58
- 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 +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -22
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -19
- 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 +45 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
- data/lib/active_record/connection_adapters/postgresql/oid/{integer.rb → oid.rb} +6 -2
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +33 -11
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -34
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +10 -5
- 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/quoting.rb +144 -47
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +470 -290
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +12 -8
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +551 -356
- data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -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 +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +290 -345
- data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
- data/lib/active_record/connection_handling.rb +176 -41
- data/lib/active_record/core.rb +251 -231
- data/lib/active_record/counter_cache.rb +67 -49
- 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 +79 -0
- data/lib/active_record/define_callbacks.rb +22 -0
- data/lib/active_record/dynamic_matchers.rb +87 -105
- data/lib/active_record/enum.rb +163 -86
- data/lib/active_record/errors.rb +188 -53
- data/lib/active_record/explain.rb +23 -11
- data/lib/active_record/explain_registry.rb +4 -2
- data/lib/active_record/explain_subscriber.rb +10 -5
- data/lib/active_record/fixture_set/file.rb +35 -9
- 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 +153 -0
- data/lib/active_record/fixture_set/table_rows.rb +47 -0
- data/lib/active_record/fixtures.rb +228 -499
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +158 -112
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +123 -29
- data/lib/active_record/internal_metadata.rb +53 -0
- data/lib/active_record/legacy_yaml_adapter.rb +21 -3
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +87 -96
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +76 -33
- data/lib/active_record/middleware/database_selector.rb +75 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/migration.rb +626 -283
- data/lib/active_record/migration/command_recorder.rb +177 -90
- data/lib/active_record/migration/compatibility.rb +244 -0
- data/lib/active_record/migration/join_table.rb +8 -6
- data/lib/active_record/model_schema.rb +314 -112
- data/lib/active_record/nested_attributes.rb +264 -222
- data/lib/active_record/no_touching.rb +14 -1
- data/lib/active_record/null_relation.rb +24 -37
- data/lib/active_record/persistence.rb +557 -125
- data/lib/active_record/query_cache.rb +19 -23
- data/lib/active_record/querying.rb +43 -29
- data/lib/active_record/railtie.rb +147 -46
- 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 +330 -197
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +428 -279
- data/lib/active_record/relation.rb +518 -341
- data/lib/active_record/relation/batches.rb +207 -55
- data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
- data/lib/active_record/relation/calculations.rb +267 -253
- data/lib/active_record/relation/delegation.rb +70 -80
- data/lib/active_record/relation/finder_methods.rb +277 -241
- data/lib/active_record/relation/from_clause.rb +26 -0
- data/lib/active_record/relation/merger.rb +78 -87
- data/lib/active_record/relation/predicate_builder.rb +114 -119
- data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -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 +53 -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/query_attribute.rb +50 -0
- data/lib/active_record/relation/query_methods.rb +575 -394
- data/lib/active_record/relation/record_fetch_warning.rb +51 -0
- data/lib/active_record/relation/spawn_methods.rb +11 -13
- data/lib/active_record/relation/where_clause.rb +190 -0
- data/lib/active_record/relation/where_clause_factory.rb +33 -0
- data/lib/active_record/result.rb +79 -42
- data/lib/active_record/runtime_registry.rb +6 -4
- data/lib/active_record/sanitization.rb +144 -121
- data/lib/active_record/schema.rb +21 -24
- data/lib/active_record/schema_dumper.rb +112 -93
- data/lib/active_record/schema_migration.rb +24 -17
- data/lib/active_record/scoping.rb +45 -26
- data/lib/active_record/scoping/default.rb +101 -85
- data/lib/active_record/scoping/named.rb +86 -33
- data/lib/active_record/secure_token.rb +40 -0
- data/lib/active_record/serialization.rb +5 -5
- data/lib/active_record/statement_cache.rb +73 -36
- data/lib/active_record/store.rb +127 -42
- data/lib/active_record/suppressor.rb +61 -0
- data/lib/active_record/table_metadata.rb +75 -0
- data/lib/active_record/tasks/database_tasks.rb +308 -99
- data/lib/active_record/tasks/mysql_database_tasks.rb +55 -99
- data/lib/active_record/tasks/postgresql_database_tasks.rb +81 -41
- data/lib/active_record/tasks/sqlite_database_tasks.rb +38 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +224 -0
- data/lib/active_record/timestamp.rb +86 -40
- data/lib/active_record/touch_later.rb +66 -0
- data/lib/active_record/transactions.rb +216 -150
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type.rb +78 -23
- data/lib/active_record/type/adapter_specific_registry.rb +129 -0
- data/lib/active_record/type/date.rb +4 -45
- data/lib/active_record/type/date_time.rb +4 -49
- data/lib/active_record/type/decimal_without_scale.rb +6 -2
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -3
- 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 +24 -15
- data/lib/active_record/type/text.rb +2 -2
- data/lib/active_record/type/time.rb +11 -16
- data/lib/active_record/type/type_map.rb +15 -17
- data/lib/active_record/type/unsigned_integer.rb +9 -7
- data/lib/active_record/type_caster.rb +9 -0
- data/lib/active_record/type_caster/connection.rb +34 -0
- data/lib/active_record/type_caster/map.rb +20 -0
- data/lib/active_record/validations.rb +39 -35
- data/lib/active_record/validations/absence.rb +25 -0
- data/lib/active_record/validations/associated.rb +13 -4
- data/lib/active_record/validations/length.rb +26 -0
- data/lib/active_record/validations/presence.rb +14 -13
- data/lib/active_record/validations/uniqueness.rb +42 -55
- data/lib/active_record/version.rb +3 -1
- data/lib/arel.rb +51 -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 +257 -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 +204 -0
- data/lib/arel/visitors/dot.rb +297 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +157 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +159 -0
- data/lib/arel/visitors/oracle12.rb +66 -0
- data/lib/arel/visitors/postgresql.rb +110 -0
- data/lib/arel/visitors/sqlite.rb +39 -0
- data/lib/arel/visitors/to_sql.rb +889 -0
- data/lib/arel/visitors/visitor.rb +46 -0
- data/lib/arel/visitors/where_sql.rb +23 -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 +27 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
- data/lib/rails/generators/active_record/migration.rb +31 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +19 -22
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- metadata +164 -60
- 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 -163
- data/lib/active_record/attribute_set.rb +0 -81
- data/lib/active_record/attribute_set/builder.rb +0 -106
- 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/infinity.rb +0 -13
- 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 -31
- data/lib/active_record/type/decimal.rb +0 -58
- 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 -59
- 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 -40
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/value.rb +0 -110
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
- data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -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
|
@@ -5,15 +7,39 @@ module ActiveRecord
|
|
5
7
|
# knows how to invert the following commands:
|
6
8
|
#
|
7
9
|
# * add_column
|
10
|
+
# * add_foreign_key
|
8
11
|
# * add_index
|
12
|
+
# * add_reference
|
9
13
|
# * add_timestamps
|
10
|
-
# *
|
14
|
+
# * change_column
|
15
|
+
# * change_column_default (must supply a :from and :to option)
|
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)
|
11
19
|
# * create_join_table
|
20
|
+
# * create_table
|
21
|
+
# * disable_extension
|
22
|
+
# * drop_join_table
|
23
|
+
# * drop_table (must supply a block)
|
24
|
+
# * enable_extension
|
25
|
+
# * remove_column (must supply a type)
|
26
|
+
# * remove_columns (must specify at least one column name or more)
|
27
|
+
# * remove_foreign_key (must supply a second table)
|
28
|
+
# * remove_index
|
29
|
+
# * remove_reference
|
12
30
|
# * remove_timestamps
|
13
31
|
# * rename_column
|
14
32
|
# * rename_index
|
15
33
|
# * rename_table
|
16
34
|
class CommandRecorder
|
35
|
+
ReversibleAndIrreversibleMethods = [:create_table, :create_join_table, :rename_table, :add_column, :remove_column,
|
36
|
+
:rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,
|
37
|
+
:change_column_default, :add_reference, :remove_reference, :transaction,
|
38
|
+
:drop_join_table, :drop_table, :execute_block, :enable_extension, :disable_extension,
|
39
|
+
:change_column, :execute, :remove_columns, :change_column_null,
|
40
|
+
:add_foreign_key, :remove_foreign_key,
|
41
|
+
:change_column_comment, :change_table_comment
|
42
|
+
]
|
17
43
|
include JoinTable
|
18
44
|
|
19
45
|
attr_accessor :commands, :delegate, :reverting
|
@@ -41,7 +67,7 @@ module ActiveRecord
|
|
41
67
|
@reverting = !@reverting
|
42
68
|
end
|
43
69
|
|
44
|
-
#
|
70
|
+
# Record +command+. +command+ should be a method name and arguments.
|
45
71
|
# For example:
|
46
72
|
#
|
47
73
|
# recorder.record(:method_name, [:arg1, :arg2])
|
@@ -62,22 +88,16 @@ module ActiveRecord
|
|
62
88
|
# invert the +command+.
|
63
89
|
def inverse_of(command, args, &block)
|
64
90
|
method = :"invert_#{command}"
|
65
|
-
raise IrreversibleMigration unless respond_to?(method, true)
|
91
|
+
raise IrreversibleMigration, <<~MSG unless respond_to?(method, true)
|
92
|
+
This migration uses #{command}, which is not automatically reversible.
|
93
|
+
To make the migration reversible you can either:
|
94
|
+
1. Define #up and #down methods in place of the #change method.
|
95
|
+
2. Use the #reversible method to define reversible behavior.
|
96
|
+
MSG
|
66
97
|
send(method, args, &block)
|
67
98
|
end
|
68
99
|
|
69
|
-
|
70
|
-
super || delegate.respond_to?(*args)
|
71
|
-
end
|
72
|
-
|
73
|
-
[:create_table, :create_join_table, :rename_table, :add_column, :remove_column,
|
74
|
-
:rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,
|
75
|
-
:change_column_default, :add_reference, :remove_reference, :transaction,
|
76
|
-
:drop_join_table, :drop_table, :execute_block, :enable_extension,
|
77
|
-
:change_column, :execute, :remove_columns, :change_column_null,
|
78
|
-
:add_foreign_key, :remove_foreign_key
|
79
|
-
# irreversible methods need to be here too
|
80
|
-
].each do |method|
|
100
|
+
ReversibleAndIrreversibleMethods.each do |method|
|
81
101
|
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
82
102
|
def #{method}(*args, &block) # def create_table(*args, &block)
|
83
103
|
record(:"#{method}", args, &block) # record(:create_table, args, &block)
|
@@ -91,107 +111,174 @@ module ActiveRecord
|
|
91
111
|
yield delegate.update_table_definition(table_name, self)
|
92
112
|
end
|
93
113
|
|
114
|
+
def replay(migration)
|
115
|
+
commands.each do |cmd, args, block|
|
116
|
+
migration.send(cmd, *args, &block)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
94
120
|
private
|
95
121
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
122
|
+
module StraightReversions # :nodoc:
|
123
|
+
private
|
124
|
+
{
|
125
|
+
execute_block: :execute_block,
|
126
|
+
create_table: :drop_table,
|
127
|
+
create_join_table: :drop_join_table,
|
128
|
+
add_column: :remove_column,
|
129
|
+
add_timestamps: :remove_timestamps,
|
130
|
+
add_reference: :remove_reference,
|
131
|
+
enable_extension: :disable_extension
|
132
|
+
}.each do |cmd, inv|
|
133
|
+
[[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
|
134
|
+
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
135
|
+
def invert_#{method}(args, &block) # def invert_create_table(args, &block)
|
136
|
+
[:#{inverse}, args, block] # [:drop_table, args, block]
|
137
|
+
end # end
|
138
|
+
EOV
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
include StraightReversions
|
144
|
+
|
145
|
+
def invert_transaction(args)
|
146
|
+
sub_recorder = CommandRecorder.new(delegate)
|
147
|
+
sub_recorder.revert { yield }
|
148
|
+
|
149
|
+
invertions_proc = proc {
|
150
|
+
sub_recorder.replay(self)
|
151
|
+
}
|
152
|
+
|
153
|
+
[:transaction, args, invertions_proc]
|
154
|
+
end
|
155
|
+
|
156
|
+
def invert_drop_table(args, &block)
|
157
|
+
if args.size == 1 && block == nil
|
158
|
+
raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
|
113
159
|
end
|
160
|
+
super
|
114
161
|
end
|
115
|
-
end
|
116
162
|
|
117
|
-
|
163
|
+
def invert_rename_table(args)
|
164
|
+
[:rename_table, args.reverse]
|
165
|
+
end
|
118
166
|
|
119
|
-
|
120
|
-
|
121
|
-
|
167
|
+
def invert_remove_column(args)
|
168
|
+
raise ActiveRecord::IrreversibleMigration, "remove_column is only reversible if given a type." if args.size <= 2
|
169
|
+
super
|
122
170
|
end
|
123
|
-
super
|
124
|
-
end
|
125
171
|
|
126
|
-
|
127
|
-
|
128
|
-
|
172
|
+
def invert_rename_index(args)
|
173
|
+
[:rename_index, [args.first] + args.last(2).reverse]
|
174
|
+
end
|
129
175
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
end
|
176
|
+
def invert_rename_column(args)
|
177
|
+
[:rename_column, [args.first] + args.last(2).reverse]
|
178
|
+
end
|
134
179
|
|
135
|
-
|
136
|
-
|
137
|
-
|
180
|
+
def invert_add_index(args)
|
181
|
+
table, columns, options = *args
|
182
|
+
options ||= {}
|
138
183
|
|
139
|
-
|
140
|
-
|
141
|
-
end
|
184
|
+
options_hash = options.slice(:name, :algorithm)
|
185
|
+
options_hash[:column] = columns if !options_hash[:name]
|
142
186
|
|
143
|
-
|
144
|
-
|
145
|
-
options ||= {}
|
187
|
+
[:remove_index, [table, options_hash]]
|
188
|
+
end
|
146
189
|
|
147
|
-
|
148
|
-
|
190
|
+
def invert_remove_index(args)
|
191
|
+
table, options_or_column = *args
|
192
|
+
if (options = options_or_column).is_a?(Hash)
|
193
|
+
unless options[:column]
|
194
|
+
raise ActiveRecord::IrreversibleMigration, "remove_index is only reversible if given a :column option."
|
195
|
+
end
|
196
|
+
options = options.dup
|
197
|
+
[:add_index, [table, options.delete(:column), options]]
|
198
|
+
elsif (column = options_or_column).present?
|
199
|
+
[:add_index, [table, column]]
|
200
|
+
end
|
201
|
+
end
|
149
202
|
|
150
|
-
|
151
|
-
|
203
|
+
alias :invert_add_belongs_to :invert_add_reference
|
204
|
+
alias :invert_remove_belongs_to :invert_remove_reference
|
152
205
|
|
153
|
-
|
154
|
-
|
206
|
+
def invert_change_column_default(args)
|
207
|
+
table, column, options = *args
|
155
208
|
|
156
|
-
|
157
|
-
|
209
|
+
unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
|
210
|
+
raise ActiveRecord::IrreversibleMigration, "change_column_default is only reversible if given a :from and :to option."
|
211
|
+
end
|
212
|
+
|
213
|
+
[:change_column_default, [table, column, from: options[:to], to: options[:from]]]
|
158
214
|
end
|
159
215
|
|
160
|
-
|
161
|
-
|
162
|
-
|
216
|
+
def invert_change_column_null(args)
|
217
|
+
args[2] = !args[2]
|
218
|
+
[:change_column_null, args]
|
219
|
+
end
|
163
220
|
|
164
|
-
|
165
|
-
|
221
|
+
def invert_add_foreign_key(args)
|
222
|
+
from_table, to_table, add_options = args
|
223
|
+
add_options ||= {}
|
166
224
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
225
|
+
if add_options[:name]
|
226
|
+
options = { name: add_options[:name] }
|
227
|
+
elsif add_options[:column]
|
228
|
+
options = { column: add_options[:column] }
|
229
|
+
else
|
230
|
+
options = to_table
|
231
|
+
end
|
171
232
|
|
172
|
-
|
173
|
-
|
174
|
-
add_options ||= {}
|
233
|
+
[:remove_foreign_key, [from_table, options]]
|
234
|
+
end
|
175
235
|
|
176
|
-
|
177
|
-
options =
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
236
|
+
def invert_remove_foreign_key(args)
|
237
|
+
options = args.extract_options!
|
238
|
+
from_table, to_table = args
|
239
|
+
|
240
|
+
to_table ||= options.delete(:to_table)
|
241
|
+
|
242
|
+
raise ActiveRecord::IrreversibleMigration, "remove_foreign_key is only reversible if given a second table" if to_table.nil?
|
243
|
+
|
244
|
+
reversed_args = [from_table, to_table]
|
245
|
+
reversed_args << options unless options.empty?
|
246
|
+
|
247
|
+
[:add_foreign_key, reversed_args]
|
182
248
|
end
|
183
249
|
|
184
|
-
|
185
|
-
|
250
|
+
def invert_change_column_comment(args)
|
251
|
+
table, column, options = *args
|
186
252
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
253
|
+
unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
|
254
|
+
raise ActiveRecord::IrreversibleMigration, "change_column_comment is only reversible if given a :from and :to option."
|
255
|
+
end
|
256
|
+
|
257
|
+
[:change_column_comment, [table, column, from: options[:to], to: options[:from]]]
|
258
|
+
end
|
259
|
+
|
260
|
+
def invert_change_table_comment(args)
|
261
|
+
table, options = *args
|
262
|
+
|
263
|
+
unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
|
264
|
+
raise ActiveRecord::IrreversibleMigration, "change_table_comment is only reversible if given a :from and :to option."
|
265
|
+
end
|
266
|
+
|
267
|
+
[:change_table_comment, [table, from: options[:to], to: options[:from]]]
|
268
|
+
end
|
269
|
+
|
270
|
+
def respond_to_missing?(method, _)
|
271
|
+
super || delegate.respond_to?(method)
|
272
|
+
end
|
273
|
+
|
274
|
+
# Forwards any missing method call to the \target.
|
275
|
+
def method_missing(method, *args, &block)
|
276
|
+
if delegate.respond_to?(method)
|
277
|
+
delegate.public_send(method, *args, &block)
|
278
|
+
else
|
279
|
+
super
|
280
|
+
end
|
193
281
|
end
|
194
|
-
end
|
195
282
|
end
|
196
283
|
end
|
197
284
|
end
|
@@ -0,0 +1,244 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class Migration
|
5
|
+
module Compatibility # :nodoc: all
|
6
|
+
def self.find(version)
|
7
|
+
version = version.to_s
|
8
|
+
name = "V#{version.tr('.', '_')}"
|
9
|
+
unless const_defined?(name)
|
10
|
+
versions = constants.grep(/\AV[0-9_]+\z/).map { |s| s.to_s.delete("V").tr("_", ".").inspect }
|
11
|
+
raise ArgumentError, "Unknown migration version #{version.inspect}; expected one of #{versions.sort.join(', ')}"
|
12
|
+
end
|
13
|
+
const_get(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
V6_0 = Current
|
17
|
+
|
18
|
+
class V5_2 < V6_0
|
19
|
+
module TableDefinition
|
20
|
+
def timestamps(**options)
|
21
|
+
options[:precision] ||= nil
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
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
|
46
|
+
super
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def change_table(table_name, **options)
|
51
|
+
if block_given?
|
52
|
+
super { |t| yield compatible_table_definition(t) }
|
53
|
+
else
|
54
|
+
super
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_join_table(table_1, table_2, **options)
|
59
|
+
if block_given?
|
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
|
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)
|
95
|
+
else
|
96
|
+
super
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
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)
|
187
|
+
options[:index] ||= false
|
188
|
+
super
|
189
|
+
end
|
190
|
+
alias :add_belongs_to :add_reference
|
191
|
+
|
192
|
+
def add_timestamps(table_name, **options)
|
193
|
+
options[:null] = true if options[:null].nil?
|
194
|
+
super
|
195
|
+
end
|
196
|
+
|
197
|
+
def index_exists?(table_name, column_name, options = {})
|
198
|
+
column_names = Array(column_name).map(&:to_s)
|
199
|
+
options[:name] =
|
200
|
+
if options[:name].present?
|
201
|
+
options[:name].to_s
|
202
|
+
else
|
203
|
+
connection.index_name(table_name, column: column_names)
|
204
|
+
end
|
205
|
+
super
|
206
|
+
end
|
207
|
+
|
208
|
+
def remove_index(table_name, options = {})
|
209
|
+
options = { column: options } unless options.is_a?(Hash)
|
210
|
+
options[:name] = index_name_for_remove(table_name, options)
|
211
|
+
super(table_name, options)
|
212
|
+
end
|
213
|
+
|
214
|
+
private
|
215
|
+
def compatible_table_definition(t)
|
216
|
+
class << t
|
217
|
+
prepend TableDefinition
|
218
|
+
end
|
219
|
+
super
|
220
|
+
end
|
221
|
+
|
222
|
+
def index_name_for_remove(table_name, options = {})
|
223
|
+
index_name = connection.index_name(table_name, options)
|
224
|
+
|
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)
|
230
|
+
|
231
|
+
if connection.index_name_exists?(table_name, index_name_without_column)
|
232
|
+
return index_name_without_column
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
|
237
|
+
end
|
238
|
+
|
239
|
+
index_name
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|