activerecord 4.2.0 → 6.0.5.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 +5 -5
- data/CHANGELOG.md +852 -801
- data/MIT-LICENSE +4 -2
- data/README.rdoc +14 -13
- data/examples/performance.rb +33 -32
- data/examples/simple.rb +5 -4
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +267 -249
- data/lib/active_record/association_relation.rb +26 -6
- data/lib/active_record/associations/alias_tracker.rb +29 -36
- data/lib/active_record/associations/association.rb +137 -55
- data/lib/active_record/associations/association_scope.rb +110 -132
- data/lib/active_record/associations/belongs_to_association.rb +67 -54
- 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 -29
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +58 -70
- 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 +150 -275
- data/lib/active_record/associations/collection_proxy.rb +253 -152
- data/lib/active_record/associations/foreign_association.rb +20 -0
- data/lib/active_record/associations/has_many_association.rb +35 -84
- data/lib/active_record/associations/has_many_through_association.rb +62 -80
- data/lib/active_record/associations/has_one_association.rb +62 -49
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +43 -78
- 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 +159 -162
- data/lib/active_record/associations/preloader/association.rb +102 -113
- data/lib/active_record/associations/preloader/through_association.rb +85 -65
- data/lib/active_record/associations/preloader.rb +96 -95
- data/lib/active_record/associations/singular_association.rb +18 -45
- data/lib/active_record/associations/through_association.rb +49 -24
- data/lib/active_record/associations.rb +1737 -1596
- data/lib/active_record/attribute_assignment.rb +57 -185
- data/lib/active_record/attribute_decorators.rb +39 -17
- data/lib/active_record/attribute_methods/before_type_cast.rb +14 -5
- data/lib/active_record/attribute_methods/dirty.rb +174 -134
- data/lib/active_record/attribute_methods/primary_key.rb +90 -84
- data/lib/active_record/attribute_methods/query.rb +6 -5
- data/lib/active_record/attribute_methods/read.rb +20 -77
- data/lib/active_record/attribute_methods/serialization.rb +40 -21
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -37
- data/lib/active_record/attribute_methods/write.rb +33 -56
- data/lib/active_record/attribute_methods.rb +124 -143
- data/lib/active_record/attributes.rb +213 -74
- data/lib/active_record/autosave_association.rb +125 -54
- data/lib/active_record/base.rb +60 -49
- data/lib/active_record/callbacks.rb +101 -76
- data/lib/active_record/coders/json.rb +3 -1
- data/lib/active_record/coders/yaml_column.rb +36 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +810 -291
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +253 -108
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
- data/lib/active_record/connection_adapters/abstract/quoting.rb +171 -53
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +6 -4
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +383 -239
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +736 -235
- data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -87
- data/lib/active_record/connection_adapters/abstract_adapter.rb +487 -192
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +536 -600
- data/lib/active_record/connection_adapters/column.rb +56 -43
- data/lib/active_record/connection_adapters/connection_specification.rb +174 -153
- 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 +196 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +71 -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 +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +59 -196
- data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +71 -115
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -57
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +5 -2
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +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 +17 -13
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +6 -3
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -20
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/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 -9
- data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +70 -34
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +67 -51
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -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/oid.rb +23 -25
- 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 +49 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +465 -291
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +565 -363
- 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 +119 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +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 +299 -364
- data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
- data/lib/active_record/connection_handling.rb +167 -41
- data/lib/active_record/core.rb +277 -233
- data/lib/active_record/counter_cache.rb +71 -50
- 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 -106
- data/lib/active_record/enum.rb +172 -89
- data/lib/active_record/errors.rb +189 -53
- data/lib/active_record/explain.rb +22 -11
- data/lib/active_record/explain_registry.rb +4 -2
- data/lib/active_record/explain_subscriber.rb +11 -6
- data/lib/active_record/fixture_set/file.rb +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 +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +225 -497
- data/lib/active_record/gem_version.rb +6 -4
- data/lib/active_record/inheritance.rb +158 -115
- 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 +48 -0
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +99 -98
- 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/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 +166 -91
- data/lib/active_record/migration/compatibility.rb +244 -0
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +636 -290
- data/lib/active_record/model_schema.rb +344 -112
- data/lib/active_record/nested_attributes.rb +265 -215
- data/lib/active_record/no_touching.rb +15 -2
- data/lib/active_record/null_relation.rb +24 -38
- data/lib/active_record/persistence.rb +559 -125
- data/lib/active_record/query_cache.rb +19 -23
- data/lib/active_record/querying.rb +44 -30
- data/lib/active_record/railtie.rb +166 -47
- 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 +341 -202
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +461 -302
- data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
- data/lib/active_record/relation/batches.rb +206 -55
- data/lib/active_record/relation/calculations.rb +270 -249
- data/lib/active_record/relation/delegation.rb +76 -84
- data/lib/active_record/relation/finder_methods.rb +287 -255
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +86 -68
- data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -25
- 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/predicate_builder.rb +112 -92
- data/lib/active_record/relation/query_attribute.rb +50 -0
- data/lib/active_record/relation/query_methods.rb +612 -392
- data/lib/active_record/relation/record_fetch_warning.rb +51 -0
- data/lib/active_record/relation/spawn_methods.rb +18 -17
- data/lib/active_record/relation/where_clause.rb +189 -0
- data/lib/active_record/relation/where_clause_factory.rb +33 -0
- data/lib/active_record/relation.rb +533 -340
- data/lib/active_record/result.rb +79 -43
- 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 -20
- data/lib/active_record/scoping/default.rb +98 -82
- data/lib/active_record/scoping/named.rb +91 -33
- data/lib/active_record/scoping.rb +45 -27
- 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 +90 -0
- data/lib/active_record/tasks/database_tasks.rb +309 -99
- data/lib/active_record/tasks/mysql_database_tasks.rb +58 -89
- data/lib/active_record/tasks/postgresql_database_tasks.rb +81 -31
- data/lib/active_record/tasks/sqlite_database_tasks.rb +37 -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 +86 -41
- data/lib/active_record/touch_later.rb +65 -0
- data/lib/active_record/transactions.rb +222 -146
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +126 -0
- data/lib/active_record/type/date.rb +4 -41
- data/lib/active_record/type/date_time.rb +4 -38
- data/lib/active_record/type/decimal_without_scale.rb +6 -2
- data/lib/active_record/type/hash_lookup_type_map.rb +12 -5
- data/lib/active_record/type/internal/timezone.rb +17 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +29 -15
- data/lib/active_record/type/text.rb +2 -2
- data/lib/active_record/type/time.rb +21 -16
- data/lib/active_record/type/type_map.rb +16 -19
- data/lib/active_record/type/unsigned_integer.rb +9 -8
- data/lib/active_record/type.rb +77 -23
- data/lib/active_record/type_caster/connection.rb +34 -0
- data/lib/active_record/type_caster/map.rb +20 -0
- data/lib/active_record/type_caster.rb +9 -0
- data/lib/active_record/validations/absence.rb +25 -0
- data/lib/active_record/validations/associated.rb +12 -4
- data/lib/active_record/validations/length.rb +26 -0
- data/lib/active_record/validations/presence.rb +14 -13
- data/lib/active_record/validations/uniqueness.rb +43 -46
- data/lib/active_record/validations.rb +38 -35
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +44 -21
- 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/application_record/templates/application_record.rb.tt +5 -0
- 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 -8
- data/lib/rails/generators/active_record/migration.rb +30 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +174 -63
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -24
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -23
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -21
- data/lib/active_record/attribute.rb +0 -149
- data/lib/active_record/attribute_set/builder.rb +0 -86
- data/lib/active_record/attribute_set.rb +0 -77
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
- data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
- data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
- data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/serializers/xml_serializer.rb +0 -193
- data/lib/active_record/type/big_integer.rb +0 -13
- data/lib/active_record/type/binary.rb +0 -50
- data/lib/active_record/type/boolean.rb +0 -30
- data/lib/active_record/type/decimal.rb +0 -40
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -55
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -36
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/value.rb +0 -101
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -22
- data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
- /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
# = Active Record Autosave Association
|
3
5
|
#
|
4
|
-
#
|
6
|
+
# AutosaveAssociation is a module that takes care of automatically saving
|
5
7
|
# associated records when their parent is saved. In addition to saving, it
|
6
8
|
# also destroys any associated records that were marked for destruction.
|
7
|
-
# (See
|
9
|
+
# (See #mark_for_destruction and #marked_for_destruction?).
|
8
10
|
#
|
9
11
|
# Saving of the parent, its associations, and the destruction of marked
|
10
12
|
# associations, all happen inside a transaction. This should never leave the
|
@@ -22,12 +24,12 @@ module ActiveRecord
|
|
22
24
|
#
|
23
25
|
# == Validation
|
24
26
|
#
|
25
|
-
#
|
27
|
+
# Child records are validated unless <tt>:validate</tt> is +false+.
|
26
28
|
#
|
27
29
|
# == Callbacks
|
28
30
|
#
|
29
31
|
# Association with autosave option defines several callbacks on your
|
30
|
-
# model (before_save, after_create, after_update). Please note that
|
32
|
+
# model (around_save, before_save, after_create, after_update). Please note that
|
31
33
|
# callbacks are executed in the order they were defined in
|
32
34
|
# model. You should avoid modifying the association content, before
|
33
35
|
# autosave callbacks are executed. Placing your callbacks after
|
@@ -125,7 +127,6 @@ module ActiveRecord
|
|
125
127
|
# Now it _is_ removed from the database:
|
126
128
|
#
|
127
129
|
# Comment.find_by(id: id).nil? # => true
|
128
|
-
|
129
130
|
module AutosaveAssociation
|
130
131
|
extend ActiveSupport::Concern
|
131
132
|
|
@@ -141,22 +142,22 @@ module ActiveRecord
|
|
141
142
|
|
142
143
|
included do
|
143
144
|
Associations::Builder::Association.extensions << AssociationBuilderExtension
|
145
|
+
mattr_accessor :index_nested_attribute_errors, instance_writer: false, default: false
|
144
146
|
end
|
145
147
|
|
146
|
-
module ClassMethods
|
148
|
+
module ClassMethods # :nodoc:
|
147
149
|
private
|
148
|
-
|
149
150
|
def define_non_cyclic_method(name, &block)
|
150
|
-
return if
|
151
|
+
return if instance_methods(false).include?(name)
|
151
152
|
define_method(name) do |*args|
|
152
153
|
result = true; @_already_called ||= {}
|
153
154
|
# Loop prevention for validation of associations
|
154
155
|
unless @_already_called[name]
|
155
156
|
begin
|
156
|
-
@_already_called[name]=true
|
157
|
+
@_already_called[name] = true
|
157
158
|
result = instance_eval(&block)
|
158
159
|
ensure
|
159
|
-
@_already_called[name]=false
|
160
|
+
@_already_called[name] = false
|
160
161
|
end
|
161
162
|
end
|
162
163
|
|
@@ -177,11 +178,9 @@ module ActiveRecord
|
|
177
178
|
# before actually defining them.
|
178
179
|
def add_autosave_association_callbacks(reflection)
|
179
180
|
save_method = :"autosave_associated_records_for_#{reflection.name}"
|
180
|
-
validation_method = :"validate_associated_records_for_#{reflection.name}"
|
181
|
-
collection = reflection.collection?
|
182
181
|
|
183
|
-
if collection
|
184
|
-
|
182
|
+
if reflection.collection?
|
183
|
+
around_save :around_save_collection_association
|
185
184
|
|
186
185
|
define_non_cyclic_method(save_method) { save_collection_association(reflection) }
|
187
186
|
# Doesn't use after_save as that would save associations added in after_create/after_update twice
|
@@ -200,14 +199,25 @@ module ActiveRecord
|
|
200
199
|
after_create save_method
|
201
200
|
after_update save_method
|
202
201
|
else
|
203
|
-
define_non_cyclic_method(save_method) { save_belongs_to_association(reflection) }
|
202
|
+
define_non_cyclic_method(save_method) { throw(:abort) if save_belongs_to_association(reflection) == false }
|
204
203
|
before_save save_method
|
205
204
|
end
|
206
205
|
|
206
|
+
define_autosave_validation_callbacks(reflection)
|
207
|
+
end
|
208
|
+
|
209
|
+
def define_autosave_validation_callbacks(reflection)
|
210
|
+
validation_method = :"validate_associated_records_for_#{reflection.name}"
|
207
211
|
if reflection.validate? && !method_defined?(validation_method)
|
208
|
-
|
212
|
+
if reflection.collection?
|
213
|
+
method = :validate_collection_association
|
214
|
+
else
|
215
|
+
method = :validate_single_association
|
216
|
+
end
|
217
|
+
|
209
218
|
define_non_cyclic_method(validation_method) { send(method, reflection) }
|
210
219
|
validate validation_method
|
220
|
+
after_validation :_ensure_no_duplicate_errors
|
211
221
|
end
|
212
222
|
end
|
213
223
|
end
|
@@ -219,7 +229,7 @@ module ActiveRecord
|
|
219
229
|
super
|
220
230
|
end
|
221
231
|
|
222
|
-
# Marks this record to be destroyed as part of the
|
232
|
+
# Marks this record to be destroyed as part of the parent's save transaction.
|
223
233
|
# This does _not_ actually destroy the record instantly, rather child record will be destroyed
|
224
234
|
# when <tt>parent.save</tt> is called.
|
225
235
|
#
|
@@ -228,7 +238,7 @@ module ActiveRecord
|
|
228
238
|
@marked_for_destruction = true
|
229
239
|
end
|
230
240
|
|
231
|
-
# Returns whether or not this record will be destroyed as part of the
|
241
|
+
# Returns whether or not this record will be destroyed as part of the parent's save transaction.
|
232
242
|
#
|
233
243
|
# Only useful if the <tt>:autosave</tt> option on the parent is enabled for this associated model.
|
234
244
|
def marked_for_destruction?
|
@@ -251,32 +261,38 @@ module ActiveRecord
|
|
251
261
|
# Returns whether or not this record has been changed in any way (including whether
|
252
262
|
# any of its nested autosave associations are likewise changed)
|
253
263
|
def changed_for_autosave?
|
254
|
-
new_record? ||
|
264
|
+
new_record? || has_changes_to_save? || marked_for_destruction? || nested_records_changed_for_autosave?
|
255
265
|
end
|
256
266
|
|
257
267
|
private
|
258
|
-
|
259
268
|
# Returns the record for an association collection that should be validated
|
260
269
|
# or saved. If +autosave+ is +false+ only new records will be returned,
|
261
270
|
# unless the parent is/was a new record itself.
|
262
271
|
def associated_records_to_validate_or_save(association, new_record, autosave)
|
263
|
-
if new_record
|
272
|
+
if new_record || custom_validation_context?
|
264
273
|
association && association.target
|
265
274
|
elsif autosave
|
266
|
-
association.target.find_all
|
275
|
+
association.target.find_all(&:changed_for_autosave?)
|
267
276
|
else
|
268
|
-
association.target.find_all
|
277
|
+
association.target.find_all(&:new_record?)
|
269
278
|
end
|
270
279
|
end
|
271
280
|
|
272
281
|
# go through nested autosave associations that are loaded in memory (without loading
|
273
282
|
# any new ones), and return true if is changed for autosave
|
274
283
|
def nested_records_changed_for_autosave?
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
284
|
+
@_nested_records_changed_for_autosave_already_called ||= false
|
285
|
+
return false if @_nested_records_changed_for_autosave_already_called
|
286
|
+
begin
|
287
|
+
@_nested_records_changed_for_autosave_already_called = true
|
288
|
+
self.class._reflections.values.any? do |reflection|
|
289
|
+
if reflection.options[:autosave]
|
290
|
+
association = association_instance_get(reflection.name)
|
291
|
+
association && Array.wrap(association.target).any?(&:changed_for_autosave?)
|
292
|
+
end
|
279
293
|
end
|
294
|
+
ensure
|
295
|
+
@_nested_records_changed_for_autosave_already_called = false
|
280
296
|
end
|
281
297
|
end
|
282
298
|
|
@@ -285,7 +301,7 @@ module ActiveRecord
|
|
285
301
|
def validate_single_association(reflection)
|
286
302
|
association = association_instance_get(reflection.name)
|
287
303
|
record = association && association.reader
|
288
|
-
association_valid?(reflection, record) if record
|
304
|
+
association_valid?(reflection, record) if record && (record.changed_for_autosave? || custom_validation_context?)
|
289
305
|
end
|
290
306
|
|
291
307
|
# Validate the associated records if <tt>:validate</tt> or
|
@@ -294,7 +310,7 @@ module ActiveRecord
|
|
294
310
|
def validate_collection_association(reflection)
|
295
311
|
if association = association_instance_get(reflection.name)
|
296
312
|
if records = associated_records_to_validate_or_save(association, new_record?, reflection.options[:autosave])
|
297
|
-
records.
|
313
|
+
records.each_with_index { |record, index| association_valid?(reflection, record, index) }
|
298
314
|
end
|
299
315
|
end
|
300
316
|
end
|
@@ -302,17 +318,30 @@ module ActiveRecord
|
|
302
318
|
# Returns whether or not the association is valid and applies any errors to
|
303
319
|
# the parent, <tt>self</tt>, if it wasn't. Skips any <tt>:autosave</tt>
|
304
320
|
# enabled records if they're marked_for_destruction? or destroyed.
|
305
|
-
def association_valid?(reflection, record)
|
306
|
-
return true if record.destroyed? || record.marked_for_destruction?
|
321
|
+
def association_valid?(reflection, record, index = nil)
|
322
|
+
return true if record.destroyed? || (reflection.options[:autosave] && record.marked_for_destruction?)
|
323
|
+
|
324
|
+
context = validation_context if custom_validation_context?
|
307
325
|
|
308
|
-
|
309
|
-
unless valid = record.valid?(validation_context)
|
326
|
+
unless valid = record.valid?(context)
|
310
327
|
if reflection.options[:autosave]
|
328
|
+
indexed_attribute = !index.nil? && (reflection.options[:index_errors] || ActiveRecord::Base.index_nested_attribute_errors)
|
329
|
+
|
311
330
|
record.errors.each do |attribute, message|
|
312
|
-
attribute =
|
331
|
+
attribute = normalize_reflection_attribute(indexed_attribute, reflection, index, attribute)
|
313
332
|
errors[attribute] << message
|
314
333
|
errors[attribute].uniq!
|
315
334
|
end
|
335
|
+
|
336
|
+
record.errors.details.each_key do |attribute|
|
337
|
+
reflection_attribute =
|
338
|
+
normalize_reflection_attribute(indexed_attribute, reflection, index, attribute).to_sym
|
339
|
+
|
340
|
+
record.errors.details[attribute].each do |error|
|
341
|
+
errors.details[reflection_attribute] << error
|
342
|
+
errors.details[reflection_attribute].uniq!
|
343
|
+
end
|
344
|
+
end
|
316
345
|
else
|
317
346
|
errors.add(reflection.name)
|
318
347
|
end
|
@@ -320,18 +349,30 @@ module ActiveRecord
|
|
320
349
|
valid
|
321
350
|
end
|
322
351
|
|
323
|
-
|
352
|
+
def normalize_reflection_attribute(indexed_attribute, reflection, index, attribute)
|
353
|
+
if indexed_attribute
|
354
|
+
"#{reflection.name}[#{index}].#{attribute}"
|
355
|
+
else
|
356
|
+
"#{reflection.name}.#{attribute}"
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
# Is used as an around_save callback to check while saving a collection
|
324
361
|
# association whether or not the parent was a new record before saving.
|
325
|
-
def
|
326
|
-
@new_record_before_save
|
327
|
-
|
362
|
+
def around_save_collection_association
|
363
|
+
previously_new_record_before_save = (@new_record_before_save ||= false)
|
364
|
+
@new_record_before_save = !previously_new_record_before_save && new_record?
|
365
|
+
|
366
|
+
yield
|
367
|
+
ensure
|
368
|
+
@new_record_before_save = previously_new_record_before_save
|
328
369
|
end
|
329
370
|
|
330
371
|
# Saves any new associated records, or all loaded autosave associations if
|
331
372
|
# <tt>:autosave</tt> is enabled on the association.
|
332
373
|
#
|
333
374
|
# In addition, it destroys all children that were marked for destruction
|
334
|
-
# with mark_for_destruction.
|
375
|
+
# with #mark_for_destruction.
|
335
376
|
#
|
336
377
|
# This all happens inside a transaction, _if_ the Transactions module is included into
|
337
378
|
# ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
|
@@ -339,7 +380,14 @@ module ActiveRecord
|
|
339
380
|
if association = association_instance_get(reflection.name)
|
340
381
|
autosave = reflection.options[:autosave]
|
341
382
|
|
342
|
-
|
383
|
+
# By saving the instance variable in a local variable,
|
384
|
+
# we make the whole callback re-entrant.
|
385
|
+
new_record_before_save = @new_record_before_save
|
386
|
+
|
387
|
+
# reconstruct the scope now that we know the owner's id
|
388
|
+
association.reset_scope
|
389
|
+
|
390
|
+
if records = associated_records_to_validate_or_save(association, new_record_before_save, autosave)
|
343
391
|
if autosave
|
344
392
|
records_to_destroy = records.select(&:marked_for_destruction?)
|
345
393
|
records_to_destroy.each { |record| association.destroy(record) }
|
@@ -351,22 +399,24 @@ module ActiveRecord
|
|
351
399
|
|
352
400
|
saved = true
|
353
401
|
|
354
|
-
if autosave != false && (
|
402
|
+
if autosave != false && (new_record_before_save || record.new_record?)
|
355
403
|
if autosave
|
356
404
|
saved = association.insert_record(record, false)
|
357
|
-
|
358
|
-
association.insert_record(record)
|
405
|
+
elsif !reflection.nested?
|
406
|
+
association_saved = association.insert_record(record)
|
407
|
+
|
408
|
+
if reflection.validate?
|
409
|
+
errors.add(reflection.name) unless association_saved
|
410
|
+
saved = association_saved
|
411
|
+
end
|
359
412
|
end
|
360
413
|
elsif autosave
|
361
|
-
saved = record.save(:
|
414
|
+
saved = record.save(validate: false)
|
362
415
|
end
|
363
416
|
|
364
|
-
raise
|
417
|
+
raise(RecordInvalid.new(association.owner)) unless saved
|
365
418
|
end
|
366
419
|
end
|
367
|
-
|
368
|
-
# reconstruct the scope now that we know the owner's id
|
369
|
-
association.reset_scope if association.respond_to?(:reset_scope)
|
370
420
|
end
|
371
421
|
end
|
372
422
|
|
@@ -374,7 +424,7 @@ module ActiveRecord
|
|
374
424
|
# on the association.
|
375
425
|
#
|
376
426
|
# In addition, it will destroy the association if it was marked for
|
377
|
-
# destruction with mark_for_destruction.
|
427
|
+
# destruction with #mark_for_destruction.
|
378
428
|
#
|
379
429
|
# This all happens inside a transaction, _if_ the Transactions module is included into
|
380
430
|
# ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
|
@@ -393,9 +443,12 @@ module ActiveRecord
|
|
393
443
|
if (autosave && record.changed_for_autosave?) || new_record? || record_changed?(reflection, record, key)
|
394
444
|
unless reflection.through_reflection
|
395
445
|
record[reflection.foreign_key] = key
|
446
|
+
if inverse_reflection = reflection.inverse_of
|
447
|
+
record.association(inverse_reflection.name).inversed_from(self)
|
448
|
+
end
|
396
449
|
end
|
397
450
|
|
398
|
-
saved = record.save(:
|
451
|
+
saved = record.save(validate: !autosave)
|
399
452
|
raise ActiveRecord::Rollback if !saved && autosave
|
400
453
|
saved
|
401
454
|
end
|
@@ -406,8 +459,14 @@ module ActiveRecord
|
|
406
459
|
# If the record is new or it has changed, returns true.
|
407
460
|
def record_changed?(reflection, record, key)
|
408
461
|
record.new_record? ||
|
409
|
-
|
410
|
-
record.
|
462
|
+
association_foreign_key_changed?(reflection, record, key) ||
|
463
|
+
record.will_save_change_to_attribute?(reflection.foreign_key)
|
464
|
+
end
|
465
|
+
|
466
|
+
def association_foreign_key_changed?(reflection, record, key)
|
467
|
+
return false if reflection.through_reflection?
|
468
|
+
|
469
|
+
record.has_attribute?(reflection.foreign_key) && record[reflection.foreign_key] != key
|
411
470
|
end
|
412
471
|
|
413
472
|
# Saves the associated record if it's new or <tt>:autosave</tt> is enabled.
|
@@ -415,7 +474,9 @@ module ActiveRecord
|
|
415
474
|
# In addition, it will destroy the association if it was marked for destruction.
|
416
475
|
def save_belongs_to_association(reflection)
|
417
476
|
association = association_instance_get(reflection.name)
|
418
|
-
|
477
|
+
return unless association && association.loaded? && !association.stale_target?
|
478
|
+
|
479
|
+
record = association.load_target
|
419
480
|
if record && !record.destroyed?
|
420
481
|
autosave = reflection.options[:autosave]
|
421
482
|
|
@@ -423,7 +484,7 @@ module ActiveRecord
|
|
423
484
|
self[reflection.foreign_key] = nil
|
424
485
|
record.destroy
|
425
486
|
elsif autosave != false
|
426
|
-
saved = record.save(:
|
487
|
+
saved = record.save(validate: !autosave) if record.new_record? || (autosave && record.changed_for_autosave?)
|
427
488
|
|
428
489
|
if association.updated?
|
429
490
|
association_id = record.send(reflection.options[:primary_key] || :id)
|
@@ -435,5 +496,15 @@ module ActiveRecord
|
|
435
496
|
end
|
436
497
|
end
|
437
498
|
end
|
499
|
+
|
500
|
+
def custom_validation_context?
|
501
|
+
validation_context && [:create, :update].exclude?(validation_context)
|
502
|
+
end
|
503
|
+
|
504
|
+
def _ensure_no_duplicate_errors
|
505
|
+
errors.messages.each_key do |attribute|
|
506
|
+
errors[attribute].uniq!
|
507
|
+
end
|
508
|
+
end
|
438
509
|
end
|
439
510
|
end
|
data/lib/active_record/base.rb
CHANGED
@@ -1,27 +1,28 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
require "active_support/benchmarkable"
|
5
|
+
require "active_support/dependencies"
|
6
|
+
require "active_support/descendants_tracker"
|
7
|
+
require "active_support/time"
|
8
|
+
require "active_support/core_ext/module/attribute_accessors"
|
9
|
+
require "active_support/core_ext/array/extract_options"
|
10
|
+
require "active_support/core_ext/hash/deep_merge"
|
11
|
+
require "active_support/core_ext/hash/slice"
|
12
|
+
require "active_support/core_ext/string/behavior"
|
13
|
+
require "active_support/core_ext/kernel/singleton_class"
|
14
|
+
require "active_support/core_ext/module/introspection"
|
15
|
+
require "active_support/core_ext/object/duplicable"
|
16
|
+
require "active_support/core_ext/class/subclasses"
|
17
|
+
require "active_record/attribute_decorators"
|
18
|
+
require "active_record/define_callbacks"
|
19
|
+
require "active_record/errors"
|
20
|
+
require "active_record/log_subscriber"
|
21
|
+
require "active_record/explain_subscriber"
|
22
|
+
require "active_record/relation/delegation"
|
23
|
+
require "active_record/attributes"
|
24
|
+
require "active_record/type_caster"
|
25
|
+
require "active_record/database_configurations"
|
25
26
|
|
26
27
|
module ActiveRecord #:nodoc:
|
27
28
|
# = Active Record
|
@@ -119,29 +120,25 @@ module ActiveRecord #:nodoc:
|
|
119
120
|
# All column values are automatically available through basic accessors on the Active Record
|
120
121
|
# object, but sometimes you want to specialize this behavior. This can be done by overwriting
|
121
122
|
# the default accessors (using the same name as the attribute) and calling
|
122
|
-
#
|
123
|
-
# change things.
|
123
|
+
# +super+ to actually change things.
|
124
124
|
#
|
125
125
|
# class Song < ActiveRecord::Base
|
126
126
|
# # Uses an integer of seconds to hold the length of the song
|
127
127
|
#
|
128
128
|
# def length=(minutes)
|
129
|
-
#
|
129
|
+
# super(minutes.to_i * 60)
|
130
130
|
# end
|
131
131
|
#
|
132
132
|
# def length
|
133
|
-
#
|
133
|
+
# super / 60
|
134
134
|
# end
|
135
135
|
# end
|
136
136
|
#
|
137
|
-
# You can alternatively use <tt>self[:attribute]=(value)</tt> and <tt>self[:attribute]</tt>
|
138
|
-
# instead of <tt>write_attribute(:attribute, value)</tt> and <tt>read_attribute(:attribute)</tt>.
|
139
|
-
#
|
140
137
|
# == Attribute query methods
|
141
138
|
#
|
142
139
|
# In addition to the basic accessors, query methods are also automatically available on the Active Record object.
|
143
140
|
# Query methods allow you to test whether an attribute value is present.
|
144
|
-
#
|
141
|
+
# Additionally, when dealing with numeric values, a query method will return false if the value is zero.
|
145
142
|
#
|
146
143
|
# For example, an Active Record User with the <tt>name</tt> attribute has a <tt>name?</tt> method that you can call
|
147
144
|
# to determine whether the user has a name:
|
@@ -172,10 +169,11 @@ module ActiveRecord #:nodoc:
|
|
172
169
|
# <tt>Person.find_by_user_name(user_name)</tt>.
|
173
170
|
#
|
174
171
|
# It's possible to add an exclamation point (!) on the end of the dynamic finders to get them to raise an
|
175
|
-
#
|
172
|
+
# ActiveRecord::RecordNotFound error if they do not return any records,
|
176
173
|
# like <tt>Person.find_by_last_name!</tt>.
|
177
174
|
#
|
178
|
-
# It's also possible to use multiple attributes in the same
|
175
|
+
# It's also possible to use multiple attributes in the same <tt>find_by_</tt> by separating them with
|
176
|
+
# "_and_".
|
179
177
|
#
|
180
178
|
# Person.find_by(user_name: user_name, password: password)
|
181
179
|
# Person.find_by_user_name_and_password(user_name, password) # with dynamic finder
|
@@ -187,7 +185,8 @@ module ActiveRecord #:nodoc:
|
|
187
185
|
# == Saving arrays, hashes, and other non-mappable objects in text columns
|
188
186
|
#
|
189
187
|
# Active Record can serialize any object in text columns using YAML. To do so, you must
|
190
|
-
# specify this with a call to the class method
|
188
|
+
# specify this with a call to the class method
|
189
|
+
# {serialize}[rdoc-ref:AttributeMethods::Serialization::ClassMethods#serialize].
|
191
190
|
# This makes it possible to store arrays, hashes, and other non-mappable objects without doing
|
192
191
|
# any additional work.
|
193
192
|
#
|
@@ -227,39 +226,47 @@ module ActiveRecord #:nodoc:
|
|
227
226
|
#
|
228
227
|
# == Connection to multiple databases in different models
|
229
228
|
#
|
230
|
-
# Connections are usually created through
|
229
|
+
# Connections are usually created through
|
230
|
+
# {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection] and retrieved
|
231
231
|
# by ActiveRecord::Base.connection. All classes inheriting from ActiveRecord::Base will use this
|
232
232
|
# connection. But you can also set a class-specific connection. For example, if Course is an
|
233
233
|
# ActiveRecord::Base, but resides in a different database, you can just say <tt>Course.establish_connection</tt>
|
234
234
|
# and Course and all of its subclasses will use this connection instead.
|
235
235
|
#
|
236
236
|
# This feature is implemented by keeping a connection pool in ActiveRecord::Base that is
|
237
|
-
# a
|
237
|
+
# a hash indexed by the class. If a connection is requested, the
|
238
|
+
# {ActiveRecord::Base.retrieve_connection}[rdoc-ref:ConnectionHandling#retrieve_connection] method
|
238
239
|
# will go up the class-hierarchy until a connection is found in the connection pool.
|
239
240
|
#
|
240
241
|
# == Exceptions
|
241
242
|
#
|
242
243
|
# * ActiveRecordError - Generic error class and superclass of all other errors raised by Active Record.
|
243
|
-
# * AdapterNotSpecified - The configuration hash used in
|
244
|
-
#
|
245
|
-
#
|
246
|
-
#
|
244
|
+
# * AdapterNotSpecified - The configuration hash used in
|
245
|
+
# {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection]
|
246
|
+
# didn't include an <tt>:adapter</tt> key.
|
247
|
+
# * AdapterNotFound - The <tt>:adapter</tt> key used in
|
248
|
+
# {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection]
|
249
|
+
# specified a non-existent adapter
|
247
250
|
# (or a bad spelling of an existing one).
|
248
251
|
# * AssociationTypeMismatch - The object assigned to the association wasn't of the type
|
249
252
|
# specified in the association definition.
|
250
253
|
# * AttributeAssignmentError - An error occurred while doing a mass assignment through the
|
251
|
-
#
|
254
|
+
# {ActiveRecord::Base#attributes=}[rdoc-ref:AttributeAssignment#attributes=] method.
|
252
255
|
# You can inspect the +attribute+ property of the exception object to determine which attribute
|
253
256
|
# triggered the error.
|
254
|
-
# * ConnectionNotEstablished - No connection has been established.
|
255
|
-
# before querying.
|
257
|
+
# * ConnectionNotEstablished - No connection has been established.
|
258
|
+
# Use {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection] before querying.
|
256
259
|
# * MultiparameterAssignmentErrors - Collection of errors that occurred during a mass assignment using the
|
257
|
-
#
|
260
|
+
# {ActiveRecord::Base#attributes=}[rdoc-ref:AttributeAssignment#attributes=] method.
|
261
|
+
# The +errors+ property of this exception contains an array of
|
258
262
|
# AttributeAssignmentError
|
259
263
|
# objects that should be inspected to determine which attributes triggered the errors.
|
260
|
-
# * RecordInvalid - raised by save! and
|
261
|
-
#
|
262
|
-
#
|
264
|
+
# * RecordInvalid - raised by {ActiveRecord::Base#save!}[rdoc-ref:Persistence#save!] and
|
265
|
+
# {ActiveRecord::Base.create!}[rdoc-ref:Persistence::ClassMethods#create!]
|
266
|
+
# when the record is invalid.
|
267
|
+
# * RecordNotFound - No record responded to the {ActiveRecord::Base.find}[rdoc-ref:FinderMethods#find] method.
|
268
|
+
# Either the row with the given ID doesn't exist or the row didn't meet the additional restrictions.
|
269
|
+
# Some {ActiveRecord::Base.find}[rdoc-ref:FinderMethods#find] calls do not raise this exception to signal
|
263
270
|
# nothing was found, please check its documentation for further details.
|
264
271
|
# * SerializationTypeMismatch - The serialized object wasn't of the class specified as the second parameter.
|
265
272
|
# * StatementInvalid - The database server rejected the SQL statement. The precise error is added in the message.
|
@@ -281,6 +288,7 @@ module ActiveRecord #:nodoc:
|
|
281
288
|
extend Explain
|
282
289
|
extend Enum
|
283
290
|
extend Delegation::DelegateCache
|
291
|
+
extend Aggregations::ClassMethods
|
284
292
|
|
285
293
|
include Core
|
286
294
|
include Persistence
|
@@ -298,6 +306,7 @@ module ActiveRecord #:nodoc:
|
|
298
306
|
include AttributeDecorators
|
299
307
|
include Locking::Optimistic
|
300
308
|
include Locking::Pessimistic
|
309
|
+
include DefineCallbacks
|
301
310
|
include AttributeMethods
|
302
311
|
include Callbacks
|
303
312
|
include Timestamp
|
@@ -305,12 +314,14 @@ module ActiveRecord #:nodoc:
|
|
305
314
|
include ActiveModel::SecurePassword
|
306
315
|
include AutosaveAssociation
|
307
316
|
include NestedAttributes
|
308
|
-
include Aggregations
|
309
317
|
include Transactions
|
318
|
+
include TouchLater
|
310
319
|
include NoTouching
|
311
320
|
include Reflection
|
312
321
|
include Serialization
|
313
322
|
include Store
|
323
|
+
include SecureToken
|
324
|
+
include Suppressor
|
314
325
|
end
|
315
326
|
|
316
327
|
ActiveSupport.run_load_hooks(:active_record, Base)
|