activerecord 5.0.6 → 6.0.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 +638 -2023
- data/MIT-LICENSE +3 -1
- data/README.rdoc +8 -6
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record/aggregations.rb +249 -246
- data/lib/active_record/association_relation.rb +24 -13
- data/lib/active_record/associations/alias_tracker.rb +24 -33
- data/lib/active_record/associations/association.rb +119 -56
- data/lib/active_record/associations/association_scope.rb +94 -94
- data/lib/active_record/associations/belongs_to_association.rb +58 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +18 -25
- data/lib/active_record/associations/builder/belongs_to.rb +43 -54
- data/lib/active_record/associations/builder/collection_association.rb +7 -18
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +42 -61
- data/lib/active_record/associations/builder/has_many.rb +4 -0
- data/lib/active_record/associations/builder/has_one.rb +37 -1
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +80 -252
- data/lib/active_record/associations/collection_proxy.rb +158 -121
- data/lib/active_record/associations/foreign_association.rb +9 -0
- data/lib/active_record/associations/has_many_association.rb +23 -29
- data/lib/active_record/associations/has_many_through_association.rb +58 -44
- data/lib/active_record/associations/has_one_association.rb +59 -54
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +38 -90
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +12 -12
- data/lib/active_record/associations/join_dependency.rb +134 -176
- data/lib/active_record/associations/preloader/association.rb +84 -125
- data/lib/active_record/associations/preloader/through_association.rb +82 -75
- data/lib/active_record/associations/preloader.rb +90 -102
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +26 -14
- data/lib/active_record/associations.rb +1603 -1592
- data/lib/active_record/attribute_assignment.rb +54 -60
- data/lib/active_record/attribute_decorators.rb +38 -15
- data/lib/active_record/attribute_methods/before_type_cast.rb +12 -7
- data/lib/active_record/attribute_methods/dirty.rb +179 -109
- data/lib/active_record/attribute_methods/primary_key.rb +86 -91
- data/lib/active_record/attribute_methods/query.rb +4 -3
- data/lib/active_record/attribute_methods/read.rb +21 -49
- data/lib/active_record/attribute_methods/serialization.rb +30 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -64
- data/lib/active_record/attribute_methods/write.rb +35 -33
- data/lib/active_record/attribute_methods.rb +66 -106
- data/lib/active_record/attributes.rb +38 -24
- data/lib/active_record/autosave_association.rb +53 -32
- data/lib/active_record/base.rb +27 -24
- data/lib/active_record/callbacks.rb +63 -33
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +11 -11
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +553 -321
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +213 -94
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -28
- data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -75
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -27
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +207 -126
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +369 -199
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -78
- data/lib/active_record/connection_adapters/abstract_adapter.rb +363 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +405 -551
- data/lib/active_record/connection_adapters/column.rb +41 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +172 -138
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +143 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -22
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +50 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +49 -30
- data/lib/active_record/connection_adapters/postgresql/column.rb +22 -7
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +60 -54
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -10
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -17
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +31 -9
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +34 -30
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +35 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +380 -300
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
- data/lib/active_record/connection_adapters/postgresql/utils.rb +10 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +382 -275
- data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +74 -19
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +254 -262
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -7
- data/lib/active_record/connection_handling.rb +159 -40
- data/lib/active_record/core.rb +202 -162
- data/lib/active_record/counter_cache.rb +57 -28
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +79 -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 -86
- data/lib/active_record/enum.rb +60 -23
- data/lib/active_record/errors.rb +114 -18
- data/lib/active_record/explain.rb +4 -3
- data/lib/active_record/explain_registry.rb +3 -1
- data/lib/active_record/explain_subscriber.rb +9 -4
- data/lib/active_record/fixture_set/file.rb +13 -8
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +153 -0
- data/lib/active_record/fixture_set/table_rows.rb +47 -0
- data/lib/active_record/fixtures.rb +195 -502
- data/lib/active_record/gem_version.rb +4 -2
- data/lib/active_record/inheritance.rb +151 -97
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +116 -25
- data/lib/active_record/internal_metadata.rb +15 -18
- data/lib/active_record/legacy_yaml_adapter.rb +4 -2
- data/lib/active_record/locking/optimistic.rb +78 -87
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +48 -29
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
- data/lib/active_record/middleware/database_selector.rb +75 -0
- data/lib/active_record/migration/command_recorder.rb +143 -97
- data/lib/active_record/migration/compatibility.rb +174 -56
- data/lib/active_record/migration/join_table.rb +8 -6
- data/lib/active_record/migration.rb +367 -300
- data/lib/active_record/model_schema.rb +145 -139
- data/lib/active_record/nested_attributes.rb +214 -201
- data/lib/active_record/no_touching.rb +10 -1
- data/lib/active_record/null_relation.rb +13 -34
- data/lib/active_record/persistence.rb +442 -72
- data/lib/active_record/query_cache.rb +15 -14
- data/lib/active_record/querying.rb +36 -23
- data/lib/active_record/railtie.rb +128 -36
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +309 -177
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +211 -249
- data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
- data/lib/active_record/relation/batches.rb +99 -52
- data/lib/active_record/relation/calculations.rb +211 -172
- data/lib/active_record/relation/delegation.rb +67 -65
- data/lib/active_record/relation/finder_methods.rb +208 -247
- data/lib/active_record/relation/from_clause.rb +2 -8
- data/lib/active_record/relation/merger.rb +78 -61
- data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/predicate_builder.rb +86 -104
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +458 -329
- data/lib/active_record/relation/record_fetch_warning.rb +5 -3
- data/lib/active_record/relation/spawn_methods.rb +8 -7
- data/lib/active_record/relation/where_clause.rb +111 -95
- data/lib/active_record/relation/where_clause_factory.rb +6 -11
- data/lib/active_record/relation.rb +429 -318
- data/lib/active_record/result.rb +69 -39
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +83 -99
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +71 -69
- data/lib/active_record/schema_migration.rb +15 -5
- data/lib/active_record/scoping/default.rb +93 -95
- data/lib/active_record/scoping/named.rb +45 -25
- data/lib/active_record/scoping.rb +20 -19
- data/lib/active_record/secure_token.rb +4 -2
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +63 -28
- data/lib/active_record/store.rb +121 -41
- data/lib/active_record/suppressor.rb +4 -1
- data/lib/active_record/table_metadata.rb +26 -20
- data/lib/active_record/tasks/database_tasks.rb +276 -85
- data/lib/active_record/tasks/mysql_database_tasks.rb +54 -90
- data/lib/active_record/tasks/postgresql_database_tasks.rb +78 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +34 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +224 -0
- data/lib/active_record/timestamp.rb +70 -35
- data/lib/active_record/touch_later.rb +7 -4
- data/lib/active_record/transactions.rb +133 -149
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +44 -45
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -3
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +16 -8
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +2 -1
- data/lib/active_record/type/type_map.rb +13 -15
- data/lib/active_record/type/unsigned_integer.rb +17 -0
- data/lib/active_record/type.rb +23 -17
- data/lib/active_record/type_caster/connection.rb +17 -12
- data/lib/active_record/type_caster/map.rb +5 -4
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +3 -1
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +29 -42
- data/lib/active_record/validations.rb +7 -4
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +36 -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 +257 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/depth_first.rb +204 -0
- data/lib/arel/visitors/dot.rb +297 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +157 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +159 -0
- data/lib/arel/visitors/oracle12.rb +66 -0
- data/lib/arel/visitors/postgresql.rb +110 -0
- data/lib/arel/visitors/sqlite.rb +39 -0
- data/lib/arel/visitors/to_sql.rb +889 -0
- data/lib/arel/visitors/visitor.rb +46 -0
- data/lib/arel/visitors/where_sql.rb +23 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +58 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
- data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
- data/lib/rails/generators/active_record/migration.rb +17 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -29
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +133 -50
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -20
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set/builder.rb +0 -130
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
# See ActiveRecord::Transactions::ClassMethods for documentation.
|
3
5
|
module Transactions
|
@@ -11,7 +13,6 @@ module ActiveRecord
|
|
11
13
|
:before_commit_without_transaction_enrollment,
|
12
14
|
:commit_without_transaction_enrollment,
|
13
15
|
:rollback_without_transaction_enrollment,
|
14
|
-
terminator: deprecated_false_terminator,
|
15
16
|
scope: [:kind, :name]
|
16
17
|
end
|
17
18
|
|
@@ -169,7 +170,7 @@ module ActiveRecord
|
|
169
170
|
# writing, the only database that we're aware of that supports true nested
|
170
171
|
# transactions, is MS-SQL. Because of this, Active Record emulates nested
|
171
172
|
# transactions by using savepoints on MySQL and PostgreSQL. See
|
172
|
-
#
|
173
|
+
# https://dev.mysql.com/doc/refman/5.7/en/savepoint.html
|
173
174
|
# for more information about savepoints.
|
174
175
|
#
|
175
176
|
# === \Callbacks
|
@@ -189,8 +190,8 @@ module ActiveRecord
|
|
189
190
|
#
|
190
191
|
# === Caveats
|
191
192
|
#
|
192
|
-
# If you're on MySQL, then do not use DDL operations in nested
|
193
|
-
# blocks that are emulated with savepoints. That is, do not execute statements
|
193
|
+
# If you're on MySQL, then do not use Data Definition Language (DDL) operations in nested
|
194
|
+
# transactions blocks that are emulated with savepoints. That is, do not execute statements
|
194
195
|
# like 'CREATE TABLE' inside such blocks. This is because MySQL automatically
|
195
196
|
# releases all savepoints upon executing a DDL operation. When +transaction+
|
196
197
|
# is finished and tries to release the savepoint it created earlier, a
|
@@ -233,6 +234,12 @@ module ActiveRecord
|
|
233
234
|
set_callback(:commit, :after, *args, &block)
|
234
235
|
end
|
235
236
|
|
237
|
+
# Shortcut for <tt>after_commit :hook, on: [ :create, :update ]</tt>.
|
238
|
+
def after_save_commit(*args, &block)
|
239
|
+
set_options_for_callbacks!(args, on: [ :create, :update ])
|
240
|
+
set_callback(:commit, :after, *args, &block)
|
241
|
+
end
|
242
|
+
|
236
243
|
# Shortcut for <tt>after_commit :hook, on: :create</tt>.
|
237
244
|
def after_create_commit(*args, &block)
|
238
245
|
set_options_for_callbacks!(args, on: :create)
|
@@ -274,35 +281,25 @@ module ActiveRecord
|
|
274
281
|
set_callback(:rollback_without_transaction_enrollment, :after, *args, &block)
|
275
282
|
end
|
276
283
|
|
277
|
-
def raise_in_transactional_callbacks
|
278
|
-
ActiveSupport::Deprecation.warn('ActiveRecord::Base.raise_in_transactional_callbacks is deprecated and will be removed without replacement.')
|
279
|
-
true
|
280
|
-
end
|
281
|
-
|
282
|
-
def raise_in_transactional_callbacks=(value)
|
283
|
-
ActiveSupport::Deprecation.warn('ActiveRecord::Base.raise_in_transactional_callbacks= is deprecated, has no effect and will be removed without replacement.')
|
284
|
-
value
|
285
|
-
end
|
286
|
-
|
287
284
|
private
|
288
285
|
|
289
|
-
|
290
|
-
|
291
|
-
|
286
|
+
def set_options_for_callbacks!(args, enforced_options = {})
|
287
|
+
options = args.extract_options!.merge!(enforced_options)
|
288
|
+
args << options
|
292
289
|
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
290
|
+
if options[:on]
|
291
|
+
fire_on = Array(options[:on])
|
292
|
+
assert_valid_transaction_action(fire_on)
|
293
|
+
options[:if] = Array(options[:if])
|
294
|
+
options[:if].unshift(-> { transaction_include_any_action?(fire_on) })
|
295
|
+
end
|
298
296
|
end
|
299
|
-
end
|
300
297
|
|
301
|
-
|
302
|
-
|
303
|
-
|
298
|
+
def assert_valid_transaction_action(actions)
|
299
|
+
if (actions - ACTIONS).any?
|
300
|
+
raise ArgumentError, ":on conditions for after_commit and after_rollback callbacks have to be one of #{ACTIONS}"
|
301
|
+
end
|
304
302
|
end
|
305
|
-
end
|
306
303
|
end
|
307
304
|
|
308
305
|
# See ActiveRecord::Transactions::ClassMethods for detailed documentation.
|
@@ -315,9 +312,7 @@ module ActiveRecord
|
|
315
312
|
end
|
316
313
|
|
317
314
|
def save(*) #:nodoc:
|
318
|
-
|
319
|
-
with_transaction_returning_status { super }
|
320
|
-
end
|
315
|
+
with_transaction_returning_status { super }
|
321
316
|
end
|
322
317
|
|
323
318
|
def save!(*) #:nodoc:
|
@@ -328,17 +323,6 @@ module ActiveRecord
|
|
328
323
|
with_transaction_returning_status { super }
|
329
324
|
end
|
330
325
|
|
331
|
-
# Reset id and @new_record if the transaction rolls back.
|
332
|
-
def rollback_active_record_state!
|
333
|
-
remember_transaction_record_state
|
334
|
-
yield
|
335
|
-
rescue Exception
|
336
|
-
restore_transaction_record_state
|
337
|
-
raise
|
338
|
-
ensure
|
339
|
-
clear_transaction_record_state
|
340
|
-
end
|
341
|
-
|
342
326
|
def before_committed! # :nodoc:
|
343
327
|
_run_before_commit_without_transaction_enrollment_callbacks
|
344
328
|
_run_before_commit_callbacks
|
@@ -349,12 +333,14 @@ module ActiveRecord
|
|
349
333
|
# Ensure that it is not called if the object was never persisted (failed create),
|
350
334
|
# but call it after the commit of a destroyed object.
|
351
335
|
def committed!(should_run_callbacks: true) #:nodoc:
|
352
|
-
|
336
|
+
force_clear_transaction_record_state
|
337
|
+
if should_run_callbacks
|
338
|
+
@_committed_already_called = true
|
353
339
|
_run_commit_without_transaction_enrollment_callbacks
|
354
340
|
_run_commit_callbacks
|
355
341
|
end
|
356
342
|
ensure
|
357
|
-
|
343
|
+
@_committed_already_called = false
|
358
344
|
end
|
359
345
|
|
360
346
|
# Call the #after_rollback callbacks. The +force_restore_state+ argument indicates if the record
|
@@ -369,18 +355,6 @@ module ActiveRecord
|
|
369
355
|
clear_transaction_record_state
|
370
356
|
end
|
371
357
|
|
372
|
-
# Add the record to the current transaction so that the #after_rollback and #after_commit callbacks
|
373
|
-
# can be called.
|
374
|
-
def add_to_transaction
|
375
|
-
if has_transactional_callbacks?
|
376
|
-
self.class.connection.add_transaction_record(self)
|
377
|
-
else
|
378
|
-
sync_with_transaction_state
|
379
|
-
set_transaction_state(self.class.connection.transaction_state)
|
380
|
-
end
|
381
|
-
remember_transaction_record_state
|
382
|
-
end
|
383
|
-
|
384
358
|
# Executes +method+ within a transaction and captures its return value as a
|
385
359
|
# status flag. If the status is true the transaction is committed, otherwise
|
386
360
|
# a ROLLBACK is issued. In any case the status flag is returned.
|
@@ -390,120 +364,130 @@ module ActiveRecord
|
|
390
364
|
def with_transaction_returning_status
|
391
365
|
status = nil
|
392
366
|
self.class.transaction do
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
status = nil
|
367
|
+
if has_transactional_callbacks?
|
368
|
+
add_to_transaction
|
369
|
+
else
|
370
|
+
sync_with_transaction_state if @transaction_state&.finalized?
|
371
|
+
@transaction_state = self.class.connection.transaction_state
|
399
372
|
end
|
373
|
+
remember_transaction_record_state
|
400
374
|
|
375
|
+
status = yield
|
401
376
|
raise ActiveRecord::Rollback unless status
|
402
377
|
end
|
403
378
|
status
|
404
|
-
ensure
|
405
|
-
if @transaction_state && @transaction_state.committed?
|
406
|
-
clear_transaction_record_state
|
407
|
-
end
|
408
379
|
end
|
409
380
|
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
def remember_transaction_record_state #:nodoc:
|
414
|
-
@_start_transaction_state[:id] = id
|
415
|
-
@_start_transaction_state.reverse_merge!(
|
416
|
-
new_record: @new_record,
|
417
|
-
destroyed: @destroyed,
|
418
|
-
frozen?: frozen?,
|
419
|
-
)
|
420
|
-
@_start_transaction_state[:level] = (@_start_transaction_state[:level] || 0) + 1
|
381
|
+
def trigger_transactional_callbacks? # :nodoc:
|
382
|
+
(@_new_record_before_last_commit || _trigger_update_callback) && persisted? ||
|
383
|
+
_trigger_destroy_callback && destroyed?
|
421
384
|
end
|
422
385
|
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
386
|
+
private
|
387
|
+
attr_reader :_committed_already_called, :_trigger_update_callback, :_trigger_destroy_callback
|
388
|
+
|
389
|
+
# Save the new record state and id of a record so it can be restored later if a transaction fails.
|
390
|
+
def remember_transaction_record_state
|
391
|
+
@_start_transaction_state ||= {
|
392
|
+
id: id,
|
393
|
+
new_record: @new_record,
|
394
|
+
destroyed: @destroyed,
|
395
|
+
attributes: @attributes,
|
396
|
+
frozen?: frozen?,
|
397
|
+
level: 0
|
398
|
+
}
|
399
|
+
@_start_transaction_state[:level] += 1
|
400
|
+
|
401
|
+
if _committed_already_called
|
402
|
+
@_new_record_before_last_commit = false
|
403
|
+
else
|
404
|
+
@_new_record_before_last_commit = @_start_transaction_state[:new_record]
|
405
|
+
end
|
406
|
+
end
|
428
407
|
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
408
|
+
# Clear the new record state and id of a record.
|
409
|
+
def clear_transaction_record_state
|
410
|
+
return unless @_start_transaction_state
|
411
|
+
@_start_transaction_state[:level] -= 1
|
412
|
+
force_clear_transaction_record_state if @_start_transaction_state[:level] < 1
|
413
|
+
end
|
414
|
+
|
415
|
+
# Force to clear the transaction record state.
|
416
|
+
def force_clear_transaction_record_state
|
417
|
+
@_start_transaction_state = nil
|
418
|
+
@transaction_state = nil
|
419
|
+
end
|
433
420
|
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
421
|
+
# Restore the new record state and id of a record that was previously saved by a call to save_record_state.
|
422
|
+
def restore_transaction_record_state(force_restore_state = false)
|
423
|
+
if restore_state = @_start_transaction_state
|
424
|
+
if force_restore_state || restore_state[:level] <= 1
|
425
|
+
@new_record = restore_state[:new_record]
|
426
|
+
@destroyed = restore_state[:destroyed]
|
427
|
+
@attributes = restore_state[:attributes].map do |attr|
|
428
|
+
value = @attributes.fetch_value(attr.name)
|
429
|
+
attr = attr.with_value_from_user(value) if attr.value != value
|
430
|
+
attr
|
431
|
+
end
|
432
|
+
@mutations_from_database = nil
|
433
|
+
@mutations_before_last_save = nil
|
434
|
+
if @attributes.fetch_value(@primary_key) != restore_state[:id]
|
435
|
+
@attributes.write_from_user(@primary_key, restore_state[:id])
|
436
|
+
end
|
437
|
+
freeze if restore_state[:frozen?]
|
446
438
|
end
|
447
|
-
freeze if restore_state[:frozen?]
|
448
439
|
end
|
449
440
|
end
|
450
|
-
end
|
451
|
-
|
452
|
-
# Determine if a record was created or destroyed in a transaction. State should be one of :new_record or :destroyed.
|
453
|
-
def transaction_record_state(state) #:nodoc:
|
454
|
-
@_start_transaction_state[state]
|
455
|
-
end
|
456
441
|
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
442
|
+
# Determine if a transaction included an action for :create, :update, or :destroy. Used in filtering callbacks.
|
443
|
+
def transaction_include_any_action?(actions)
|
444
|
+
actions.any? do |action|
|
445
|
+
case action
|
446
|
+
when :create
|
447
|
+
persisted? && @_new_record_before_last_commit
|
448
|
+
when :update
|
449
|
+
!(@_new_record_before_last_commit || destroyed?) && _trigger_update_callback
|
450
|
+
when :destroy
|
451
|
+
_trigger_destroy_callback
|
452
|
+
end
|
467
453
|
end
|
468
454
|
end
|
469
|
-
end
|
470
455
|
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
def has_transactional_callbacks? # :nodoc:
|
478
|
-
!_rollback_callbacks.empty? || !_commit_callbacks.empty? || !_before_commit_callbacks.empty?
|
479
|
-
end
|
456
|
+
# Add the record to the current transaction so that the #after_rollback and #after_commit
|
457
|
+
# callbacks can be called.
|
458
|
+
def add_to_transaction
|
459
|
+
self.class.connection.add_transaction_record(self)
|
460
|
+
end
|
480
461
|
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
#
|
485
|
-
# The +@transaction_state+ variable stores the states of the associated
|
486
|
-
# transaction. This relies on the fact that a transaction can only be in
|
487
|
-
# one rollback or commit (otherwise a list of states would be required)
|
488
|
-
# Each Active Record object inside of a transaction carries that transaction's
|
489
|
-
# TransactionState.
|
490
|
-
#
|
491
|
-
# This method checks to see if the ActiveRecord object's state reflects
|
492
|
-
# the TransactionState, and rolls back or commits the Active Record object
|
493
|
-
# as appropriate.
|
494
|
-
#
|
495
|
-
# Since Active Record objects can be inside multiple transactions, this
|
496
|
-
# method recursively goes through the parent of the TransactionState and
|
497
|
-
# checks if the Active Record object reflects the state of the object.
|
498
|
-
def sync_with_transaction_state
|
499
|
-
update_attributes_from_transaction_state(@transaction_state)
|
500
|
-
end
|
462
|
+
def has_transactional_callbacks?
|
463
|
+
!_rollback_callbacks.empty? || !_commit_callbacks.empty? || !_before_commit_callbacks.empty?
|
464
|
+
end
|
501
465
|
|
502
|
-
|
503
|
-
if
|
504
|
-
|
505
|
-
|
466
|
+
# Updates the attributes on this particular Active Record object so that
|
467
|
+
# if it's associated with a transaction, then the state of the Active Record
|
468
|
+
# object will be updated to reflect the current state of the transaction.
|
469
|
+
#
|
470
|
+
# The <tt>@transaction_state</tt> variable stores the states of the associated
|
471
|
+
# transaction. This relies on the fact that a transaction can only be in
|
472
|
+
# one rollback or commit (otherwise a list of states would be required).
|
473
|
+
# Each Active Record object inside of a transaction carries that transaction's
|
474
|
+
# TransactionState.
|
475
|
+
#
|
476
|
+
# This method checks to see if the ActiveRecord object's state reflects
|
477
|
+
# the TransactionState, and rolls back or commits the Active Record object
|
478
|
+
# as appropriate.
|
479
|
+
def sync_with_transaction_state
|
480
|
+
if transaction_state = @transaction_state
|
481
|
+
if transaction_state.fully_committed?
|
482
|
+
force_clear_transaction_record_state
|
483
|
+
elsif transaction_state.committed?
|
484
|
+
clear_transaction_record_state
|
485
|
+
elsif transaction_state.rolledback?
|
486
|
+
force_restore_state = transaction_state.fully_rolledback?
|
487
|
+
restore_transaction_record_state(force_restore_state)
|
488
|
+
clear_transaction_record_state
|
489
|
+
end
|
490
|
+
end
|
506
491
|
end
|
507
|
-
end
|
508
492
|
end
|
509
493
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Translation
|
3
5
|
include ActiveModel::Translation
|
@@ -8,7 +10,7 @@ module ActiveRecord
|
|
8
10
|
classes = [klass]
|
9
11
|
return classes if klass == ActiveRecord::Base
|
10
12
|
|
11
|
-
while klass
|
13
|
+
while !klass.base_class?
|
12
14
|
classes << klass = klass.superclass
|
13
15
|
end
|
14
16
|
classes
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_model/type/registry"
|
2
4
|
|
3
5
|
module ActiveRecord
|
4
6
|
# :stopdoc:
|
@@ -10,15 +12,15 @@ module ActiveRecord
|
|
10
12
|
|
11
13
|
private
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
15
|
+
def registration_klass
|
16
|
+
Registration
|
17
|
+
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
def find_registration(symbol, *args)
|
20
|
+
registrations
|
21
|
+
.select { |registration| registration.matches?(symbol, *args) }
|
22
|
+
.max
|
23
|
+
end
|
22
24
|
end
|
23
25
|
|
24
26
|
class Registration
|
@@ -52,42 +54,42 @@ module ActiveRecord
|
|
52
54
|
|
53
55
|
protected
|
54
56
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
57
|
+
attr_reader :name, :block, :adapter, :override
|
58
|
+
|
59
|
+
def priority
|
60
|
+
result = 0
|
61
|
+
if adapter
|
62
|
+
result |= 1
|
63
|
+
end
|
64
|
+
if override
|
65
|
+
result |= 2
|
66
|
+
end
|
67
|
+
result
|
64
68
|
end
|
65
|
-
result
|
66
|
-
end
|
67
69
|
|
68
|
-
|
69
|
-
|
70
|
-
|
70
|
+
def priority_except_adapter
|
71
|
+
priority & 0b111111100
|
72
|
+
end
|
71
73
|
|
72
74
|
private
|
73
75
|
|
74
|
-
|
75
|
-
|
76
|
-
|
76
|
+
def matches_adapter?(adapter: nil, **)
|
77
|
+
(self.adapter.nil? || adapter == self.adapter)
|
78
|
+
end
|
77
79
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
80
|
+
def conflicts_with?(other)
|
81
|
+
same_priority_except_adapter?(other) &&
|
82
|
+
has_adapter_conflict?(other)
|
83
|
+
end
|
82
84
|
|
83
|
-
|
84
|
-
|
85
|
-
|
85
|
+
def same_priority_except_adapter?(other)
|
86
|
+
priority_except_adapter == other.priority_except_adapter
|
87
|
+
end
|
86
88
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
89
|
+
def has_adapter_conflict?(other)
|
90
|
+
(override.nil? && other.adapter) ||
|
91
|
+
(adapter && other.override.nil?)
|
92
|
+
end
|
91
93
|
end
|
92
94
|
|
93
95
|
class DecorationRegistration < Registration
|
@@ -110,17 +112,14 @@ module ActiveRecord
|
|
110
112
|
super | 4
|
111
113
|
end
|
112
114
|
|
113
|
-
protected
|
114
|
-
|
115
|
-
attr_reader :options, :klass
|
116
|
-
|
117
115
|
private
|
116
|
+
attr_reader :options, :klass
|
118
117
|
|
119
|
-
|
120
|
-
|
121
|
-
|
118
|
+
def matches_options?(**kwargs)
|
119
|
+
options.all? do |key, value|
|
120
|
+
kwargs[key] == value
|
121
|
+
end
|
122
122
|
end
|
123
|
-
end
|
124
123
|
end
|
125
124
|
end
|
126
125
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Type
|
5
|
+
class DecimalWithoutScale < ActiveModel::Type::BigInteger # :nodoc:
|
6
|
+
def type
|
7
|
+
:decimal
|
8
|
+
end
|
9
|
+
|
10
|
+
def type_cast_for_schema(value)
|
11
|
+
value.to_s.inspect
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Type
|
3
5
|
class HashLookupTypeMap < TypeMap # :nodoc:
|
@@ -15,9 +17,9 @@ module ActiveRecord
|
|
15
17
|
|
16
18
|
private
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
def perform_fetch(type, *args, &block)
|
21
|
+
@mapping.fetch(type, block).call(type, *args)
|
22
|
+
end
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Type
|
5
|
+
class Json < ActiveModel::Type::Value
|
6
|
+
include ActiveModel::Type::Helpers::Mutable
|
7
|
+
|
8
|
+
def type
|
9
|
+
:json
|
10
|
+
end
|
11
|
+
|
12
|
+
def deserialize(value)
|
13
|
+
return value unless value.is_a?(::String)
|
14
|
+
ActiveSupport::JSON.decode(value) rescue nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def serialize(value)
|
18
|
+
ActiveSupport::JSON.encode(value) unless value.nil?
|
19
|
+
end
|
20
|
+
|
21
|
+
def changed_in_place?(raw_old_value, new_value)
|
22
|
+
deserialize(raw_old_value) != new_value
|
23
|
+
end
|
24
|
+
|
25
|
+
def accessor
|
26
|
+
ActiveRecord::Store::StringKeyedHashAccessor
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,6 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Type
|
3
5
|
class Serialized < DelegateClass(ActiveModel::Type::Value) # :nodoc:
|
6
|
+
undef to_yaml if method_defined?(:to_yaml)
|
7
|
+
|
4
8
|
include ActiveModel::Type::Helpers::Mutable
|
5
9
|
|
6
10
|
attr_reader :subtype, :coder
|
@@ -43,21 +47,25 @@ module ActiveRecord
|
|
43
47
|
|
44
48
|
def assert_valid_value(value)
|
45
49
|
if coder.respond_to?(:assert_valid_value)
|
46
|
-
coder.assert_valid_value(value)
|
50
|
+
coder.assert_valid_value(value, action: "serialize")
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
54
|
+
def force_equality?(value)
|
55
|
+
coder.respond_to?(:object_class) && value.is_a?(coder.object_class)
|
56
|
+
end
|
57
|
+
|
50
58
|
private
|
51
59
|
|
52
|
-
|
53
|
-
|
54
|
-
|
60
|
+
def default_value?(value)
|
61
|
+
value == coder.load(nil)
|
62
|
+
end
|
55
63
|
|
56
|
-
|
57
|
-
|
58
|
-
|
64
|
+
def encoded(value)
|
65
|
+
unless default_value?(value)
|
66
|
+
coder.dump(value)
|
67
|
+
end
|
59
68
|
end
|
60
|
-
end
|
61
69
|
end
|
62
70
|
end
|
63
71
|
end
|