activerecord 5.0.7.2 → 6.1.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +829 -2015
- data/MIT-LICENSE +3 -1
- data/README.rdoc +11 -9
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record.rb +37 -29
- data/lib/active_record/aggregations.rb +249 -247
- data/lib/active_record/association_relation.rb +30 -18
- data/lib/active_record/associations.rb +1714 -1596
- data/lib/active_record/associations/alias_tracker.rb +36 -42
- data/lib/active_record/associations/association.rb +143 -68
- data/lib/active_record/associations/association_scope.rb +98 -94
- data/lib/active_record/associations/belongs_to_association.rb +76 -46
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
- data/lib/active_record/associations/builder/association.rb +27 -28
- data/lib/active_record/associations/builder/belongs_to.rb +52 -60
- data/lib/active_record/associations/builder/collection_association.rb +12 -22
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +40 -62
- data/lib/active_record/associations/builder/has_many.rb +10 -2
- data/lib/active_record/associations/builder/has_one.rb +35 -2
- data/lib/active_record/associations/builder/singular_association.rb +5 -1
- data/lib/active_record/associations/collection_association.rb +104 -259
- data/lib/active_record/associations/collection_proxy.rb +169 -125
- data/lib/active_record/associations/foreign_association.rb +22 -0
- data/lib/active_record/associations/has_many_association.rb +46 -31
- data/lib/active_record/associations/has_many_through_association.rb +66 -46
- data/lib/active_record/associations/has_one_association.rb +71 -52
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency.rb +169 -180
- data/lib/active_record/associations/join_dependency/join_association.rb +53 -79
- 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 +97 -104
- data/lib/active_record/associations/preloader/association.rb +109 -97
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +27 -15
- data/lib/active_record/attribute_assignment.rb +55 -60
- data/lib/active_record/attribute_methods.rb +111 -141
- data/lib/active_record/attribute_methods/before_type_cast.rb +17 -9
- data/lib/active_record/attribute_methods/dirty.rb +172 -112
- data/lib/active_record/attribute_methods/primary_key.rb +88 -91
- data/lib/active_record/attribute_methods/query.rb +6 -8
- data/lib/active_record/attribute_methods/read.rb +18 -50
- data/lib/active_record/attribute_methods/serialization.rb +38 -10
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +38 -66
- data/lib/active_record/attribute_methods/write.rb +25 -32
- data/lib/active_record/attributes.rb +69 -31
- data/lib/active_record/autosave_association.rb +102 -66
- data/lib/active_record/base.rb +16 -25
- data/lib/active_record/callbacks.rb +202 -43
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +11 -12
- data/lib/active_record/connection_adapters.rb +50 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +661 -375
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +14 -38
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +269 -105
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +54 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +137 -93
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +155 -113
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +328 -162
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +591 -259
- data/lib/active_record/connection_adapters/abstract/transaction.rb +229 -91
- data/lib/active_record/connection_adapters/abstract_adapter.rb +392 -244
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +457 -582
- data/lib/active_record/connection_adapters/column.rb +55 -13
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +135 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +79 -49
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +66 -56
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +20 -12
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +74 -37
- data/lib/active_record/connection_adapters/pool_config.rb +63 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +39 -28
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -101
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +26 -21
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -6
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -4
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/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 -5
- data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +98 -38
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +21 -27
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +426 -324
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +32 -23
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +418 -293
- data/lib/active_record/connection_adapters/schema_cache.rb +135 -18
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +22 -7
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -6
- 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 +282 -290
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
- data/lib/active_record/connection_handling.rb +287 -45
- data/lib/active_record/core.rb +385 -181
- data/lib/active_record/counter_cache.rb +60 -28
- data/lib/active_record/database_configurations.rb +272 -0
- data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -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/delegated_type.rb +209 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/dynamic_matchers.rb +87 -87
- data/lib/active_record/enum.rb +122 -47
- data/lib/active_record/errors.rb +153 -22
- data/lib/active_record/explain.rb +13 -8
- data/lib/active_record/explain_registry.rb +3 -1
- data/lib/active_record/explain_subscriber.rb +9 -4
- data/lib/active_record/fixture_set/file.rb +20 -22
- 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 +246 -507
- data/lib/active_record/gem_version.rb +6 -4
- data/lib/active_record/inheritance.rb +168 -95
- data/lib/active_record/insert_all.rb +208 -0
- data/lib/active_record/integration.rb +114 -25
- data/lib/active_record/internal_metadata.rb +30 -24
- data/lib/active_record/legacy_yaml_adapter.rb +11 -5
- data/lib/active_record/locking/optimistic.rb +81 -85
- data/lib/active_record/locking/pessimistic.rb +22 -6
- data/lib/active_record/log_subscriber.rb +68 -31
- data/lib/active_record/middleware/database_selector.rb +77 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/migration.rb +439 -342
- data/lib/active_record/migration/command_recorder.rb +152 -98
- data/lib/active_record/migration/compatibility.rb +229 -60
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/model_schema.rb +230 -122
- data/lib/active_record/nested_attributes.rb +213 -203
- data/lib/active_record/no_touching.rb +11 -2
- data/lib/active_record/null_relation.rb +12 -34
- data/lib/active_record/persistence.rb +471 -97
- data/lib/active_record/query_cache.rb +23 -12
- data/lib/active_record/querying.rb +43 -25
- data/lib/active_record/railtie.rb +155 -43
- 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 +507 -195
- data/lib/active_record/readonly_attributes.rb +9 -4
- data/lib/active_record/reflection.rb +245 -269
- data/lib/active_record/relation.rb +475 -324
- data/lib/active_record/relation/batches.rb +125 -72
- data/lib/active_record/relation/batches/batch_enumerator.rb +28 -10
- data/lib/active_record/relation/calculations.rb +267 -171
- data/lib/active_record/relation/delegation.rb +73 -69
- data/lib/active_record/relation/finder_methods.rb +238 -248
- data/lib/active_record/relation/from_clause.rb +7 -9
- data/lib/active_record/relation/merger.rb +95 -77
- data/lib/active_record/relation/predicate_builder.rb +109 -110
- data/lib/active_record/relation/predicate_builder/array_handler.rb +22 -17
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +55 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +654 -374
- data/lib/active_record/relation/record_fetch_warning.rb +8 -6
- data/lib/active_record/relation/spawn_methods.rb +15 -14
- data/lib/active_record/relation/where_clause.rb +171 -109
- data/lib/active_record/result.rb +88 -51
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +73 -100
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +101 -69
- data/lib/active_record/schema_migration.rb +16 -12
- data/lib/active_record/scoping.rb +20 -20
- data/lib/active_record/scoping/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +39 -30
- data/lib/active_record/secure_token.rb +19 -9
- data/lib/active_record/serialization.rb +7 -3
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +80 -29
- data/lib/active_record/store.rb +122 -42
- data/lib/active_record/suppressor.rb +6 -3
- data/lib/active_record/table_metadata.rb +51 -39
- data/lib/active_record/tasks/database_tasks.rb +332 -115
- data/lib/active_record/tasks/mysql_database_tasks.rb +66 -104
- data/lib/active_record/tasks/postgresql_database_tasks.rb +84 -56
- data/lib/active_record/tasks/sqlite_database_tasks.rb +40 -19
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +246 -0
- data/lib/active_record/timestamp.rb +70 -38
- data/lib/active_record/touch_later.rb +26 -24
- data/lib/active_record/transactions.rb +121 -184
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type.rb +29 -17
- data/lib/active_record/type/adapter_specific_registry.rb +44 -48
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +20 -9
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +12 -1
- data/lib/active_record/type/type_map.rb +14 -17
- data/lib/active_record/type/unsigned_integer.rb +16 -0
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/type_caster/connection.rb +17 -13
- data/lib/active_record/type_caster/map.rb +10 -6
- data/lib/active_record/validations.rb +8 -5
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +4 -3
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +52 -45
- data/lib/active_record/version.rb +3 -1
- data/lib/arel.rb +54 -0
- 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.rb +70 -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 +72 -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/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.rb +13 -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/window_predications.rb +9 -0
- data/lib/rails/generators/active_record.rb +7 -5
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration.rb +22 -3
- data/lib/rails/generators/active_record/migration/migration_generator.rb +38 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +3 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +7 -5
- data/lib/rails/generators/active_record/model/model_generator.rb +41 -25
- 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 → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- metadata +141 -57
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -20
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute_decorators.rb +0 -67
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -263
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -22
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -17
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
- data/lib/active_record/relation/where_clause_factory.rb +0 -38
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,15 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
class Migration
|
3
5
|
module JoinTable #:nodoc:
|
4
6
|
private
|
7
|
+
def find_join_table_name(table_1, table_2, options = {})
|
8
|
+
options.delete(:table_name) || join_table_name(table_1, table_2)
|
9
|
+
end
|
5
10
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def join_table_name(table_1, table_2)
|
11
|
-
ModelSchema.derive_join_table_name(table_1, table_2).to_sym
|
12
|
-
end
|
11
|
+
def join_table_name(table_1, table_2)
|
12
|
+
ModelSchema.derive_join_table_name(table_1, table_2).to_sym
|
13
|
+
end
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "monitor"
|
2
4
|
|
3
5
|
module ActiveRecord
|
@@ -84,19 +86,6 @@ module ActiveRecord
|
|
84
86
|
#
|
85
87
|
# Sets the name of the internal metadata table.
|
86
88
|
|
87
|
-
##
|
88
|
-
# :singleton-method: protected_environments
|
89
|
-
# :call-seq: protected_environments
|
90
|
-
#
|
91
|
-
# The array of names of environments where destructive actions should be prohibited. By default,
|
92
|
-
# the value is <tt>["production"]</tt>.
|
93
|
-
|
94
|
-
##
|
95
|
-
# :singleton-method: protected_environments=
|
96
|
-
# :call-seq: protected_environments=(environments)
|
97
|
-
#
|
98
|
-
# Sets an array of names of environments where destructive actions should be prohibited.
|
99
|
-
|
100
89
|
##
|
101
90
|
# :singleton-method: pluralize_table_names
|
102
91
|
# :call-seq: pluralize_table_names
|
@@ -113,31 +102,46 @@ module ActiveRecord
|
|
113
102
|
# If true, the default table name for a Product class will be "products". If false, it would just be "product".
|
114
103
|
# See table_name for the full rules on table/class naming. This is true, by default.
|
115
104
|
|
116
|
-
|
117
|
-
|
105
|
+
##
|
106
|
+
# :singleton-method: implicit_order_column
|
107
|
+
# :call-seq: implicit_order_column
|
108
|
+
#
|
109
|
+
# The name of the column records are ordered by if no explicit order clause
|
110
|
+
# is used during an ordered finder call. If not set the primary key is used.
|
118
111
|
|
119
|
-
|
120
|
-
|
112
|
+
##
|
113
|
+
# :singleton-method: implicit_order_column=
|
114
|
+
# :call-seq: implicit_order_column=(column_name)
|
115
|
+
#
|
116
|
+
# Sets the column to sort records by when no explicit order clause is used
|
117
|
+
# during an ordered finder call. Useful when the primary key is not an
|
118
|
+
# auto-incrementing integer, for example when it's a UUID. Records are subsorted
|
119
|
+
# by the primary key if it exists to ensure deterministic results.
|
121
120
|
|
122
|
-
|
123
|
-
|
121
|
+
##
|
122
|
+
# :singleton-method: immutable_strings_by_default=
|
123
|
+
# :call-seq: immutable_strings_by_default=(bool)
|
124
|
+
#
|
125
|
+
# Determines whether columns should infer their type as `:string` or
|
126
|
+
# `:immutable_string`. This setting does not affect the behavior of
|
127
|
+
# `attribute :foo, :string`. Defaults to false.
|
124
128
|
|
125
|
-
|
126
|
-
|
129
|
+
included do
|
130
|
+
mattr_accessor :primary_key_prefix_type, instance_writer: false
|
127
131
|
|
128
|
-
class_attribute :
|
129
|
-
|
132
|
+
class_attribute :table_name_prefix, instance_writer: false, default: ""
|
133
|
+
class_attribute :table_name_suffix, instance_writer: false, default: ""
|
134
|
+
class_attribute :schema_migrations_table_name, instance_accessor: false, default: "schema_migrations"
|
135
|
+
class_attribute :internal_metadata_table_name, instance_accessor: false, default: "ar_internal_metadata"
|
136
|
+
class_attribute :pluralize_table_names, instance_writer: false, default: true
|
137
|
+
class_attribute :implicit_order_column, instance_accessor: false
|
138
|
+
class_attribute :immutable_strings_by_default, instance_accessor: false
|
130
139
|
|
131
|
-
class_attribute :protected_environments, instance_accessor: false
|
132
140
|
self.protected_environments = ["production"]
|
133
|
-
|
134
|
-
class_attribute :pluralize_table_names, instance_writer: false
|
135
|
-
self.pluralize_table_names = true
|
136
|
-
|
137
|
-
self.inheritance_column = 'type'
|
141
|
+
self.inheritance_column = "type"
|
138
142
|
self.ignored_columns = [].freeze
|
139
143
|
|
140
|
-
delegate :type_for_attribute, to: :class
|
144
|
+
delegate :type_for_attribute, :column_for_attribute, to: :class
|
141
145
|
|
142
146
|
initialize_load_schema_monitor
|
143
147
|
end
|
@@ -240,11 +244,26 @@ module ActiveRecord
|
|
240
244
|
end
|
241
245
|
|
242
246
|
def full_table_name_prefix #:nodoc:
|
243
|
-
(
|
247
|
+
(module_parents.detect { |p| p.respond_to?(:table_name_prefix) } || self).table_name_prefix
|
244
248
|
end
|
245
249
|
|
246
250
|
def full_table_name_suffix #:nodoc:
|
247
|
-
(
|
251
|
+
(module_parents.detect { |p| p.respond_to?(:table_name_suffix) } || self).table_name_suffix
|
252
|
+
end
|
253
|
+
|
254
|
+
# The array of names of environments where destructive actions should be prohibited. By default,
|
255
|
+
# the value is <tt>["production"]</tt>.
|
256
|
+
def protected_environments
|
257
|
+
if defined?(@protected_environments)
|
258
|
+
@protected_environments
|
259
|
+
else
|
260
|
+
superclass.protected_environments
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
# Sets an array of names of environments where destructive actions should be prohibited.
|
265
|
+
def protected_environments=(environments)
|
266
|
+
@protected_environments = environments.map(&:to_s)
|
248
267
|
end
|
249
268
|
|
250
269
|
# Defines the name of the table column which will store the class name on single-table
|
@@ -278,12 +297,42 @@ module ActiveRecord
|
|
278
297
|
|
279
298
|
# Sets the columns names the model should ignore. Ignored columns won't have attribute
|
280
299
|
# accessors defined, and won't be referenced in SQL queries.
|
300
|
+
#
|
301
|
+
# A common usage pattern for this method is to ensure all references to an attribute
|
302
|
+
# have been removed and deployed, before a migration to drop the column from the database
|
303
|
+
# has been deployed and run. Using this two step approach to dropping columns ensures there
|
304
|
+
# is no code that raises errors due to having a cached schema in memory at the time the
|
305
|
+
# schema migration is run.
|
306
|
+
#
|
307
|
+
# For example, given a model where you want to drop the "category" attribute, first mark it
|
308
|
+
# as ignored:
|
309
|
+
#
|
310
|
+
# class Project < ActiveRecord::Base
|
311
|
+
# # schema:
|
312
|
+
# # id :bigint
|
313
|
+
# # name :string, limit: 255
|
314
|
+
# # category :string, limit: 255
|
315
|
+
#
|
316
|
+
# self.ignored_columns = [:category]
|
317
|
+
# end
|
318
|
+
#
|
319
|
+
# The schema still contains `category`, but now the model omits it, so any meta-driven code or
|
320
|
+
# schema caching will not attempt to use the column:
|
321
|
+
#
|
322
|
+
# Project.columns_hash["category"] => nil
|
323
|
+
#
|
324
|
+
# You will get an error if accessing that attribute directly, so ensure all usages of the
|
325
|
+
# column are removed (automated tests can help you find any usages).
|
326
|
+
#
|
327
|
+
# user = Project.create!(name: "First Project")
|
328
|
+
# user.category # => raises NoMethodError
|
281
329
|
def ignored_columns=(columns)
|
282
|
-
|
330
|
+
reload_schema_from_cache
|
331
|
+
@ignored_columns = columns.map(&:to_s).freeze
|
283
332
|
end
|
284
333
|
|
285
334
|
def sequence_name
|
286
|
-
if base_class
|
335
|
+
if base_class?
|
287
336
|
@sequence_name ||= reset_sequence_name
|
288
337
|
else
|
289
338
|
(@sequence_name ||= nil) || base_class.sequence_name
|
@@ -296,7 +345,7 @@ module ActiveRecord
|
|
296
345
|
end
|
297
346
|
|
298
347
|
# Sets the name of the sequence to use when generating ids to the given
|
299
|
-
# value, or (if the value is nil or false) to the value returned by the
|
348
|
+
# value, or (if the value is +nil+ or +false+) to the value returned by the
|
300
349
|
# given block. This is required for Oracle and is useful for any
|
301
350
|
# database which relies on sequences for primary key generation.
|
302
351
|
#
|
@@ -334,7 +383,7 @@ module ActiveRecord
|
|
334
383
|
def attributes_builder # :nodoc:
|
335
384
|
unless defined?(@attributes_builder) && @attributes_builder
|
336
385
|
defaults = _default_attributes.except(*(column_names - [primary_key]))
|
337
|
-
@attributes_builder = AttributeSet::Builder.new(attribute_types, defaults)
|
386
|
+
@attributes_builder = ActiveModel::AttributeSet::Builder.new(attribute_types, defaults)
|
338
387
|
end
|
339
388
|
@attributes_builder
|
340
389
|
end
|
@@ -346,12 +395,16 @@ module ActiveRecord
|
|
346
395
|
|
347
396
|
def columns
|
348
397
|
load_schema
|
349
|
-
@columns ||= columns_hash.values
|
398
|
+
@columns ||= columns_hash.values.freeze
|
350
399
|
end
|
351
400
|
|
352
401
|
def attribute_types # :nodoc:
|
353
402
|
load_schema
|
354
|
-
@attribute_types ||= Hash.new(Type
|
403
|
+
@attribute_types ||= Hash.new(Type.default_value)
|
404
|
+
end
|
405
|
+
|
406
|
+
def yaml_encoder # :nodoc:
|
407
|
+
@yaml_encoder ||= ActiveModel::AttributeSet::YAMLEncoder.new(attribute_types)
|
355
408
|
end
|
356
409
|
|
357
410
|
# Returns the type of the attribute with the given name, after applying
|
@@ -364,8 +417,11 @@ module ActiveRecord
|
|
364
417
|
# it).
|
365
418
|
#
|
366
419
|
# +attr_name+ The name of the attribute to retrieve the type for. Must be
|
367
|
-
# a string
|
420
|
+
# a string or a symbol.
|
368
421
|
def type_for_attribute(attr_name, &block)
|
422
|
+
attr_name = attr_name.to_s
|
423
|
+
attr_name = attribute_aliases[attr_name] || attr_name
|
424
|
+
|
369
425
|
if block
|
370
426
|
attribute_types.fetch(attr_name, &block)
|
371
427
|
else
|
@@ -373,26 +429,56 @@ module ActiveRecord
|
|
373
429
|
end
|
374
430
|
end
|
375
431
|
|
432
|
+
# Returns the column object for the named attribute.
|
433
|
+
# Returns an +ActiveRecord::ConnectionAdapters::NullColumn+ if the
|
434
|
+
# named attribute does not exist.
|
435
|
+
#
|
436
|
+
# class Person < ActiveRecord::Base
|
437
|
+
# end
|
438
|
+
#
|
439
|
+
# person = Person.new
|
440
|
+
# person.column_for_attribute(:name) # the result depends on the ConnectionAdapter
|
441
|
+
# # => #<ActiveRecord::ConnectionAdapters::Column:0x007ff4ab083980 @name="name", @sql_type="varchar(255)", @null=true, ...>
|
442
|
+
#
|
443
|
+
# person.column_for_attribute(:nothing)
|
444
|
+
# # => #<ActiveRecord::ConnectionAdapters::NullColumn:0xXXX @name=nil, @sql_type=nil, @cast_type=#<Type::Value>, ...>
|
445
|
+
def column_for_attribute(name)
|
446
|
+
name = name.to_s
|
447
|
+
columns_hash.fetch(name) do
|
448
|
+
ConnectionAdapters::NullColumn.new(name)
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
376
452
|
# Returns a hash where the keys are column names and the values are
|
377
453
|
# default values when instantiating the Active Record object for this table.
|
378
454
|
def column_defaults
|
379
455
|
load_schema
|
380
|
-
_default_attributes.to_hash
|
456
|
+
@column_defaults ||= _default_attributes.deep_dup.to_hash.freeze
|
381
457
|
end
|
382
458
|
|
383
459
|
def _default_attributes # :nodoc:
|
384
|
-
|
460
|
+
load_schema
|
461
|
+
@default_attributes ||= ActiveModel::AttributeSet.new({})
|
385
462
|
end
|
386
463
|
|
387
464
|
# Returns an array of column names as strings.
|
388
465
|
def column_names
|
389
|
-
@column_names ||= columns.map(&:name)
|
466
|
+
@column_names ||= columns.map(&:name).freeze
|
467
|
+
end
|
468
|
+
|
469
|
+
def symbol_column_to_string(name_symbol) # :nodoc:
|
470
|
+
@symbol_column_to_string_name_hash ||= column_names.index_by(&:to_sym)
|
471
|
+
@symbol_column_to_string_name_hash[name_symbol]
|
390
472
|
end
|
391
473
|
|
392
474
|
# Returns an array of column objects where the primary id, all columns ending in "_id" or "_count",
|
393
475
|
# and columns used for single table inheritance have been removed.
|
394
476
|
def content_columns
|
395
|
-
@content_columns ||= columns.reject
|
477
|
+
@content_columns ||= columns.reject do |c|
|
478
|
+
c.name == primary_key ||
|
479
|
+
c.name == inheritance_column ||
|
480
|
+
c.name.end_with?("_id", "_count")
|
481
|
+
end.freeze
|
396
482
|
end
|
397
483
|
|
398
484
|
# Resets all the cached information about columns, which will cause them
|
@@ -402,7 +488,7 @@ module ActiveRecord
|
|
402
488
|
# when just after creating a table you want to populate it with some default
|
403
489
|
# values, eg:
|
404
490
|
#
|
405
|
-
# class CreateJobLevels < ActiveRecord::Migration[
|
491
|
+
# class CreateJobLevels < ActiveRecord::Migration[6.0]
|
406
492
|
# def up
|
407
493
|
# create_table :job_levels do |t|
|
408
494
|
# t.integer :id
|
@@ -423,7 +509,7 @@ module ActiveRecord
|
|
423
509
|
# end
|
424
510
|
def reset_column_information
|
425
511
|
connection.clear_cache!
|
426
|
-
undefine_attribute_methods
|
512
|
+
([self] + descendants).each(&:undefine_attribute_methods)
|
427
513
|
connection.schema_cache.clear_data_source_cache!(table_name)
|
428
514
|
|
429
515
|
reload_schema_from_cache
|
@@ -431,109 +517,131 @@ module ActiveRecord
|
|
431
517
|
end
|
432
518
|
|
433
519
|
protected
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
end
|
520
|
+
def initialize_load_schema_monitor
|
521
|
+
@load_schema_monitor = Monitor.new
|
522
|
+
end
|
438
523
|
|
439
524
|
private
|
525
|
+
def inherited(child_class)
|
526
|
+
super
|
527
|
+
child_class.initialize_load_schema_monitor
|
528
|
+
end
|
440
529
|
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
end
|
445
|
-
|
446
|
-
def schema_loaded?
|
447
|
-
defined?(@schema_loaded) && @schema_loaded
|
448
|
-
end
|
530
|
+
def schema_loaded?
|
531
|
+
defined?(@schema_loaded) && @schema_loaded
|
532
|
+
end
|
449
533
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
534
|
+
def load_schema
|
535
|
+
return if schema_loaded?
|
536
|
+
@load_schema_monitor.synchronize do
|
537
|
+
return if defined?(@columns_hash) && @columns_hash
|
454
538
|
|
455
|
-
|
539
|
+
load_schema!
|
456
540
|
|
457
|
-
|
541
|
+
@schema_loaded = true
|
542
|
+
rescue
|
543
|
+
reload_schema_from_cache # If the schema loading failed half way through, we must reset the state.
|
544
|
+
raise
|
545
|
+
end
|
458
546
|
end
|
459
|
-
end
|
460
547
|
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
548
|
+
def load_schema!
|
549
|
+
unless table_name
|
550
|
+
raise ActiveRecord::TableNotSpecified, "#{self} has no table configured. Set one with #{self}.table_name="
|
551
|
+
end
|
552
|
+
|
553
|
+
columns_hash = connection.schema_cache.columns_hash(table_name)
|
554
|
+
columns_hash = columns_hash.except(*ignored_columns) unless ignored_columns.empty?
|
555
|
+
@columns_hash = columns_hash.freeze
|
556
|
+
@columns_hash.each do |name, column|
|
557
|
+
type = connection.lookup_cast_type_from_column(column)
|
558
|
+
type = _convert_type_from_options(type)
|
559
|
+
warn_if_deprecated_type(column)
|
560
|
+
define_attribute(
|
561
|
+
name,
|
562
|
+
type,
|
563
|
+
default: column.default,
|
564
|
+
user_provided_default: false
|
565
|
+
)
|
566
|
+
end
|
471
567
|
end
|
472
|
-
end
|
473
568
|
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
569
|
+
def reload_schema_from_cache
|
570
|
+
@arel_table = nil
|
571
|
+
@column_names = nil
|
572
|
+
@symbol_column_to_string_name_hash = nil
|
573
|
+
@attribute_types = nil
|
574
|
+
@content_columns = nil
|
575
|
+
@default_attributes = nil
|
576
|
+
@column_defaults = nil
|
577
|
+
@inheritance_column = nil unless defined?(@explicit_inheritance_column) && @explicit_inheritance_column
|
578
|
+
@attributes_builder = nil
|
579
|
+
@columns = nil
|
580
|
+
@columns_hash = nil
|
581
|
+
@schema_loaded = false
|
582
|
+
@attribute_names = nil
|
583
|
+
@yaml_encoder = nil
|
584
|
+
direct_descendants.each do |descendant|
|
585
|
+
descendant.send(:reload_schema_from_cache)
|
586
|
+
end
|
489
587
|
end
|
490
|
-
end
|
491
588
|
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
589
|
+
# Guesses the table name, but does not decorate it with prefix and suffix information.
|
590
|
+
def undecorated_table_name(class_name = base_class.name)
|
591
|
+
table_name = class_name.to_s.demodulize.underscore
|
592
|
+
pluralize_table_names ? table_name.pluralize : table_name
|
593
|
+
end
|
497
594
|
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
595
|
+
# Computes and returns a table name according to default conventions.
|
596
|
+
def compute_table_name
|
597
|
+
if base_class?
|
598
|
+
# Nested classes are prefixed with singular parent table name.
|
599
|
+
if module_parent < Base && !module_parent.abstract_class?
|
600
|
+
contained = module_parent.table_name
|
601
|
+
contained = contained.singularize if module_parent.pluralize_table_names
|
602
|
+
contained += "_"
|
603
|
+
end
|
604
|
+
|
605
|
+
"#{full_table_name_prefix}#{contained}#{undecorated_table_name(name)}#{full_table_name_suffix}"
|
606
|
+
else
|
607
|
+
# STI subclasses always use their superclass' table.
|
608
|
+
base_class.table_name
|
507
609
|
end
|
610
|
+
end
|
508
611
|
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
612
|
+
def _convert_type_from_options(type)
|
613
|
+
if immutable_strings_by_default && type.respond_to?(:to_immutable_string)
|
614
|
+
type.to_immutable_string
|
615
|
+
else
|
616
|
+
type
|
617
|
+
end
|
513
618
|
end
|
514
|
-
end
|
515
619
|
|
516
|
-
|
517
|
-
|
518
|
-
|
620
|
+
def warn_if_deprecated_type(column)
|
621
|
+
return if attributes_to_define_after_schema_loads.key?(column.name)
|
622
|
+
return unless column.respond_to?(:oid)
|
623
|
+
|
519
624
|
if column.array?
|
520
625
|
array_arguments = ", array: true"
|
521
626
|
else
|
522
627
|
array_arguments = ""
|
523
628
|
end
|
524
|
-
ActiveSupport::Deprecation.warn(<<-WARNING.strip_heredoc)
|
525
|
-
The behavior of the `:point` type will be changing in Rails 5.1 to
|
526
|
-
return a `Point` object, rather than an `Array`. If you'd like to
|
527
|
-
keep the old behavior, you can add this line to #{self.name}:
|
528
629
|
|
529
|
-
|
630
|
+
if column.sql_type.start_with?("interval")
|
631
|
+
precision_arguments = column.precision.presence && ", precision: #{column.precision}"
|
632
|
+
ActiveSupport::Deprecation.warn(<<~WARNING)
|
633
|
+
The behavior of the `:interval` type will be changing in Rails 6.2
|
634
|
+
to return an `ActiveSupport::Duration` object. If you'd like to keep
|
635
|
+
the old behavior, you can add this line to #{self.name} model:
|
636
|
+
|
637
|
+
attribute :#{column.name}, :string#{precision_arguments}#{array_arguments}
|
530
638
|
|
531
|
-
|
639
|
+
If you'd like the new behavior today, you can add this line:
|
532
640
|
|
533
|
-
|
534
|
-
|
641
|
+
attribute :#{column.name}, :interval#{precision_arguments}#{array_arguments}
|
642
|
+
WARNING
|
643
|
+
end
|
535
644
|
end
|
536
|
-
end
|
537
645
|
end
|
538
646
|
end
|
539
647
|
end
|