activerecord 4.2.11.1 → 6.0.3.5
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 +721 -1522
- 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 +266 -251
- data/lib/active_record/association_relation.rb +20 -13
- data/lib/active_record/associations/alias_tracker.rb +29 -36
- data/lib/active_record/associations/association.rb +128 -57
- data/lib/active_record/associations/association_scope.rb +103 -132
- data/lib/active_record/associations/belongs_to_association.rb +65 -60
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +27 -40
- data/lib/active_record/associations/builder/belongs_to.rb +69 -55
- data/lib/active_record/associations/builder/collection_association.rb +10 -33
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +50 -66
- data/lib/active_record/associations/builder/has_many.rb +8 -4
- data/lib/active_record/associations/builder/has_one.rb +46 -5
- data/lib/active_record/associations/builder/singular_association.rb +16 -10
- data/lib/active_record/associations/collection_association.rb +136 -288
- data/lib/active_record/associations/collection_proxy.rb +241 -147
- data/lib/active_record/associations/foreign_association.rb +10 -1
- data/lib/active_record/associations/has_many_association.rb +34 -98
- data/lib/active_record/associations/has_many_through_association.rb +60 -87
- data/lib/active_record/associations/has_one_association.rb +61 -49
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +38 -86
- 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 +149 -166
- data/lib/active_record/associations/preloader/association.rb +90 -123
- data/lib/active_record/associations/preloader/through_association.rb +85 -65
- data/lib/active_record/associations/preloader.rb +90 -93
- data/lib/active_record/associations/singular_association.rb +18 -39
- data/lib/active_record/associations/through_association.rb +38 -18
- data/lib/active_record/associations.rb +1737 -1597
- 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 +13 -9
- data/lib/active_record/attribute_methods/dirty.rb +174 -144
- 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 +57 -37
- data/lib/active_record/attribute_methods/write.rb +32 -55
- data/lib/active_record/attribute_methods.rb +120 -135
- data/lib/active_record/attributes.rb +213 -82
- data/lib/active_record/autosave_association.rb +97 -41
- data/lib/active_record/base.rb +57 -45
- 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 +23 -12
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +804 -297
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +240 -115
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
- data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +371 -242
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +694 -256
- data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -83
- data/lib/active_record/connection_adapters/abstract_adapter.rb +473 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +507 -639
- 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 +264 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +58 -181
- data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -114
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -58
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -22
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
- 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 +51 -34
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +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 +462 -296
- 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 +558 -356
- data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +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 -349
- 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 +252 -230
- data/lib/active_record/counter_cache.rb +70 -49
- 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 +163 -86
- data/lib/active_record/errors.rb +188 -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 +10 -5
- data/lib/active_record/fixture_set/file.rb +35 -9
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +227 -501
- 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 +21 -3
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +86 -96
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +76 -33
- data/lib/active_record/middleware/database_selector/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 +623 -305
- data/lib/active_record/model_schema.rb +313 -112
- data/lib/active_record/nested_attributes.rb +263 -223
- data/lib/active_record/no_touching.rb +15 -2
- data/lib/active_record/null_relation.rb +24 -38
- data/lib/active_record/persistence.rb +557 -126
- data/lib/active_record/query_cache.rb +19 -23
- data/lib/active_record/querying.rb +44 -30
- data/lib/active_record/railtie.rb +143 -44
- 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 +331 -185
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +430 -281
- 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 +268 -254
- data/lib/active_record/relation/delegation.rb +75 -84
- data/lib/active_record/relation/finder_methods.rb +285 -241
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +78 -88
- data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
- data/lib/active_record/relation/predicate_builder.rb +110 -119
- data/lib/active_record/relation/query_attribute.rb +50 -0
- data/lib/active_record/relation/query_methods.rb +603 -397
- data/lib/active_record/relation/record_fetch_warning.rb +51 -0
- data/lib/active_record/relation/spawn_methods.rb +11 -14
- 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 +530 -341
- 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 -17
- data/lib/active_record/scoping/default.rb +98 -83
- data/lib/active_record/scoping/named.rb +86 -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 +307 -100
- data/lib/active_record/tasks/mysql_database_tasks.rb +55 -100
- data/lib/active_record/tasks/postgresql_database_tasks.rb +80 -41
- 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 +225 -0
- data/lib/active_record/timestamp.rb +86 -41
- data/lib/active_record/touch_later.rb +65 -0
- data/lib/active_record/transactions.rb +223 -157
- 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 -45
- data/lib/active_record/type/date_time.rb +4 -49
- data/lib/active_record/type/decimal_without_scale.rb +6 -2
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- 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 +23 -15
- data/lib/active_record/type/text.rb +2 -2
- data/lib/active_record/type/time.rb +11 -16
- data/lib/active_record/type/type_map.rb +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 +42 -55
- data/lib/active_record/validations.rb +38 -35
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +42 -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/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 -2
- 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/model/templates/{module.rb → module.rb.tt} +0 -0
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +168 -59
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -24
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -23
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -21
- data/lib/active_record/attribute.rb +0 -163
- data/lib/active_record/attribute_set/builder.rb +0 -106
- data/lib/active_record/attribute_set.rb +0 -81
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
- 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 -31
- data/lib/active_record/type/decimal.rb +0 -64
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -59
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -40
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/value.rb +0 -110
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
- data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,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,7 +24,7 @@ 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
|
#
|
@@ -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
|
|
@@ -180,6 +181,7 @@ module ActiveRecord
|
|
180
181
|
|
181
182
|
if reflection.collection?
|
182
183
|
before_save :before_save_collection_association
|
184
|
+
after_save :after_save_collection_association
|
183
185
|
|
184
186
|
define_non_cyclic_method(save_method) { save_collection_association(reflection) }
|
185
187
|
# Doesn't use after_save as that would save associations added in after_create/after_update twice
|
@@ -198,7 +200,7 @@ module ActiveRecord
|
|
198
200
|
after_create save_method
|
199
201
|
after_update save_method
|
200
202
|
else
|
201
|
-
define_non_cyclic_method(save_method) { save_belongs_to_association(reflection) }
|
203
|
+
define_non_cyclic_method(save_method) { throw(:abort) if save_belongs_to_association(reflection) == false }
|
202
204
|
before_save save_method
|
203
205
|
end
|
204
206
|
|
@@ -216,6 +218,7 @@ module ActiveRecord
|
|
216
218
|
|
217
219
|
define_non_cyclic_method(validation_method) { send(method, reflection) }
|
218
220
|
validate validation_method
|
221
|
+
after_validation :_ensure_no_duplicate_errors
|
219
222
|
end
|
220
223
|
end
|
221
224
|
end
|
@@ -227,7 +230,7 @@ module ActiveRecord
|
|
227
230
|
super
|
228
231
|
end
|
229
232
|
|
230
|
-
# Marks this record to be destroyed as part of the
|
233
|
+
# Marks this record to be destroyed as part of the parent's save transaction.
|
231
234
|
# This does _not_ actually destroy the record instantly, rather child record will be destroyed
|
232
235
|
# when <tt>parent.save</tt> is called.
|
233
236
|
#
|
@@ -236,7 +239,7 @@ module ActiveRecord
|
|
236
239
|
@marked_for_destruction = true
|
237
240
|
end
|
238
241
|
|
239
|
-
# Returns whether or not this record will be destroyed as part of the
|
242
|
+
# Returns whether or not this record will be destroyed as part of the parent's save transaction.
|
240
243
|
#
|
241
244
|
# Only useful if the <tt>:autosave</tt> option on the parent is enabled for this associated model.
|
242
245
|
def marked_for_destruction?
|
@@ -259,21 +262,20 @@ module ActiveRecord
|
|
259
262
|
# Returns whether or not this record has been changed in any way (including whether
|
260
263
|
# any of its nested autosave associations are likewise changed)
|
261
264
|
def changed_for_autosave?
|
262
|
-
new_record? ||
|
265
|
+
new_record? || has_changes_to_save? || marked_for_destruction? || nested_records_changed_for_autosave?
|
263
266
|
end
|
264
267
|
|
265
268
|
private
|
266
|
-
|
267
269
|
# Returns the record for an association collection that should be validated
|
268
270
|
# or saved. If +autosave+ is +false+ only new records will be returned,
|
269
271
|
# unless the parent is/was a new record itself.
|
270
272
|
def associated_records_to_validate_or_save(association, new_record, autosave)
|
271
|
-
if new_record
|
273
|
+
if new_record || custom_validation_context?
|
272
274
|
association && association.target
|
273
275
|
elsif autosave
|
274
|
-
association.target.find_all
|
276
|
+
association.target.find_all(&:changed_for_autosave?)
|
275
277
|
else
|
276
|
-
association.target.find_all
|
278
|
+
association.target.find_all(&:new_record?)
|
277
279
|
end
|
278
280
|
end
|
279
281
|
|
@@ -300,7 +302,7 @@ module ActiveRecord
|
|
300
302
|
def validate_single_association(reflection)
|
301
303
|
association = association_instance_get(reflection.name)
|
302
304
|
record = association && association.reader
|
303
|
-
association_valid?(reflection, record) if record
|
305
|
+
association_valid?(reflection, record) if record && (record.changed_for_autosave? || custom_validation_context?)
|
304
306
|
end
|
305
307
|
|
306
308
|
# Validate the associated records if <tt>:validate</tt> or
|
@@ -309,7 +311,7 @@ module ActiveRecord
|
|
309
311
|
def validate_collection_association(reflection)
|
310
312
|
if association = association_instance_get(reflection.name)
|
311
313
|
if records = associated_records_to_validate_or_save(association, new_record?, reflection.options[:autosave])
|
312
|
-
records.
|
314
|
+
records.each_with_index { |record, index| association_valid?(reflection, record, index) }
|
313
315
|
end
|
314
316
|
end
|
315
317
|
end
|
@@ -317,17 +319,30 @@ module ActiveRecord
|
|
317
319
|
# Returns whether or not the association is valid and applies any errors to
|
318
320
|
# the parent, <tt>self</tt>, if it wasn't. Skips any <tt>:autosave</tt>
|
319
321
|
# enabled records if they're marked_for_destruction? or destroyed.
|
320
|
-
def association_valid?(reflection, record)
|
322
|
+
def association_valid?(reflection, record, index = nil)
|
321
323
|
return true if record.destroyed? || (reflection.options[:autosave] && record.marked_for_destruction?)
|
322
324
|
|
323
|
-
|
324
|
-
|
325
|
+
context = validation_context if custom_validation_context?
|
326
|
+
|
327
|
+
unless valid = record.valid?(context)
|
325
328
|
if reflection.options[:autosave]
|
329
|
+
indexed_attribute = !index.nil? && (reflection.options[:index_errors] || ActiveRecord::Base.index_nested_attribute_errors)
|
330
|
+
|
326
331
|
record.errors.each do |attribute, message|
|
327
|
-
attribute =
|
332
|
+
attribute = normalize_reflection_attribute(indexed_attribute, reflection, index, attribute)
|
328
333
|
errors[attribute] << message
|
329
334
|
errors[attribute].uniq!
|
330
335
|
end
|
336
|
+
|
337
|
+
record.errors.details.each_key do |attribute|
|
338
|
+
reflection_attribute =
|
339
|
+
normalize_reflection_attribute(indexed_attribute, reflection, index, attribute).to_sym
|
340
|
+
|
341
|
+
record.errors.details[attribute].each do |error|
|
342
|
+
errors.details[reflection_attribute] << error
|
343
|
+
errors.details[reflection_attribute].uniq!
|
344
|
+
end
|
345
|
+
end
|
331
346
|
else
|
332
347
|
errors.add(reflection.name)
|
333
348
|
end
|
@@ -335,18 +350,29 @@ module ActiveRecord
|
|
335
350
|
valid
|
336
351
|
end
|
337
352
|
|
353
|
+
def normalize_reflection_attribute(indexed_attribute, reflection, index, attribute)
|
354
|
+
if indexed_attribute
|
355
|
+
"#{reflection.name}[#{index}].#{attribute}"
|
356
|
+
else
|
357
|
+
"#{reflection.name}.#{attribute}"
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
338
361
|
# Is used as a before_save callback to check while saving a collection
|
339
362
|
# association whether or not the parent was a new record before saving.
|
340
363
|
def before_save_collection_association
|
341
|
-
@new_record_before_save
|
342
|
-
|
364
|
+
@new_record_before_save ||= new_record?
|
365
|
+
end
|
366
|
+
|
367
|
+
def after_save_collection_association
|
368
|
+
@new_record_before_save = false
|
343
369
|
end
|
344
370
|
|
345
371
|
# Saves any new associated records, or all loaded autosave associations if
|
346
372
|
# <tt>:autosave</tt> is enabled on the association.
|
347
373
|
#
|
348
374
|
# In addition, it destroys all children that were marked for destruction
|
349
|
-
# with mark_for_destruction.
|
375
|
+
# with #mark_for_destruction.
|
350
376
|
#
|
351
377
|
# This all happens inside a transaction, _if_ the Transactions module is included into
|
352
378
|
# ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
|
@@ -354,7 +380,14 @@ module ActiveRecord
|
|
354
380
|
if association = association_instance_get(reflection.name)
|
355
381
|
autosave = reflection.options[:autosave]
|
356
382
|
|
357
|
-
|
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)
|
358
391
|
if autosave
|
359
392
|
records_to_destroy = records.select(&:marked_for_destruction?)
|
360
393
|
records_to_destroy.each { |record| association.destroy(record) }
|
@@ -366,22 +399,24 @@ module ActiveRecord
|
|
366
399
|
|
367
400
|
saved = true
|
368
401
|
|
369
|
-
if autosave != false && (
|
402
|
+
if autosave != false && (new_record_before_save || record.new_record?)
|
370
403
|
if autosave
|
371
404
|
saved = association.insert_record(record, false)
|
372
|
-
|
373
|
-
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
|
374
412
|
end
|
375
413
|
elsif autosave
|
376
|
-
saved = record.save(:
|
414
|
+
saved = record.save(validate: false)
|
377
415
|
end
|
378
416
|
|
379
|
-
raise
|
417
|
+
raise(RecordInvalid.new(association.owner)) unless saved
|
380
418
|
end
|
381
419
|
end
|
382
|
-
|
383
|
-
# reconstruct the scope now that we know the owner's id
|
384
|
-
association.reset_scope if association.respond_to?(:reset_scope)
|
385
420
|
end
|
386
421
|
end
|
387
422
|
|
@@ -389,7 +424,7 @@ module ActiveRecord
|
|
389
424
|
# on the association.
|
390
425
|
#
|
391
426
|
# In addition, it will destroy the association if it was marked for
|
392
|
-
# destruction with mark_for_destruction.
|
427
|
+
# destruction with #mark_for_destruction.
|
393
428
|
#
|
394
429
|
# This all happens inside a transaction, _if_ the Transactions module is included into
|
395
430
|
# ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
|
@@ -408,9 +443,12 @@ module ActiveRecord
|
|
408
443
|
if (autosave && record.changed_for_autosave?) || new_record? || record_changed?(reflection, record, key)
|
409
444
|
unless reflection.through_reflection
|
410
445
|
record[reflection.foreign_key] = key
|
446
|
+
if inverse_reflection = reflection.inverse_of
|
447
|
+
record.association(inverse_reflection.name).loaded!
|
448
|
+
end
|
411
449
|
end
|
412
450
|
|
413
|
-
saved = record.save(:
|
451
|
+
saved = record.save(validate: !autosave)
|
414
452
|
raise ActiveRecord::Rollback if !saved && autosave
|
415
453
|
saved
|
416
454
|
end
|
@@ -421,8 +459,14 @@ module ActiveRecord
|
|
421
459
|
# If the record is new or it has changed, returns true.
|
422
460
|
def record_changed?(reflection, record, key)
|
423
461
|
record.new_record? ||
|
424
|
-
|
425
|
-
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
|
426
470
|
end
|
427
471
|
|
428
472
|
# Saves the associated record if it's new or <tt>:autosave</tt> is enabled.
|
@@ -430,7 +474,9 @@ module ActiveRecord
|
|
430
474
|
# In addition, it will destroy the association if it was marked for destruction.
|
431
475
|
def save_belongs_to_association(reflection)
|
432
476
|
association = association_instance_get(reflection.name)
|
433
|
-
|
477
|
+
return unless association && association.loaded? && !association.stale_target?
|
478
|
+
|
479
|
+
record = association.load_target
|
434
480
|
if record && !record.destroyed?
|
435
481
|
autosave = reflection.options[:autosave]
|
436
482
|
|
@@ -438,7 +484,7 @@ module ActiveRecord
|
|
438
484
|
self[reflection.foreign_key] = nil
|
439
485
|
record.destroy
|
440
486
|
elsif autosave != false
|
441
|
-
saved = record.save(:
|
487
|
+
saved = record.save(validate: !autosave) if record.new_record? || (autosave && record.changed_for_autosave?)
|
442
488
|
|
443
489
|
if association.updated?
|
444
490
|
association_id = record.send(reflection.options[:primary_key] || :id)
|
@@ -450,5 +496,15 @@ module ActiveRecord
|
|
450
496
|
end
|
451
497
|
end
|
452
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
|
453
509
|
end
|
454
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
|
@@ -133,14 +134,11 @@ module ActiveRecord #:nodoc:
|
|
133
134
|
# end
|
134
135
|
# end
|
135
136
|
#
|
136
|
-
# You can alternatively use <tt>self[:attribute]=(value)</tt> and <tt>self[:attribute]</tt>
|
137
|
-
# or <tt>write_attribute(:attribute, value)</tt> and <tt>read_attribute(:attribute)</tt>.
|
138
|
-
#
|
139
137
|
# == Attribute query methods
|
140
138
|
#
|
141
139
|
# In addition to the basic accessors, query methods are also automatically available on the Active Record object.
|
142
140
|
# Query methods allow you to test whether an attribute value is present.
|
143
|
-
#
|
141
|
+
# Additionally, when dealing with numeric values, a query method will return false if the value is zero.
|
144
142
|
#
|
145
143
|
# For example, an Active Record User with the <tt>name</tt> attribute has a <tt>name?</tt> method that you can call
|
146
144
|
# to determine whether the user has a name:
|
@@ -171,10 +169,11 @@ module ActiveRecord #:nodoc:
|
|
171
169
|
# <tt>Person.find_by_user_name(user_name)</tt>.
|
172
170
|
#
|
173
171
|
# It's possible to add an exclamation point (!) on the end of the dynamic finders to get them to raise an
|
174
|
-
#
|
172
|
+
# ActiveRecord::RecordNotFound error if they do not return any records,
|
175
173
|
# like <tt>Person.find_by_last_name!</tt>.
|
176
174
|
#
|
177
|
-
# 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_".
|
178
177
|
#
|
179
178
|
# Person.find_by(user_name: user_name, password: password)
|
180
179
|
# Person.find_by_user_name_and_password(user_name, password) # with dynamic finder
|
@@ -186,7 +185,8 @@ module ActiveRecord #:nodoc:
|
|
186
185
|
# == Saving arrays, hashes, and other non-mappable objects in text columns
|
187
186
|
#
|
188
187
|
# Active Record can serialize any object in text columns using YAML. To do so, you must
|
189
|
-
# 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].
|
190
190
|
# This makes it possible to store arrays, hashes, and other non-mappable objects without doing
|
191
191
|
# any additional work.
|
192
192
|
#
|
@@ -226,39 +226,47 @@ module ActiveRecord #:nodoc:
|
|
226
226
|
#
|
227
227
|
# == Connection to multiple databases in different models
|
228
228
|
#
|
229
|
-
# Connections are usually created through
|
229
|
+
# Connections are usually created through
|
230
|
+
# {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection] and retrieved
|
230
231
|
# by ActiveRecord::Base.connection. All classes inheriting from ActiveRecord::Base will use this
|
231
232
|
# connection. But you can also set a class-specific connection. For example, if Course is an
|
232
233
|
# ActiveRecord::Base, but resides in a different database, you can just say <tt>Course.establish_connection</tt>
|
233
234
|
# and Course and all of its subclasses will use this connection instead.
|
234
235
|
#
|
235
236
|
# This feature is implemented by keeping a connection pool in ActiveRecord::Base that is
|
236
|
-
# 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
|
237
239
|
# will go up the class-hierarchy until a connection is found in the connection pool.
|
238
240
|
#
|
239
241
|
# == Exceptions
|
240
242
|
#
|
241
243
|
# * ActiveRecordError - Generic error class and superclass of all other errors raised by Active Record.
|
242
|
-
# * AdapterNotSpecified - The configuration hash used in
|
243
|
-
#
|
244
|
-
#
|
245
|
-
#
|
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
|
246
250
|
# (or a bad spelling of an existing one).
|
247
251
|
# * AssociationTypeMismatch - The object assigned to the association wasn't of the type
|
248
252
|
# specified in the association definition.
|
249
253
|
# * AttributeAssignmentError - An error occurred while doing a mass assignment through the
|
250
|
-
#
|
254
|
+
# {ActiveRecord::Base#attributes=}[rdoc-ref:AttributeAssignment#attributes=] method.
|
251
255
|
# You can inspect the +attribute+ property of the exception object to determine which attribute
|
252
256
|
# triggered the error.
|
253
|
-
# * ConnectionNotEstablished - No connection has been established.
|
254
|
-
# before querying.
|
257
|
+
# * ConnectionNotEstablished - No connection has been established.
|
258
|
+
# Use {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection] before querying.
|
255
259
|
# * MultiparameterAssignmentErrors - Collection of errors that occurred during a mass assignment using the
|
256
|
-
#
|
260
|
+
# {ActiveRecord::Base#attributes=}[rdoc-ref:AttributeAssignment#attributes=] method.
|
261
|
+
# The +errors+ property of this exception contains an array of
|
257
262
|
# AttributeAssignmentError
|
258
263
|
# objects that should be inspected to determine which attributes triggered the errors.
|
259
|
-
# * RecordInvalid - raised by save! and
|
260
|
-
#
|
261
|
-
#
|
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
|
262
270
|
# nothing was found, please check its documentation for further details.
|
263
271
|
# * SerializationTypeMismatch - The serialized object wasn't of the class specified as the second parameter.
|
264
272
|
# * StatementInvalid - The database server rejected the SQL statement. The precise error is added in the message.
|
@@ -280,6 +288,7 @@ module ActiveRecord #:nodoc:
|
|
280
288
|
extend Explain
|
281
289
|
extend Enum
|
282
290
|
extend Delegation::DelegateCache
|
291
|
+
extend Aggregations::ClassMethods
|
283
292
|
|
284
293
|
include Core
|
285
294
|
include Persistence
|
@@ -297,6 +306,7 @@ module ActiveRecord #:nodoc:
|
|
297
306
|
include AttributeDecorators
|
298
307
|
include Locking::Optimistic
|
299
308
|
include Locking::Pessimistic
|
309
|
+
include DefineCallbacks
|
300
310
|
include AttributeMethods
|
301
311
|
include Callbacks
|
302
312
|
include Timestamp
|
@@ -304,12 +314,14 @@ module ActiveRecord #:nodoc:
|
|
304
314
|
include ActiveModel::SecurePassword
|
305
315
|
include AutosaveAssociation
|
306
316
|
include NestedAttributes
|
307
|
-
include Aggregations
|
308
317
|
include Transactions
|
318
|
+
include TouchLater
|
309
319
|
include NoTouching
|
310
320
|
include Reflection
|
311
321
|
include Serialization
|
312
322
|
include Store
|
323
|
+
include SecureToken
|
324
|
+
include Suppressor
|
313
325
|
end
|
314
326
|
|
315
327
|
ActiveSupport.run_load_hooks(:active_record, Base)
|