activerecord 5.0.7.2 → 6.0.6.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +844 -1944
- data/MIT-LICENSE +3 -1
- data/README.rdoc +9 -7
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +249 -247
- data/lib/active_record/association_relation.rb +18 -14
- data/lib/active_record/associations/alias_tracker.rb +24 -34
- data/lib/active_record/associations/association.rb +113 -55
- data/lib/active_record/associations/association_scope.rb +102 -96
- data/lib/active_record/associations/belongs_to_association.rb +58 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +18 -25
- data/lib/active_record/associations/builder/belongs_to.rb +43 -54
- data/lib/active_record/associations/builder/collection_association.rb +7 -18
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
- data/lib/active_record/associations/builder/has_many.rb +4 -0
- data/lib/active_record/associations/builder/has_one.rb +37 -1
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +93 -254
- data/lib/active_record/associations/collection_proxy.rb +159 -122
- data/lib/active_record/associations/foreign_association.rb +9 -0
- data/lib/active_record/associations/has_many_association.rb +23 -30
- data/lib/active_record/associations/has_many_through_association.rb +58 -44
- data/lib/active_record/associations/has_one_association.rb +59 -54
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +43 -85
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
- data/lib/active_record/associations/join_dependency.rb +152 -177
- data/lib/active_record/associations/preloader/association.rb +101 -97
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/preloader.rb +94 -103
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +27 -15
- data/lib/active_record/associations.rb +1603 -1592
- data/lib/active_record/attribute_assignment.rb +54 -61
- data/lib/active_record/attribute_decorators.rb +38 -17
- data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
- data/lib/active_record/attribute_methods/dirty.rb +179 -109
- data/lib/active_record/attribute_methods/primary_key.rb +85 -92
- data/lib/active_record/attribute_methods/query.rb +4 -3
- data/lib/active_record/attribute_methods/read.rb +20 -49
- data/lib/active_record/attribute_methods/serialization.rb +29 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
- data/lib/active_record/attribute_methods/write.rb +34 -33
- data/lib/active_record/attribute_methods.rb +66 -106
- data/lib/active_record/attributes.rb +38 -25
- data/lib/active_record/autosave_association.rb +58 -39
- data/lib/active_record/base.rb +27 -24
- data/lib/active_record/callbacks.rb +64 -35
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +34 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -323
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +128 -75
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +233 -147
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
- data/lib/active_record/connection_adapters/abstract_adapter.rb +373 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -562
- data/lib/active_record/connection_adapters/column.rb +41 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
- data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +12 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
- data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +261 -267
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
- data/lib/active_record/connection_handling.rb +143 -40
- data/lib/active_record/core.rb +207 -160
- data/lib/active_record/counter_cache.rb +60 -28
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/database_configurations.rb +233 -0
- data/lib/active_record/define_callbacks.rb +22 -0
- data/lib/active_record/dynamic_matchers.rb +87 -87
- data/lib/active_record/enum.rb +67 -23
- data/lib/active_record/errors.rb +114 -18
- data/lib/active_record/explain.rb +4 -4
- data/lib/active_record/explain_registry.rb +3 -1
- data/lib/active_record/explain_subscriber.rb +9 -4
- data/lib/active_record/fixture_set/file.rb +13 -8
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +194 -504
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +150 -99
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +116 -25
- data/lib/active_record/internal_metadata.rb +16 -19
- data/lib/active_record/legacy_yaml_adapter.rb +4 -2
- data/lib/active_record/locking/optimistic.rb +85 -86
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +48 -29
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
- data/lib/active_record/middleware/database_selector.rb +74 -0
- data/lib/active_record/migration/command_recorder.rb +134 -100
- data/lib/active_record/migration/compatibility.rb +174 -56
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +369 -302
- data/lib/active_record/model_schema.rb +160 -127
- data/lib/active_record/nested_attributes.rb +213 -202
- data/lib/active_record/no_touching.rb +12 -3
- data/lib/active_record/null_relation.rb +12 -34
- data/lib/active_record/persistence.rb +446 -77
- data/lib/active_record/query_cache.rb +13 -12
- data/lib/active_record/querying.rb +37 -24
- data/lib/active_record/railtie.rb +128 -36
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +312 -177
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +214 -254
- data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
- data/lib/active_record/relation/batches.rb +98 -52
- data/lib/active_record/relation/calculations.rb +212 -173
- data/lib/active_record/relation/delegation.rb +73 -69
- data/lib/active_record/relation/finder_methods.rb +207 -247
- data/lib/active_record/relation/from_clause.rb +6 -8
- data/lib/active_record/relation/merger.rb +82 -61
- data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/predicate_builder.rb +83 -105
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +488 -332
- data/lib/active_record/relation/record_fetch_warning.rb +5 -3
- data/lib/active_record/relation/spawn_methods.rb +8 -8
- data/lib/active_record/relation/where_clause.rb +111 -96
- data/lib/active_record/relation/where_clause_factory.rb +6 -11
- data/lib/active_record/relation.rb +443 -318
- data/lib/active_record/result.rb +69 -40
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +83 -99
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +71 -69
- data/lib/active_record/schema_migration.rb +16 -6
- data/lib/active_record/scoping/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +51 -26
- data/lib/active_record/scoping.rb +20 -20
- data/lib/active_record/secure_token.rb +4 -2
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +63 -28
- data/lib/active_record/store.rb +121 -41
- data/lib/active_record/suppressor.rb +6 -3
- data/lib/active_record/table_metadata.rb +39 -18
- data/lib/active_record/tasks/database_tasks.rb +271 -81
- data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
- data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +243 -0
- data/lib/active_record/timestamp.rb +70 -36
- data/lib/active_record/touch_later.rb +8 -6
- data/lib/active_record/transactions.rb +141 -157
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +44 -48
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +16 -9
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +12 -1
- data/lib/active_record/type/type_map.rb +14 -17
- data/lib/active_record/type/unsigned_integer.rb +16 -0
- data/lib/active_record/type.rb +23 -18
- data/lib/active_record/type_caster/connection.rb +17 -12
- data/lib/active_record/type_caster/map.rb +5 -4
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +3 -2
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +29 -42
- data/lib/active_record/validations.rb +7 -5
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +37 -22
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/attributes.rb +22 -0
- data/lib/arel/collectors/bind.rb +24 -0
- data/lib/arel/collectors/composite.rb +31 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +20 -0
- data/lib/arel/collectors/substitute_binds.rb +28 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +52 -0
- data/lib/arel/nodes/bind_param.rb +36 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +50 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +18 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +8 -0
- data/lib/arel/nodes/in.rb +8 -0
- data/lib/arel/nodes/infix_operation.rb +80 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +50 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +16 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +27 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +45 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +68 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +256 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/depth_first.rb +203 -0
- data/lib/arel/visitors/dot.rb +296 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +156 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +158 -0
- data/lib/arel/visitors/oracle12.rb +65 -0
- data/lib/arel/visitors/postgresql.rb +109 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +888 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors/where_sql.rb +22 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +62 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
- data/lib/rails/generators/active_record/migration.rb +17 -3
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +138 -52
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -20
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
- /data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
data/lib/active_record/core.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/hash/indifferent_access"
|
4
|
+
require "active_support/core_ext/string/filters"
|
5
|
+
require "active_support/parameter_filter"
|
6
|
+
require "concurrent/map"
|
5
7
|
|
6
8
|
module ActiveRecord
|
7
9
|
module Core
|
@@ -16,9 +18,16 @@ module ActiveRecord
|
|
16
18
|
# retrieved on both a class and instance level by calling +logger+.
|
17
19
|
mattr_accessor :logger, instance_writer: false
|
18
20
|
|
21
|
+
##
|
22
|
+
# :singleton-method:
|
23
|
+
#
|
24
|
+
# Specifies if the methods calling database queries should be logged below
|
25
|
+
# their relevant queries. Defaults to false.
|
26
|
+
mattr_accessor :verbose_query_logs, instance_writer: false, default: false
|
27
|
+
|
19
28
|
##
|
20
29
|
# Contains the database configuration - as is typically stored in config/database.yml -
|
21
|
-
# as
|
30
|
+
# as an ActiveRecord::DatabaseConfigurations object.
|
22
31
|
#
|
23
32
|
# For example, the following database.yml...
|
24
33
|
#
|
@@ -32,22 +41,18 @@ module ActiveRecord
|
|
32
41
|
#
|
33
42
|
# ...would result in ActiveRecord::Base.configurations to look like this:
|
34
43
|
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
# 'adapter' => 'sqlite3',
|
42
|
-
# 'database' => 'db/production.sqlite3'
|
43
|
-
# }
|
44
|
-
# }
|
44
|
+
# #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
|
45
|
+
# #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
|
46
|
+
# @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>,
|
47
|
+
# #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbdea90 @env_name="production",
|
48
|
+
# @spec_name="primary", @config={"adapter"=>"mysql2", "database"=>"db/production.sqlite3"}>
|
49
|
+
# ]>
|
45
50
|
def self.configurations=(config)
|
46
|
-
@@configurations = ActiveRecord::
|
51
|
+
@@configurations = ActiveRecord::DatabaseConfigurations.new(config)
|
47
52
|
end
|
48
53
|
self.configurations = {}
|
49
54
|
|
50
|
-
# Returns fully resolved
|
55
|
+
# Returns fully resolved ActiveRecord::DatabaseConfigurations object
|
51
56
|
def self.configurations
|
52
57
|
@@configurations
|
53
58
|
end
|
@@ -56,8 +61,7 @@ module ActiveRecord
|
|
56
61
|
# :singleton-method:
|
57
62
|
# Determines whether to use Time.utc (using :utc) or Time.local (using :local) when pulling
|
58
63
|
# dates and times from the database. This is set to :utc by default.
|
59
|
-
mattr_accessor :default_timezone, instance_writer: false
|
60
|
-
self.default_timezone = :utc
|
64
|
+
mattr_accessor :default_timezone, instance_writer: false, default: :utc
|
61
65
|
|
62
66
|
##
|
63
67
|
# :singleton-method:
|
@@ -67,31 +71,35 @@ module ActiveRecord
|
|
67
71
|
# ActiveRecord::Schema file which can be loaded into any database that
|
68
72
|
# supports migrations. Use :ruby if you want to have different database
|
69
73
|
# adapters for, e.g., your development and test environments.
|
70
|
-
mattr_accessor :schema_format, instance_writer: false
|
71
|
-
self.schema_format = :ruby
|
74
|
+
mattr_accessor :schema_format, instance_writer: false, default: :ruby
|
72
75
|
|
73
76
|
##
|
74
77
|
# :singleton-method:
|
75
|
-
# Specifies if an error should be raised
|
78
|
+
# Specifies if an error should be raised if the query has an order being
|
76
79
|
# ignored when doing batch queries. Useful in applications where the
|
77
|
-
#
|
78
|
-
mattr_accessor :
|
79
|
-
|
80
|
+
# scope being ignored is error-worthy, rather than a warning.
|
81
|
+
mattr_accessor :error_on_ignored_order, instance_writer: false, default: false
|
82
|
+
|
83
|
+
# :singleton-method:
|
84
|
+
# Specify the behavior for unsafe raw query methods. Values are as follows
|
85
|
+
# deprecated - Warnings are logged when unsafe raw SQL is passed to
|
86
|
+
# query methods.
|
87
|
+
# disabled - Unsafe raw SQL passed to query methods results in
|
88
|
+
# UnknownAttributeReference exception.
|
89
|
+
mattr_accessor :allow_unsafe_raw_sql, instance_writer: false, default: :deprecated
|
80
90
|
|
81
91
|
##
|
82
92
|
# :singleton-method:
|
83
93
|
# Specify whether or not to use timestamps for migration versions
|
84
|
-
mattr_accessor :timestamped_migrations, instance_writer: false
|
85
|
-
self.timestamped_migrations = true
|
94
|
+
mattr_accessor :timestamped_migrations, instance_writer: false, default: true
|
86
95
|
|
87
96
|
##
|
88
97
|
# :singleton-method:
|
89
98
|
# Specify whether schema dump should happen at the end of the
|
90
|
-
# db:migrate
|
99
|
+
# db:migrate rails command. This is true by default, which is useful for the
|
91
100
|
# development environment. This should ideally be false in the production
|
92
101
|
# environment where dumping schema is rarely needed.
|
93
|
-
mattr_accessor :dump_schema_after_migration, instance_writer: false
|
94
|
-
self.dump_schema_after_migration = true
|
102
|
+
mattr_accessor :dump_schema_after_migration, instance_writer: false, default: true
|
95
103
|
|
96
104
|
##
|
97
105
|
# :singleton-method:
|
@@ -100,8 +108,7 @@ module ActiveRecord
|
|
100
108
|
# schema_search_path are dumped. Use :all to dump all schemas regardless
|
101
109
|
# of schema_search_path, or a string of comma separated schemas for a
|
102
110
|
# custom list.
|
103
|
-
mattr_accessor :dump_schemas, instance_writer: false
|
104
|
-
self.dump_schemas = :schema_search_path
|
111
|
+
mattr_accessor :dump_schemas, instance_writer: false, default: :schema_search_path
|
105
112
|
|
106
113
|
##
|
107
114
|
# :singleton-method:
|
@@ -110,33 +117,45 @@ module ActiveRecord
|
|
110
117
|
# be used to identify queries which load thousands of records and
|
111
118
|
# potentially cause memory bloat.
|
112
119
|
mattr_accessor :warn_on_records_fetched_greater_than, instance_writer: false
|
113
|
-
self.warn_on_records_fetched_greater_than = nil
|
114
120
|
|
115
121
|
mattr_accessor :maintain_test_schema, instance_accessor: false
|
116
122
|
|
117
123
|
mattr_accessor :belongs_to_required_by_default, instance_accessor: false
|
118
124
|
|
125
|
+
mattr_accessor :connection_handlers, instance_accessor: false, default: {}
|
126
|
+
|
127
|
+
mattr_accessor :writing_role, instance_accessor: false, default: :writing
|
128
|
+
|
129
|
+
mattr_accessor :reading_role, instance_accessor: false, default: :reading
|
130
|
+
|
131
|
+
##
|
132
|
+
# :singleton-method:
|
133
|
+
# Application configurable boolean that instructs the YAML Coder to use
|
134
|
+
# an unsafe load if set to true.
|
135
|
+
mattr_accessor :use_yaml_unsafe_load, instance_writer: false, default: false
|
136
|
+
|
137
|
+
# Application configurable array that provides additional permitted classes
|
138
|
+
# to Psych safe_load in the YAML Coder
|
139
|
+
mattr_accessor :yaml_column_permitted_classes, instance_writer: false, default: [Symbol]
|
140
|
+
|
119
141
|
class_attribute :default_connection_handler, instance_writer: false
|
120
142
|
|
143
|
+
self.filter_attributes = []
|
144
|
+
|
121
145
|
def self.connection_handler
|
122
|
-
|
146
|
+
Thread.current.thread_variable_get("ar_connection_handler") || default_connection_handler
|
123
147
|
end
|
124
148
|
|
125
149
|
def self.connection_handler=(handler)
|
126
|
-
|
150
|
+
Thread.current.thread_variable_set("ar_connection_handler", handler)
|
127
151
|
end
|
128
152
|
|
129
153
|
self.default_connection_handler = ConnectionAdapters::ConnectionHandler.new
|
130
154
|
end
|
131
155
|
|
132
156
|
module ClassMethods
|
133
|
-
def allocate
|
134
|
-
define_attribute_methods
|
135
|
-
super
|
136
|
-
end
|
137
|
-
|
138
157
|
def initialize_find_by_cache # :nodoc:
|
139
|
-
@find_by_statement_cache = { true =>
|
158
|
+
@find_by_statement_cache = { true => Concurrent::Map.new, false => Concurrent::Map.new }
|
140
159
|
end
|
141
160
|
|
142
161
|
def inherited(child_class) # :nodoc:
|
@@ -151,41 +170,33 @@ module ActiveRecord
|
|
151
170
|
return super if block_given? ||
|
152
171
|
primary_key.nil? ||
|
153
172
|
scope_attributes? ||
|
154
|
-
columns_hash.
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
id = id.id
|
160
|
-
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
161
|
-
You are passing an instance of ActiveRecord::Base to `find`.
|
162
|
-
Please pass the id of the object by calling `.id`.
|
163
|
-
MSG
|
164
|
-
end
|
173
|
+
columns_hash.key?(inheritance_column) && !base_class?
|
174
|
+
|
175
|
+
id = ids.first
|
176
|
+
|
177
|
+
return super if StatementCache.unsupported_value?(id)
|
165
178
|
|
166
179
|
key = primary_key
|
167
180
|
|
168
181
|
statement = cached_find_by_statement(key) { |params|
|
169
182
|
where(key => params.bind).limit(1)
|
170
183
|
}
|
171
|
-
|
184
|
+
|
185
|
+
record = statement.execute([id], connection)&.first
|
172
186
|
unless record
|
173
|
-
raise RecordNotFound.new("Couldn't find #{name} with '#{
|
174
|
-
name, primary_key, id)
|
187
|
+
raise RecordNotFound.new("Couldn't find #{name} with '#{key}'=#{id}", name, key, id)
|
175
188
|
end
|
176
189
|
record
|
177
|
-
rescue RangeError
|
178
|
-
raise RecordNotFound.new("Couldn't find #{name} with an out of range value for '#{primary_key}'",
|
179
|
-
name, primary_key)
|
180
190
|
end
|
181
191
|
|
182
192
|
def find_by(*args) # :nodoc:
|
183
|
-
return super if scope_attributes? || reflect_on_all_aggregations.any?
|
193
|
+
return super if scope_attributes? || reflect_on_all_aggregations.any? ||
|
194
|
+
columns_hash.key?(inheritance_column) && !base_class?
|
184
195
|
|
185
196
|
hash = args.first
|
186
197
|
|
187
198
|
return super if !(Hash === hash) || hash.values.any? { |v|
|
188
|
-
|
199
|
+
StatementCache.unsupported_value?(v)
|
189
200
|
}
|
190
201
|
|
191
202
|
# We can't cache Post.find_by(author: david) ...yet
|
@@ -200,32 +211,44 @@ module ActiveRecord
|
|
200
211
|
where(wheres).limit(1)
|
201
212
|
}
|
202
213
|
begin
|
203
|
-
statement.execute(hash.values,
|
214
|
+
statement.execute(hash.values, connection)&.first
|
204
215
|
rescue TypeError
|
205
216
|
raise ActiveRecord::StatementInvalid
|
206
|
-
rescue RangeError
|
207
|
-
nil
|
208
217
|
end
|
209
218
|
end
|
210
219
|
|
211
220
|
def find_by!(*args) # :nodoc:
|
212
|
-
find_by(*args)
|
221
|
+
find_by(*args) || raise(RecordNotFound.new("Couldn't find #{name}", name))
|
213
222
|
end
|
214
223
|
|
215
224
|
def initialize_generated_modules # :nodoc:
|
216
225
|
generated_association_methods
|
217
226
|
end
|
218
227
|
|
219
|
-
def generated_association_methods
|
228
|
+
def generated_association_methods # :nodoc:
|
220
229
|
@generated_association_methods ||= begin
|
221
230
|
mod = const_set(:GeneratedAssociationMethods, Module.new)
|
231
|
+
private_constant :GeneratedAssociationMethods
|
222
232
|
include mod
|
233
|
+
|
223
234
|
mod
|
224
235
|
end
|
225
236
|
end
|
226
237
|
|
238
|
+
# Returns columns which shouldn't be exposed while calling +#inspect+.
|
239
|
+
def filter_attributes
|
240
|
+
if defined?(@filter_attributes)
|
241
|
+
@filter_attributes
|
242
|
+
else
|
243
|
+
superclass.filter_attributes
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
# Specifies columns which shouldn't be exposed while calling +#inspect+.
|
248
|
+
attr_writer :filter_attributes
|
249
|
+
|
227
250
|
# Returns a string like 'Post(id:integer, title:string, body:text)'
|
228
|
-
def inspect
|
251
|
+
def inspect # :nodoc:
|
229
252
|
if self == Base
|
230
253
|
super
|
231
254
|
elsif abstract_class?
|
@@ -233,39 +256,30 @@ module ActiveRecord
|
|
233
256
|
elsif !connected?
|
234
257
|
"#{super} (call '#{super}.connection' to establish a connection)"
|
235
258
|
elsif table_exists?
|
236
|
-
attr_list = attribute_types.map { |name, type| "#{name}: #{type.type}" } *
|
259
|
+
attr_list = attribute_types.map { |name, type| "#{name}: #{type.type}" } * ", "
|
237
260
|
"#{super}(#{attr_list})"
|
238
261
|
else
|
239
262
|
"#{super}(Table doesn't exist)"
|
240
263
|
end
|
241
264
|
end
|
242
265
|
|
243
|
-
# Overwrite the default class equality method to provide support for
|
244
|
-
def ===(object)
|
266
|
+
# Overwrite the default class equality method to provide support for decorated models.
|
267
|
+
def ===(object) # :nodoc:
|
245
268
|
object.is_a?(self)
|
246
269
|
end
|
247
270
|
|
248
271
|
# Returns an instance of <tt>Arel::Table</tt> loaded with the current table name.
|
249
272
|
#
|
250
273
|
# class Post < ActiveRecord::Base
|
251
|
-
# scope :published_and_commented, -> { published.and(
|
274
|
+
# scope :published_and_commented, -> { published.and(arel_table[:comments_count].gt(0)) }
|
252
275
|
# end
|
253
276
|
def arel_table # :nodoc:
|
254
277
|
@arel_table ||= Arel::Table.new(table_name, type_caster: type_caster)
|
255
278
|
end
|
256
279
|
|
257
|
-
# Returns the Arel engine.
|
258
|
-
def arel_engine # :nodoc:
|
259
|
-
@arel_engine ||=
|
260
|
-
if Base == self || connection_handler.retrieve_connection_pool(connection_specification_name)
|
261
|
-
self
|
262
|
-
else
|
263
|
-
superclass.arel_engine
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
280
|
def arel_attribute(name, table = arel_table) # :nodoc:
|
268
|
-
name =
|
281
|
+
name = name.to_s
|
282
|
+
name = attribute_aliases[name] || name
|
269
283
|
table[name]
|
270
284
|
end
|
271
285
|
|
@@ -277,28 +291,29 @@ module ActiveRecord
|
|
277
291
|
TypeCaster::Map.new(self)
|
278
292
|
end
|
279
293
|
|
280
|
-
|
294
|
+
def _internal? # :nodoc:
|
295
|
+
false
|
296
|
+
end
|
281
297
|
|
282
298
|
def cached_find_by_statement(key, &block) # :nodoc:
|
283
299
|
cache = @find_by_statement_cache[connection.prepared_statements]
|
284
|
-
cache
|
285
|
-
cache[key] ||= StatementCache.create(connection, &block)
|
286
|
-
}
|
300
|
+
cache.compute_if_absent(key) { StatementCache.create(connection, &block) }
|
287
301
|
end
|
288
302
|
|
289
|
-
|
290
|
-
relation
|
303
|
+
private
|
304
|
+
def relation
|
305
|
+
relation = Relation.create(self)
|
291
306
|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
307
|
+
if finder_needs_type_condition? && !ignore_default_scope?
|
308
|
+
relation.where!(type_condition)
|
309
|
+
else
|
310
|
+
relation
|
311
|
+
end
|
296
312
|
end
|
297
|
-
end
|
298
313
|
|
299
|
-
|
300
|
-
|
301
|
-
|
314
|
+
def table_metadata
|
315
|
+
TableMetadata.new(self, arel_table)
|
316
|
+
end
|
302
317
|
end
|
303
318
|
|
304
319
|
# New objects can be instantiated as either empty (pass no construction parameter) or pre-set with
|
@@ -310,7 +325,7 @@ module ActiveRecord
|
|
310
325
|
# # Instantiates a single new object
|
311
326
|
# User.new(first_name: 'Jamie')
|
312
327
|
def initialize(attributes = nil)
|
313
|
-
|
328
|
+
@new_record = true
|
314
329
|
@attributes = self.class._default_attributes.deep_dup
|
315
330
|
|
316
331
|
init_internals
|
@@ -336,15 +351,21 @@ module ActiveRecord
|
|
336
351
|
# post = Post.allocate
|
337
352
|
# post.init_with(coder)
|
338
353
|
# post.title # => 'hello world'
|
339
|
-
def init_with(coder)
|
354
|
+
def init_with(coder, &block)
|
340
355
|
coder = LegacyYamlAdapter.convert(self.class, coder)
|
341
|
-
|
342
|
-
|
343
|
-
|
356
|
+
attributes = self.class.yaml_encoder.decode(coder)
|
357
|
+
init_with_attributes(attributes, coder["new_record"], &block)
|
358
|
+
end
|
344
359
|
|
345
|
-
|
360
|
+
##
|
361
|
+
# Initialize an empty model object from +attributes+.
|
362
|
+
# +attributes+ should be an attributes object, and unlike the
|
363
|
+
# `initialize` method, no assignment calls are made per attribute.
|
364
|
+
def init_with_attributes(attributes, new_record = false) # :nodoc:
|
365
|
+
@new_record = new_record
|
366
|
+
@attributes = attributes
|
346
367
|
|
347
|
-
|
368
|
+
init_internals
|
348
369
|
|
349
370
|
yield self if block_given?
|
350
371
|
|
@@ -383,12 +404,14 @@ module ActiveRecord
|
|
383
404
|
##
|
384
405
|
def initialize_dup(other) # :nodoc:
|
385
406
|
@attributes = @attributes.deep_dup
|
386
|
-
@attributes.reset(
|
407
|
+
@attributes.reset(@primary_key)
|
387
408
|
|
388
409
|
_run_initialize_callbacks
|
389
410
|
|
390
|
-
@new_record
|
391
|
-
@destroyed
|
411
|
+
@new_record = true
|
412
|
+
@destroyed = false
|
413
|
+
@_start_transaction_state = nil
|
414
|
+
@transaction_state = nil
|
392
415
|
|
393
416
|
super
|
394
417
|
end
|
@@ -406,11 +429,9 @@ module ActiveRecord
|
|
406
429
|
# Post.new.encode_with(coder)
|
407
430
|
# coder # => {"attributes" => {"id" => nil, ... }}
|
408
431
|
def encode_with(coder)
|
409
|
-
|
410
|
-
coder[
|
411
|
-
coder[
|
412
|
-
coder['new_record'] = new_record?
|
413
|
-
coder['active_record_yaml_version'] = 1
|
432
|
+
self.class.yaml_encoder.encode(@attributes, coder)
|
433
|
+
coder["new_record"] = new_record?
|
434
|
+
coder["active_record_yaml_version"] = 2
|
414
435
|
end
|
415
436
|
|
416
437
|
# Returns true if +comparison_object+ is the same exact object, or +comparison_object+
|
@@ -434,7 +455,7 @@ module ActiveRecord
|
|
434
455
|
# [ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
|
435
456
|
def hash
|
436
457
|
if id
|
437
|
-
id.hash
|
458
|
+
self.class.hash ^ id.hash
|
438
459
|
else
|
439
460
|
super
|
440
461
|
end
|
@@ -450,18 +471,27 @@ module ActiveRecord
|
|
450
471
|
|
451
472
|
# Returns +true+ if the attributes hash has been frozen.
|
452
473
|
def frozen?
|
474
|
+
sync_with_transaction_state if @transaction_state&.finalized?
|
453
475
|
@attributes.frozen?
|
454
476
|
end
|
455
477
|
|
456
478
|
# Allows sort on objects
|
457
479
|
def <=>(other_object)
|
458
480
|
if other_object.is_a?(self.class)
|
459
|
-
|
481
|
+
to_key <=> other_object.to_key
|
460
482
|
else
|
461
483
|
super
|
462
484
|
end
|
463
485
|
end
|
464
486
|
|
487
|
+
def present? # :nodoc:
|
488
|
+
true
|
489
|
+
end
|
490
|
+
|
491
|
+
def blank? # :nodoc:
|
492
|
+
false
|
493
|
+
end
|
494
|
+
|
465
495
|
# Returns +true+ if the record is read only. Records loaded through joins with piggy-back
|
466
496
|
# attributes will be marked as read only since they cannot be saved.
|
467
497
|
def readonly?
|
@@ -482,14 +512,22 @@ module ActiveRecord
|
|
482
512
|
# We check defined?(@attributes) not to issue warnings if the object is
|
483
513
|
# allocated but not initialized.
|
484
514
|
inspection = if defined?(@attributes) && @attributes
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
515
|
+
self.class.attribute_names.collect do |name|
|
516
|
+
if has_attribute?(name)
|
517
|
+
attr = _read_attribute(name)
|
518
|
+
value = if attr.nil?
|
519
|
+
attr.inspect
|
520
|
+
else
|
521
|
+
attr = format_for_inspect(attr)
|
522
|
+
inspection_filter.filter_param(name, attr)
|
523
|
+
end
|
524
|
+
"#{name}: #{value}"
|
525
|
+
end
|
526
|
+
end.compact.join(", ")
|
527
|
+
else
|
528
|
+
"not initialized"
|
529
|
+
end
|
530
|
+
|
493
531
|
"#<#{self.class} #{inspection}>"
|
494
532
|
end
|
495
533
|
|
@@ -499,65 +537,74 @@ module ActiveRecord
|
|
499
537
|
return super if custom_inspect_method_defined?
|
500
538
|
pp.object_address_group(self) do
|
501
539
|
if defined?(@attributes) && @attributes
|
502
|
-
|
503
|
-
pp.seplist(
|
504
|
-
|
505
|
-
pp.breakable ' '
|
540
|
+
attr_names = self.class.attribute_names.select { |name| has_attribute?(name) }
|
541
|
+
pp.seplist(attr_names, proc { pp.text "," }) do |attr_name|
|
542
|
+
pp.breakable " "
|
506
543
|
pp.group(1) do
|
507
|
-
pp.text
|
508
|
-
pp.text
|
544
|
+
pp.text attr_name
|
545
|
+
pp.text ":"
|
509
546
|
pp.breakable
|
510
|
-
|
547
|
+
value = _read_attribute(attr_name)
|
548
|
+
value = inspection_filter.filter_param(attr_name, value) unless value.nil?
|
549
|
+
pp.pp value
|
511
550
|
end
|
512
551
|
end
|
513
552
|
else
|
514
|
-
pp.breakable
|
515
|
-
pp.text
|
553
|
+
pp.breakable " "
|
554
|
+
pp.text "not initialized"
|
516
555
|
end
|
517
556
|
end
|
518
557
|
end
|
519
558
|
|
520
559
|
# Returns a hash of the given methods with their names as keys and returned values as values.
|
521
560
|
def slice(*methods)
|
522
|
-
Hash[methods.map! { |method| [method, public_send(method)] }].with_indifferent_access
|
561
|
+
Hash[methods.flatten.map! { |method| [method, public_send(method)] }].with_indifferent_access
|
523
562
|
end
|
524
563
|
|
525
564
|
private
|
565
|
+
# +Array#flatten+ will call +#to_ary+ (recursively) on each of the elements of
|
566
|
+
# the array, and then rescues from the possible +NoMethodError+. If those elements are
|
567
|
+
# +ActiveRecord::Base+'s, then this triggers the various +method_missing+'s that we have,
|
568
|
+
# which significantly impacts upon performance.
|
569
|
+
#
|
570
|
+
# So we can avoid the +method_missing+ hit by explicitly defining +#to_ary+ as +nil+ here.
|
571
|
+
#
|
572
|
+
# See also https://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary.html
|
573
|
+
def to_ary
|
574
|
+
nil
|
575
|
+
end
|
526
576
|
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
def to_ary # :nodoc:
|
536
|
-
nil
|
537
|
-
end
|
577
|
+
def init_internals
|
578
|
+
@primary_key = self.class.primary_key
|
579
|
+
@readonly = false
|
580
|
+
@destroyed = false
|
581
|
+
@marked_for_destruction = false
|
582
|
+
@destroyed_by_association = nil
|
583
|
+
@_start_transaction_state = nil
|
584
|
+
@transaction_state = nil
|
538
585
|
|
539
|
-
|
540
|
-
|
541
|
-
@destroyed = false
|
542
|
-
@marked_for_destruction = false
|
543
|
-
@destroyed_by_association = nil
|
544
|
-
@new_record = true
|
545
|
-
@txn = nil
|
546
|
-
@_start_transaction_state = {}
|
547
|
-
@transaction_state = nil
|
548
|
-
end
|
586
|
+
self.class.define_attribute_methods
|
587
|
+
end
|
549
588
|
|
550
|
-
|
551
|
-
|
589
|
+
def initialize_internals_callback
|
590
|
+
end
|
552
591
|
|
553
|
-
|
554
|
-
|
555
|
-
@attributes = @attributes.dup
|
592
|
+
def custom_inspect_method_defined?
|
593
|
+
self.class.instance_method(:inspect).owner != ActiveRecord::Base.instance_method(:inspect).owner
|
556
594
|
end
|
557
|
-
end
|
558
595
|
|
559
|
-
|
560
|
-
|
561
|
-
|
596
|
+
class InspectionMask < DelegateClass(::String)
|
597
|
+
def pretty_print(pp)
|
598
|
+
pp.text __getobj__
|
599
|
+
end
|
600
|
+
end
|
601
|
+
private_constant :InspectionMask
|
602
|
+
|
603
|
+
def inspection_filter
|
604
|
+
@inspection_filter ||= begin
|
605
|
+
mask = InspectionMask.new(ActiveSupport::ParameterFilter::FILTERED)
|
606
|
+
ActiveSupport::ParameterFilter.new(self.class.filter_attributes, mask: mask)
|
607
|
+
end
|
608
|
+
end
|
562
609
|
end
|
563
610
|
end
|