activerecord 5.0.7.2 → 6.0.6.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 +844 -1944
- data/MIT-LICENSE +3 -1
- data/README.rdoc +9 -7
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +249 -247
- data/lib/active_record/association_relation.rb +18 -14
- data/lib/active_record/associations/alias_tracker.rb +24 -34
- data/lib/active_record/associations/association.rb +113 -55
- data/lib/active_record/associations/association_scope.rb +102 -96
- data/lib/active_record/associations/belongs_to_association.rb +58 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +18 -25
- data/lib/active_record/associations/builder/belongs_to.rb +43 -54
- data/lib/active_record/associations/builder/collection_association.rb +7 -18
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
- data/lib/active_record/associations/builder/has_many.rb +4 -0
- data/lib/active_record/associations/builder/has_one.rb +37 -1
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +93 -254
- data/lib/active_record/associations/collection_proxy.rb +159 -122
- data/lib/active_record/associations/foreign_association.rb +9 -0
- data/lib/active_record/associations/has_many_association.rb +23 -30
- data/lib/active_record/associations/has_many_through_association.rb +58 -44
- data/lib/active_record/associations/has_one_association.rb +59 -54
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +43 -85
- 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 +152 -177
- data/lib/active_record/associations/preloader/association.rb +101 -97
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/preloader.rb +94 -103
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +27 -15
- data/lib/active_record/associations.rb +1603 -1592
- data/lib/active_record/attribute_assignment.rb +54 -61
- data/lib/active_record/attribute_decorators.rb +38 -17
- data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
- data/lib/active_record/attribute_methods/dirty.rb +179 -109
- data/lib/active_record/attribute_methods/primary_key.rb +85 -92
- data/lib/active_record/attribute_methods/query.rb +4 -3
- data/lib/active_record/attribute_methods/read.rb +20 -49
- data/lib/active_record/attribute_methods/serialization.rb +29 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
- data/lib/active_record/attribute_methods/write.rb +34 -33
- data/lib/active_record/attribute_methods.rb +66 -106
- data/lib/active_record/attributes.rb +38 -25
- data/lib/active_record/autosave_association.rb +58 -39
- data/lib/active_record/base.rb +27 -24
- data/lib/active_record/callbacks.rb +64 -35
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +34 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -323
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +128 -75
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +233 -147
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
- data/lib/active_record/connection_adapters/abstract_adapter.rb +373 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -562
- data/lib/active_record/connection_adapters/column.rb +41 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
- data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +12 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +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 +8 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
- data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +261 -267
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
- data/lib/active_record/connection_handling.rb +143 -40
- data/lib/active_record/core.rb +207 -160
- data/lib/active_record/counter_cache.rb +60 -28
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/database_configurations.rb +233 -0
- data/lib/active_record/define_callbacks.rb +22 -0
- data/lib/active_record/dynamic_matchers.rb +87 -87
- data/lib/active_record/enum.rb +67 -23
- data/lib/active_record/errors.rb +114 -18
- data/lib/active_record/explain.rb +4 -4
- data/lib/active_record/explain_registry.rb +3 -1
- data/lib/active_record/explain_subscriber.rb +9 -4
- data/lib/active_record/fixture_set/file.rb +13 -8
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +194 -504
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +150 -99
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +116 -25
- data/lib/active_record/internal_metadata.rb +16 -19
- data/lib/active_record/legacy_yaml_adapter.rb +4 -2
- data/lib/active_record/locking/optimistic.rb +85 -86
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +48 -29
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
- data/lib/active_record/middleware/database_selector.rb +74 -0
- data/lib/active_record/migration/command_recorder.rb +134 -100
- data/lib/active_record/migration/compatibility.rb +174 -56
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +369 -302
- data/lib/active_record/model_schema.rb +160 -127
- data/lib/active_record/nested_attributes.rb +213 -202
- data/lib/active_record/no_touching.rb +12 -3
- data/lib/active_record/null_relation.rb +12 -34
- data/lib/active_record/persistence.rb +446 -77
- data/lib/active_record/query_cache.rb +13 -12
- data/lib/active_record/querying.rb +37 -24
- data/lib/active_record/railtie.rb +128 -36
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +312 -177
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +214 -254
- data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
- data/lib/active_record/relation/batches.rb +98 -52
- data/lib/active_record/relation/calculations.rb +212 -173
- data/lib/active_record/relation/delegation.rb +73 -69
- data/lib/active_record/relation/finder_methods.rb +207 -247
- data/lib/active_record/relation/from_clause.rb +6 -8
- data/lib/active_record/relation/merger.rb +82 -61
- data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/predicate_builder.rb +83 -105
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +488 -332
- data/lib/active_record/relation/record_fetch_warning.rb +5 -3
- data/lib/active_record/relation/spawn_methods.rb +8 -8
- data/lib/active_record/relation/where_clause.rb +111 -96
- data/lib/active_record/relation/where_clause_factory.rb +6 -11
- data/lib/active_record/relation.rb +443 -318
- data/lib/active_record/result.rb +69 -40
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +83 -99
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +71 -69
- data/lib/active_record/schema_migration.rb +16 -6
- data/lib/active_record/scoping/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +51 -26
- data/lib/active_record/scoping.rb +20 -20
- data/lib/active_record/secure_token.rb +4 -2
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +63 -28
- data/lib/active_record/store.rb +121 -41
- data/lib/active_record/suppressor.rb +6 -3
- data/lib/active_record/table_metadata.rb +39 -18
- data/lib/active_record/tasks/database_tasks.rb +271 -81
- data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
- data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +243 -0
- data/lib/active_record/timestamp.rb +70 -36
- data/lib/active_record/touch_later.rb +8 -6
- data/lib/active_record/transactions.rb +141 -157
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +44 -48
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +16 -9
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +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.rb +23 -18
- data/lib/active_record/type_caster/connection.rb +17 -12
- data/lib/active_record/type_caster/map.rb +5 -4
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +3 -2
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +29 -42
- data/lib/active_record/validations.rb +7 -5
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +37 -22
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/attributes.rb +22 -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/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/nodes.rb +68 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +256 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/depth_first.rb +203 -0
- data/lib/arel/visitors/dot.rb +296 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +156 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +158 -0
- data/lib/arel/visitors/oracle12.rb +65 -0
- data/lib/arel/visitors/postgresql.rb +109 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +888 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors/where_sql.rb +22 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +62 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
- data/lib/rails/generators/active_record/migration.rb +17 -3
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +138 -52
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -20
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
- /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/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -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,28 +102,33 @@ 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
|
|
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.
|
111
|
+
|
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. Note that using
|
119
|
+
# a non-unique column can result in non-deterministic results.
|
116
120
|
included do
|
117
121
|
mattr_accessor :primary_key_prefix_type, instance_writer: false
|
118
122
|
|
119
|
-
class_attribute :table_name_prefix, instance_writer: false
|
120
|
-
|
123
|
+
class_attribute :table_name_prefix, instance_writer: false, default: ""
|
124
|
+
class_attribute :table_name_suffix, instance_writer: false, default: ""
|
125
|
+
class_attribute :schema_migrations_table_name, instance_accessor: false, default: "schema_migrations"
|
126
|
+
class_attribute :internal_metadata_table_name, instance_accessor: false, default: "ar_internal_metadata"
|
127
|
+
class_attribute :pluralize_table_names, instance_writer: false, default: true
|
128
|
+
class_attribute :implicit_order_column, instance_accessor: false
|
121
129
|
|
122
|
-
class_attribute :table_name_suffix, instance_writer: false
|
123
|
-
self.table_name_suffix = ""
|
124
|
-
|
125
|
-
class_attribute :schema_migrations_table_name, instance_accessor: false
|
126
|
-
self.schema_migrations_table_name = "schema_migrations"
|
127
|
-
|
128
|
-
class_attribute :internal_metadata_table_name, instance_accessor: false
|
129
|
-
self.internal_metadata_table_name = "ar_internal_metadata"
|
130
|
-
|
131
|
-
class_attribute :protected_environments, instance_accessor: false
|
132
130
|
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'
|
131
|
+
self.inheritance_column = "type"
|
138
132
|
self.ignored_columns = [].freeze
|
139
133
|
|
140
134
|
delegate :type_for_attribute, to: :class
|
@@ -240,11 +234,26 @@ module ActiveRecord
|
|
240
234
|
end
|
241
235
|
|
242
236
|
def full_table_name_prefix #:nodoc:
|
243
|
-
(
|
237
|
+
(module_parents.detect { |p| p.respond_to?(:table_name_prefix) } || self).table_name_prefix
|
244
238
|
end
|
245
239
|
|
246
240
|
def full_table_name_suffix #:nodoc:
|
247
|
-
(
|
241
|
+
(module_parents.detect { |p| p.respond_to?(:table_name_suffix) } || self).table_name_suffix
|
242
|
+
end
|
243
|
+
|
244
|
+
# The array of names of environments where destructive actions should be prohibited. By default,
|
245
|
+
# the value is <tt>["production"]</tt>.
|
246
|
+
def protected_environments
|
247
|
+
if defined?(@protected_environments)
|
248
|
+
@protected_environments
|
249
|
+
else
|
250
|
+
superclass.protected_environments
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
# Sets an array of names of environments where destructive actions should be prohibited.
|
255
|
+
def protected_environments=(environments)
|
256
|
+
@protected_environments = environments.map(&:to_s)
|
248
257
|
end
|
249
258
|
|
250
259
|
# Defines the name of the table column which will store the class name on single-table
|
@@ -278,12 +287,41 @@ module ActiveRecord
|
|
278
287
|
|
279
288
|
# Sets the columns names the model should ignore. Ignored columns won't have attribute
|
280
289
|
# accessors defined, and won't be referenced in SQL queries.
|
290
|
+
#
|
291
|
+
# A common usage pattern for this method is to ensure all references to an attribute
|
292
|
+
# have been removed and deployed, before a migration to drop the column from the database
|
293
|
+
# has been deployed and run. Using this two step approach to dropping columns ensures there
|
294
|
+
# is no code that raises errors due to having a cached schema in memory at the time the
|
295
|
+
# schema migration is run.
|
296
|
+
#
|
297
|
+
# For example, given a model where you want to drop the "category" attribute, first mark it
|
298
|
+
# as ignored:
|
299
|
+
#
|
300
|
+
# class Project < ActiveRecord::Base
|
301
|
+
# # schema:
|
302
|
+
# # id :bigint
|
303
|
+
# # name :string, limit: 255
|
304
|
+
# # category :string, limit: 255
|
305
|
+
#
|
306
|
+
# self.ignored_columns = [:category]
|
307
|
+
# end
|
308
|
+
#
|
309
|
+
# The schema still contains `category`, but now the model omits it, so any meta-driven code or
|
310
|
+
# schema caching will not attempt to use the column:
|
311
|
+
#
|
312
|
+
# Project.columns_hash["category"] => nil
|
313
|
+
#
|
314
|
+
# You will get an error if accessing that attribute directly, so ensure all usages of the
|
315
|
+
# column are removed (automated tests can help you find any usages).
|
316
|
+
#
|
317
|
+
# user = Project.create!(name: "First Project")
|
318
|
+
# user.category # => raises NoMethodError
|
281
319
|
def ignored_columns=(columns)
|
282
320
|
@ignored_columns = columns.map(&:to_s)
|
283
321
|
end
|
284
322
|
|
285
323
|
def sequence_name
|
286
|
-
if base_class
|
324
|
+
if base_class?
|
287
325
|
@sequence_name ||= reset_sequence_name
|
288
326
|
else
|
289
327
|
(@sequence_name ||= nil) || base_class.sequence_name
|
@@ -296,7 +334,7 @@ module ActiveRecord
|
|
296
334
|
end
|
297
335
|
|
298
336
|
# 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
|
337
|
+
# value, or (if the value is +nil+ or +false+) to the value returned by the
|
300
338
|
# given block. This is required for Oracle and is useful for any
|
301
339
|
# database which relies on sequences for primary key generation.
|
302
340
|
#
|
@@ -334,7 +372,7 @@ module ActiveRecord
|
|
334
372
|
def attributes_builder # :nodoc:
|
335
373
|
unless defined?(@attributes_builder) && @attributes_builder
|
336
374
|
defaults = _default_attributes.except(*(column_names - [primary_key]))
|
337
|
-
@attributes_builder = AttributeSet::Builder.new(attribute_types, defaults)
|
375
|
+
@attributes_builder = ActiveModel::AttributeSet::Builder.new(attribute_types, defaults)
|
338
376
|
end
|
339
377
|
@attributes_builder
|
340
378
|
end
|
@@ -351,7 +389,11 @@ module ActiveRecord
|
|
351
389
|
|
352
390
|
def attribute_types # :nodoc:
|
353
391
|
load_schema
|
354
|
-
@attribute_types ||= Hash.new(Type
|
392
|
+
@attribute_types ||= Hash.new(Type.default_value)
|
393
|
+
end
|
394
|
+
|
395
|
+
def yaml_encoder # :nodoc:
|
396
|
+
@yaml_encoder ||= ActiveModel::AttributeSet::YAMLEncoder.new(attribute_types)
|
355
397
|
end
|
356
398
|
|
357
399
|
# Returns the type of the attribute with the given name, after applying
|
@@ -364,8 +406,9 @@ module ActiveRecord
|
|
364
406
|
# it).
|
365
407
|
#
|
366
408
|
# +attr_name+ The name of the attribute to retrieve the type for. Must be
|
367
|
-
# a string
|
409
|
+
# a string or a symbol.
|
368
410
|
def type_for_attribute(attr_name, &block)
|
411
|
+
attr_name = attr_name.to_s
|
369
412
|
if block
|
370
413
|
attribute_types.fetch(attr_name, &block)
|
371
414
|
else
|
@@ -377,11 +420,12 @@ module ActiveRecord
|
|
377
420
|
# default values when instantiating the Active Record object for this table.
|
378
421
|
def column_defaults
|
379
422
|
load_schema
|
380
|
-
_default_attributes.to_hash
|
423
|
+
@column_defaults ||= _default_attributes.deep_dup.to_hash
|
381
424
|
end
|
382
425
|
|
383
426
|
def _default_attributes # :nodoc:
|
384
|
-
|
427
|
+
load_schema
|
428
|
+
@default_attributes ||= ActiveModel::AttributeSet.new({})
|
385
429
|
end
|
386
430
|
|
387
431
|
# Returns an array of column names as strings.
|
@@ -389,10 +433,20 @@ module ActiveRecord
|
|
389
433
|
@column_names ||= columns.map(&:name)
|
390
434
|
end
|
391
435
|
|
436
|
+
def symbol_column_to_string(name_symbol) # :nodoc:
|
437
|
+
@symbol_column_to_string_name_hash ||= column_names.index_by(&:to_sym)
|
438
|
+
@symbol_column_to_string_name_hash[name_symbol]
|
439
|
+
end
|
440
|
+
|
392
441
|
# Returns an array of column objects where the primary id, all columns ending in "_id" or "_count",
|
393
442
|
# and columns used for single table inheritance have been removed.
|
394
443
|
def content_columns
|
395
|
-
@content_columns ||= columns.reject
|
444
|
+
@content_columns ||= columns.reject do |c|
|
445
|
+
c.name == primary_key ||
|
446
|
+
c.name == inheritance_column ||
|
447
|
+
c.name.end_with?("_id") ||
|
448
|
+
c.name.end_with?("_count")
|
449
|
+
end
|
396
450
|
end
|
397
451
|
|
398
452
|
# Resets all the cached information about columns, which will cause them
|
@@ -423,7 +477,7 @@ module ActiveRecord
|
|
423
477
|
# end
|
424
478
|
def reset_column_information
|
425
479
|
connection.clear_cache!
|
426
|
-
undefine_attribute_methods
|
480
|
+
([self] + descendants).each(&:undefine_attribute_methods)
|
427
481
|
connection.schema_cache.clear_data_source_cache!(table_name)
|
428
482
|
|
429
483
|
reload_schema_from_cache
|
@@ -431,109 +485,88 @@ module ActiveRecord
|
|
431
485
|
end
|
432
486
|
|
433
487
|
protected
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
end
|
488
|
+
def initialize_load_schema_monitor
|
489
|
+
@load_schema_monitor = Monitor.new
|
490
|
+
end
|
438
491
|
|
439
492
|
private
|
493
|
+
def inherited(child_class)
|
494
|
+
super
|
495
|
+
child_class.initialize_load_schema_monitor
|
496
|
+
end
|
440
497
|
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
end
|
445
|
-
|
446
|
-
def schema_loaded?
|
447
|
-
defined?(@schema_loaded) && @schema_loaded
|
448
|
-
end
|
498
|
+
def schema_loaded?
|
499
|
+
defined?(@schema_loaded) && @schema_loaded
|
500
|
+
end
|
449
501
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
502
|
+
def load_schema
|
503
|
+
return if schema_loaded?
|
504
|
+
@load_schema_monitor.synchronize do
|
505
|
+
return if defined?(@columns_hash) && @columns_hash
|
454
506
|
|
455
|
-
|
507
|
+
load_schema!
|
456
508
|
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
@columns_hash = connection.schema_cache.columns_hash(table_name).except(*ignored_columns)
|
463
|
-
@columns_hash.each do |name, column|
|
464
|
-
warn_if_deprecated_type(column)
|
465
|
-
define_attribute(
|
466
|
-
name,
|
467
|
-
connection.lookup_cast_type_from_column(column),
|
468
|
-
default: column.default,
|
469
|
-
user_provided_default: false
|
470
|
-
)
|
509
|
+
@schema_loaded = true
|
510
|
+
rescue
|
511
|
+
reload_schema_from_cache # If the schema loading failed half way through, we must reset the state.
|
512
|
+
raise
|
513
|
+
end
|
471
514
|
end
|
472
|
-
end
|
473
515
|
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
@columns_hash = nil
|
485
|
-
@schema_loaded = false
|
486
|
-
@attribute_names = nil
|
487
|
-
direct_descendants.each do |descendant|
|
488
|
-
descendant.send(:reload_schema_from_cache)
|
516
|
+
def load_schema!
|
517
|
+
@columns_hash = connection.schema_cache.columns_hash(table_name).except(*ignored_columns)
|
518
|
+
@columns_hash.each do |name, column|
|
519
|
+
define_attribute(
|
520
|
+
name,
|
521
|
+
connection.lookup_cast_type_from_column(column),
|
522
|
+
default: column.default,
|
523
|
+
user_provided_default: false
|
524
|
+
)
|
525
|
+
end
|
489
526
|
end
|
490
|
-
end
|
491
|
-
|
492
|
-
# Guesses the table name, but does not decorate it with prefix and suffix information.
|
493
|
-
def undecorated_table_name(class_name = base_class.name)
|
494
|
-
table_name = class_name.to_s.demodulize.underscore
|
495
|
-
pluralize_table_names ? table_name.pluralize : table_name
|
496
|
-
end
|
497
527
|
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
528
|
+
def reload_schema_from_cache
|
529
|
+
@arel_table = nil
|
530
|
+
@column_names = nil
|
531
|
+
@symbol_column_to_string_name_hash = nil
|
532
|
+
@attribute_types = nil
|
533
|
+
@content_columns = nil
|
534
|
+
@default_attributes = nil
|
535
|
+
@column_defaults = nil
|
536
|
+
@inheritance_column = nil unless defined?(@explicit_inheritance_column) && @explicit_inheritance_column
|
537
|
+
@attributes_builder = nil
|
538
|
+
@columns = nil
|
539
|
+
@columns_hash = nil
|
540
|
+
@schema_loaded = false
|
541
|
+
@attribute_names = nil
|
542
|
+
@yaml_encoder = nil
|
543
|
+
direct_descendants.each do |descendant|
|
544
|
+
descendant.send(:reload_schema_from_cache)
|
507
545
|
end
|
546
|
+
end
|
508
547
|
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
548
|
+
# Guesses the table name, but does not decorate it with prefix and suffix information.
|
549
|
+
def undecorated_table_name(class_name = base_class.name)
|
550
|
+
table_name = class_name.to_s.demodulize.underscore
|
551
|
+
pluralize_table_names ? table_name.pluralize : table_name
|
513
552
|
end
|
514
|
-
end
|
515
553
|
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
554
|
+
# Computes and returns a table name according to default conventions.
|
555
|
+
def compute_table_name
|
556
|
+
if base_class?
|
557
|
+
# Nested classes are prefixed with singular parent table name.
|
558
|
+
if module_parent < Base && !module_parent.abstract_class?
|
559
|
+
contained = module_parent.table_name
|
560
|
+
contained = contained.singularize if module_parent.pluralize_table_names
|
561
|
+
contained += "_"
|
562
|
+
end
|
563
|
+
|
564
|
+
"#{full_table_name_prefix}#{contained}#{undecorated_table_name(name)}#{full_table_name_suffix}"
|
521
565
|
else
|
522
|
-
|
566
|
+
# STI subclasses always use their superclass' table.
|
567
|
+
base_class.table_name
|
523
568
|
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
|
-
|
529
|
-
attribute :#{column.name}, :legacy_point#{array_arguments}
|
530
|
-
|
531
|
-
If you'd like the new behavior today, you can add this line:
|
532
|
-
|
533
|
-
attribute :#{column.name}, :point#{array_arguments}
|
534
|
-
WARNING
|
535
569
|
end
|
536
|
-
end
|
537
570
|
end
|
538
571
|
end
|
539
572
|
end
|