activerecord 5.0.7.2 → 6.1.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 +829 -2015
- data/MIT-LICENSE +3 -1
- data/README.rdoc +11 -9
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record.rb +37 -29
- data/lib/active_record/aggregations.rb +249 -247
- data/lib/active_record/association_relation.rb +30 -18
- data/lib/active_record/associations.rb +1714 -1596
- data/lib/active_record/associations/alias_tracker.rb +36 -42
- data/lib/active_record/associations/association.rb +143 -68
- data/lib/active_record/associations/association_scope.rb +98 -94
- data/lib/active_record/associations/belongs_to_association.rb +76 -46
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
- data/lib/active_record/associations/builder/association.rb +27 -28
- data/lib/active_record/associations/builder/belongs_to.rb +52 -60
- data/lib/active_record/associations/builder/collection_association.rb +12 -22
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +40 -62
- data/lib/active_record/associations/builder/has_many.rb +10 -2
- data/lib/active_record/associations/builder/has_one.rb +35 -2
- data/lib/active_record/associations/builder/singular_association.rb +5 -1
- data/lib/active_record/associations/collection_association.rb +104 -259
- data/lib/active_record/associations/collection_proxy.rb +169 -125
- data/lib/active_record/associations/foreign_association.rb +22 -0
- data/lib/active_record/associations/has_many_association.rb +46 -31
- data/lib/active_record/associations/has_many_through_association.rb +66 -46
- data/lib/active_record/associations/has_one_association.rb +71 -52
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency.rb +169 -180
- data/lib/active_record/associations/join_dependency/join_association.rb +53 -79
- 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/preloader.rb +97 -104
- data/lib/active_record/associations/preloader/association.rb +109 -97
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +27 -15
- data/lib/active_record/attribute_assignment.rb +55 -60
- data/lib/active_record/attribute_methods.rb +111 -141
- data/lib/active_record/attribute_methods/before_type_cast.rb +17 -9
- data/lib/active_record/attribute_methods/dirty.rb +172 -112
- data/lib/active_record/attribute_methods/primary_key.rb +88 -91
- data/lib/active_record/attribute_methods/query.rb +6 -8
- data/lib/active_record/attribute_methods/read.rb +18 -50
- data/lib/active_record/attribute_methods/serialization.rb +38 -10
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +38 -66
- data/lib/active_record/attribute_methods/write.rb +25 -32
- data/lib/active_record/attributes.rb +69 -31
- data/lib/active_record/autosave_association.rb +102 -66
- data/lib/active_record/base.rb +16 -25
- data/lib/active_record/callbacks.rb +202 -43
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +11 -12
- data/lib/active_record/connection_adapters.rb +50 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +661 -375
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +14 -38
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +269 -105
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +54 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +137 -93
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +155 -113
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +328 -162
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +591 -259
- data/lib/active_record/connection_adapters/abstract/transaction.rb +229 -91
- data/lib/active_record/connection_adapters/abstract_adapter.rb +392 -244
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +457 -582
- data/lib/active_record/connection_adapters/column.rb +55 -13
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +135 -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 +79 -49
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +66 -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 +20 -12
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +74 -37
- data/lib/active_record/connection_adapters/pool_config.rb +63 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +39 -28
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -101
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +26 -21
- 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 +6 -6
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -4
- 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/interval.rb +49 -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/macaddr.rb +25 -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 +18 -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/quoting.rb +98 -38
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +21 -27
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -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 +426 -324
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +32 -23
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +418 -293
- data/lib/active_record/connection_adapters/schema_cache.rb +135 -18
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +22 -7
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -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 +5 -6
- 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 +170 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +282 -290
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
- data/lib/active_record/connection_handling.rb +287 -45
- data/lib/active_record/core.rb +385 -181
- data/lib/active_record/counter_cache.rb +60 -28
- data/lib/active_record/database_configurations.rb +272 -0
- data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
- data/lib/active_record/database_configurations/database_config.rb +80 -0
- data/lib/active_record/database_configurations/hash_config.rb +96 -0
- data/lib/active_record/database_configurations/url_config.rb +53 -0
- data/lib/active_record/delegated_type.rb +209 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/dynamic_matchers.rb +87 -87
- data/lib/active_record/enum.rb +122 -47
- data/lib/active_record/errors.rb +153 -22
- data/lib/active_record/explain.rb +13 -8
- 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 +20 -22
- data/lib/active_record/fixture_set/model_metadata.rb +32 -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 +246 -507
- data/lib/active_record/gem_version.rb +6 -4
- data/lib/active_record/inheritance.rb +168 -95
- data/lib/active_record/insert_all.rb +208 -0
- data/lib/active_record/integration.rb +114 -25
- data/lib/active_record/internal_metadata.rb +30 -24
- data/lib/active_record/legacy_yaml_adapter.rb +11 -5
- data/lib/active_record/locking/optimistic.rb +81 -85
- data/lib/active_record/locking/pessimistic.rb +22 -6
- data/lib/active_record/log_subscriber.rb +68 -31
- data/lib/active_record/middleware/database_selector.rb +77 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/migration.rb +439 -342
- data/lib/active_record/migration/command_recorder.rb +152 -98
- data/lib/active_record/migration/compatibility.rb +229 -60
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/model_schema.rb +230 -122
- data/lib/active_record/nested_attributes.rb +213 -203
- data/lib/active_record/no_touching.rb +11 -2
- data/lib/active_record/null_relation.rb +12 -34
- data/lib/active_record/persistence.rb +471 -97
- data/lib/active_record/query_cache.rb +23 -12
- data/lib/active_record/querying.rb +43 -25
- data/lib/active_record/railtie.rb +155 -43
- 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 +507 -195
- data/lib/active_record/readonly_attributes.rb +9 -4
- data/lib/active_record/reflection.rb +245 -269
- data/lib/active_record/relation.rb +475 -324
- data/lib/active_record/relation/batches.rb +125 -72
- data/lib/active_record/relation/batches/batch_enumerator.rb +28 -10
- data/lib/active_record/relation/calculations.rb +267 -171
- data/lib/active_record/relation/delegation.rb +73 -69
- data/lib/active_record/relation/finder_methods.rb +238 -248
- data/lib/active_record/relation/from_clause.rb +7 -9
- data/lib/active_record/relation/merger.rb +95 -77
- data/lib/active_record/relation/predicate_builder.rb +109 -110
- data/lib/active_record/relation/predicate_builder/array_handler.rb +22 -17
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +55 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +654 -374
- data/lib/active_record/relation/record_fetch_warning.rb +8 -6
- data/lib/active_record/relation/spawn_methods.rb +15 -14
- data/lib/active_record/relation/where_clause.rb +171 -109
- data/lib/active_record/result.rb +88 -51
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +73 -100
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +101 -69
- data/lib/active_record/schema_migration.rb +16 -12
- data/lib/active_record/scoping.rb +20 -20
- data/lib/active_record/scoping/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +39 -30
- data/lib/active_record/secure_token.rb +19 -9
- data/lib/active_record/serialization.rb +7 -3
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +80 -29
- data/lib/active_record/store.rb +122 -42
- data/lib/active_record/suppressor.rb +6 -3
- data/lib/active_record/table_metadata.rb +51 -39
- data/lib/active_record/tasks/database_tasks.rb +332 -115
- data/lib/active_record/tasks/mysql_database_tasks.rb +66 -104
- data/lib/active_record/tasks/postgresql_database_tasks.rb +84 -56
- data/lib/active_record/tasks/sqlite_database_tasks.rb +40 -19
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +246 -0
- data/lib/active_record/timestamp.rb +70 -38
- data/lib/active_record/touch_later.rb +26 -24
- data/lib/active_record/transactions.rb +121 -184
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type.rb +29 -17
- 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 +20 -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_caster.rb +4 -2
- data/lib/active_record/type_caster/connection.rb +17 -13
- data/lib/active_record/type_caster/map.rb +10 -6
- data/lib/active_record/validations.rb +8 -5
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +4 -3
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +52 -45
- data/lib/active_record/version.rb +3 -1
- data/lib/arel.rb +54 -0
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +41 -0
- data/lib/arel/collectors/bind.rb +29 -0
- data/lib/arel/collectors/composite.rb +39 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -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.rb +70 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +126 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -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 +15 -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 +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +72 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -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 +51 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -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 +19 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +31 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -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/order_predications.rb +13 -0
- data/lib/arel/predications.rb +250 -0
- data/lib/arel/select_manager.rb +270 -0
- data/lib/arel/table.rb +118 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/visitors/dot.rb +308 -0
- data/lib/arel/visitors/mysql.rb +93 -0
- data/lib/arel/visitors/postgresql.rb +120 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +899 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/rails/generators/active_record.rb +7 -5
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -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.rb +22 -3
- data/lib/rails/generators/active_record/migration/migration_generator.rb +38 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +3 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +7 -5
- data/lib/rails/generators/active_record/model/model_generator.rb +41 -25
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- 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
- metadata +141 -57
- 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.rb +0 -213
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute_decorators.rb +0 -67
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -263
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -22
- 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/base_handler.rb +0 -17
- 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/relation/where_clause_factory.rb +0 -38
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_record/scoping/default"
|
4
|
+
require "active_record/scoping/named"
|
3
5
|
|
4
6
|
module ActiveRecord
|
5
7
|
# This class is used to create a table that keeps track of which migrations
|
@@ -8,24 +10,22 @@ module ActiveRecord
|
|
8
10
|
# to be executed the next time.
|
9
11
|
class SchemaMigration < ActiveRecord::Base # :nodoc:
|
10
12
|
class << self
|
13
|
+
def _internal?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
11
17
|
def primary_key
|
12
18
|
"version"
|
13
19
|
end
|
14
20
|
|
15
21
|
def table_name
|
16
|
-
"#{table_name_prefix}#{
|
17
|
-
end
|
18
|
-
|
19
|
-
def table_exists?
|
20
|
-
ActiveSupport::Deprecation.silence { connection.table_exists?(table_name) }
|
22
|
+
"#{table_name_prefix}#{schema_migrations_table_name}#{table_name_suffix}"
|
21
23
|
end
|
22
24
|
|
23
25
|
def create_table
|
24
|
-
unless table_exists?
|
25
|
-
version_options = connection.internal_string_options_for_primary_key
|
26
|
-
|
26
|
+
unless connection.table_exists?(table_name)
|
27
27
|
connection.create_table(table_name, id: false) do |t|
|
28
|
-
t.string :version,
|
28
|
+
t.string :version, **connection.internal_string_options_for_primary_key
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -39,7 +39,11 @@ module ActiveRecord
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def normalized_versions
|
42
|
-
|
42
|
+
all_versions.map { |v| normalize_migration_number v }
|
43
|
+
end
|
44
|
+
|
45
|
+
def all_versions
|
46
|
+
order(:version).pluck(:version)
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/per_thread_registry"
|
2
4
|
|
3
5
|
module ActiveRecord
|
4
6
|
module Scoping
|
@@ -9,33 +11,32 @@ module ActiveRecord
|
|
9
11
|
include Named
|
10
12
|
end
|
11
13
|
|
12
|
-
module ClassMethods
|
13
|
-
def current_scope(skip_inherited_scope = false) # :nodoc:
|
14
|
-
ScopeRegistry.value_for(:current_scope, self, skip_inherited_scope)
|
15
|
-
end
|
16
|
-
|
17
|
-
def current_scope=(scope) #:nodoc:
|
18
|
-
ScopeRegistry.set_value_for(:current_scope, self, scope)
|
19
|
-
end
|
20
|
-
|
14
|
+
module ClassMethods # :nodoc:
|
21
15
|
# Collects attributes from scopes that should be applied when creating
|
22
16
|
# an AR instance for the particular class this is called on.
|
23
|
-
def scope_attributes
|
17
|
+
def scope_attributes
|
24
18
|
all.scope_for_create
|
25
19
|
end
|
26
20
|
|
27
21
|
# Are there attributes associated with this scope?
|
28
|
-
def scope_attributes?
|
22
|
+
def scope_attributes?
|
29
23
|
current_scope
|
30
24
|
end
|
25
|
+
|
26
|
+
def current_scope(skip_inherited_scope = false)
|
27
|
+
ScopeRegistry.value_for(:current_scope, self, skip_inherited_scope)
|
28
|
+
end
|
29
|
+
|
30
|
+
def current_scope=(scope)
|
31
|
+
ScopeRegistry.set_value_for(:current_scope, self, scope)
|
32
|
+
end
|
31
33
|
end
|
32
34
|
|
33
35
|
def populate_with_current_scope_attributes # :nodoc:
|
34
36
|
return unless self.class.scope_attributes?
|
35
37
|
|
36
|
-
self.class.scope_attributes
|
37
|
-
|
38
|
-
end
|
38
|
+
attributes = self.class.scope_attributes
|
39
|
+
_assign_attributes(attributes) if attributes.any?
|
39
40
|
end
|
40
41
|
|
41
42
|
def initialize_internals_callback # :nodoc:
|
@@ -94,12 +95,11 @@ module ActiveRecord
|
|
94
95
|
end
|
95
96
|
|
96
97
|
private
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
98
|
+
def raise_invalid_scope_type!(scope_type)
|
99
|
+
if !VALID_SCOPE_TYPES.include?(scope_type)
|
100
|
+
raise ArgumentError, "Invalid scope type '#{scope_type}' sent to the registry. Scope types must be included in VALID_SCOPE_TYPES"
|
101
|
+
end
|
101
102
|
end
|
102
|
-
end
|
103
103
|
end
|
104
104
|
end
|
105
105
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Scoping
|
3
5
|
module Default
|
@@ -5,11 +7,8 @@ module ActiveRecord
|
|
5
7
|
|
6
8
|
included do
|
7
9
|
# Stores the default scope for the class.
|
8
|
-
class_attribute :default_scopes, instance_writer: false, instance_predicate: false
|
9
|
-
class_attribute :default_scope_override, instance_writer: false, instance_predicate: false
|
10
|
-
|
11
|
-
self.default_scopes = []
|
12
|
-
self.default_scope_override = nil
|
10
|
+
class_attribute :default_scopes, instance_writer: false, instance_predicate: false, default: []
|
11
|
+
class_attribute :default_scope_override, instance_writer: false, instance_predicate: false, default: nil
|
13
12
|
end
|
14
13
|
|
15
14
|
module ClassMethods
|
@@ -44,109 +43,107 @@ module ActiveRecord
|
|
44
43
|
self.current_scope = nil
|
45
44
|
end
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
46
|
+
private
|
47
|
+
# Use this macro in your model to set a default scope for all operations on
|
48
|
+
# the model.
|
49
|
+
#
|
50
|
+
# class Article < ActiveRecord::Base
|
51
|
+
# default_scope { where(published: true) }
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# Article.all # => SELECT * FROM articles WHERE published = true
|
55
|
+
#
|
56
|
+
# The #default_scope is also applied while creating/building a record.
|
57
|
+
# It is not applied while updating a record.
|
58
|
+
#
|
59
|
+
# Article.new.published # => true
|
60
|
+
# Article.create.published # => true
|
61
|
+
#
|
62
|
+
# (You can also pass any object which responds to +call+ to the
|
63
|
+
# +default_scope+ macro, and it will be called when building the
|
64
|
+
# default scope.)
|
65
|
+
#
|
66
|
+
# If you use multiple #default_scope declarations in your model then
|
67
|
+
# they will be merged together:
|
68
|
+
#
|
69
|
+
# class Article < ActiveRecord::Base
|
70
|
+
# default_scope { where(published: true) }
|
71
|
+
# default_scope { where(rating: 'G') }
|
72
|
+
# end
|
73
|
+
#
|
74
|
+
# Article.all # => SELECT * FROM articles WHERE published = true AND rating = 'G'
|
75
|
+
#
|
76
|
+
# This is also the case with inheritance and module includes where the
|
77
|
+
# parent or module defines a #default_scope and the child or including
|
78
|
+
# class defines a second one.
|
79
|
+
#
|
80
|
+
# If you need to do more complex things with a default scope, you can
|
81
|
+
# alternatively define it as a class method:
|
82
|
+
#
|
83
|
+
# class Article < ActiveRecord::Base
|
84
|
+
# def self.default_scope
|
85
|
+
# # Should return a scope, you can call 'super' here etc.
|
86
|
+
# end
|
87
|
+
# end
|
88
|
+
def default_scope(scope = nil, &block) # :doc:
|
89
|
+
scope = block if block_given?
|
90
|
+
|
91
|
+
if scope.is_a?(Relation) || !scope.respond_to?(:call)
|
92
|
+
raise ArgumentError,
|
93
|
+
"Support for calling #default_scope without a block is removed. For example instead " \
|
94
|
+
"of `default_scope where(color: 'red')`, please use " \
|
95
|
+
"`default_scope { where(color: 'red') }`. (Alternatively you can just redefine " \
|
96
|
+
"self.default_scope.)"
|
97
|
+
end
|
92
98
|
|
93
|
-
|
94
|
-
raise ArgumentError,
|
95
|
-
"Support for calling #default_scope without a block is removed. For example instead " \
|
96
|
-
"of `default_scope where(color: 'red')`, please use " \
|
97
|
-
"`default_scope { where(color: 'red') }`. (Alternatively you can just redefine " \
|
98
|
-
"self.default_scope.)"
|
99
|
+
self.default_scopes += [scope]
|
99
100
|
end
|
100
101
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
def build_default_scope(base_rel = nil) # :nodoc:
|
105
|
-
return if abstract_class?
|
102
|
+
def build_default_scope(relation = relation())
|
103
|
+
return if abstract_class?
|
106
104
|
|
107
|
-
|
108
|
-
|
109
|
-
|
105
|
+
if default_scope_override.nil?
|
106
|
+
self.default_scope_override = !Base.is_a?(method(:default_scope).owner)
|
107
|
+
end
|
110
108
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
109
|
+
if default_scope_override
|
110
|
+
# The user has defined their own default scope method, so call that
|
111
|
+
evaluate_default_scope do
|
112
|
+
if scope = default_scope
|
113
|
+
relation.merge!(scope)
|
114
|
+
end
|
116
115
|
end
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
default_scope.merge(base_rel.instance_exec(&scope))
|
116
|
+
elsif default_scopes.any?
|
117
|
+
evaluate_default_scope do
|
118
|
+
default_scopes.inject(relation) do |default_scope, scope|
|
119
|
+
scope = scope.respond_to?(:to_proc) ? scope : scope.method(:call)
|
120
|
+
default_scope.instance_exec(&scope) || default_scope
|
121
|
+
end
|
124
122
|
end
|
125
123
|
end
|
126
124
|
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def ignore_default_scope? # :nodoc:
|
130
|
-
ScopeRegistry.value_for(:ignore_default_scope, base_class)
|
131
|
-
end
|
132
125
|
|
133
|
-
|
134
|
-
|
135
|
-
|
126
|
+
def ignore_default_scope?
|
127
|
+
ScopeRegistry.value_for(:ignore_default_scope, base_class)
|
128
|
+
end
|
136
129
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
def evaluate_default_scope # :nodoc:
|
141
|
-
return if ignore_default_scope?
|
130
|
+
def ignore_default_scope=(ignore)
|
131
|
+
ScopeRegistry.set_value_for(:ignore_default_scope, base_class, ignore)
|
132
|
+
end
|
142
133
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
134
|
+
# The ignore_default_scope flag is used to prevent an infinite recursion
|
135
|
+
# situation where a default scope references a scope which has a default
|
136
|
+
# scope which references a scope...
|
137
|
+
def evaluate_default_scope
|
138
|
+
return if ignore_default_scope?
|
139
|
+
|
140
|
+
begin
|
141
|
+
self.ignore_default_scope = true
|
142
|
+
yield
|
143
|
+
ensure
|
144
|
+
self.ignore_default_scope = false
|
145
|
+
end
|
148
146
|
end
|
149
|
-
end
|
150
147
|
end
|
151
148
|
end
|
152
149
|
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
require 'active_support/core_ext/hash/except'
|
3
|
-
require 'active_support/core_ext/kernel/singleton_class'
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
3
|
module ActiveRecord
|
6
4
|
# = Active Record \Named \Scopes
|
@@ -22,29 +20,34 @@ module ActiveRecord
|
|
22
20
|
# You can define a scope that applies to all finders using
|
23
21
|
# {default_scope}[rdoc-ref:Scoping::Default::ClassMethods#default_scope].
|
24
22
|
def all
|
25
|
-
|
26
|
-
|
23
|
+
scope = current_scope
|
24
|
+
|
25
|
+
if scope
|
26
|
+
if self == scope.klass
|
27
|
+
scope.clone
|
28
|
+
else
|
29
|
+
relation.merge!(scope)
|
30
|
+
end
|
27
31
|
else
|
28
32
|
default_scoped
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
32
36
|
def scope_for_association(scope = relation) # :nodoc:
|
33
|
-
|
34
|
-
|
35
|
-
if current_scope && current_scope.empty_scope?
|
37
|
+
if current_scope&.empty_scope?
|
36
38
|
scope
|
37
39
|
else
|
38
40
|
default_scoped(scope)
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
42
|
-
|
44
|
+
# Returns a scope for the model with default scopes.
|
45
|
+
def default_scoped(scope = relation)
|
43
46
|
build_default_scope(scope) || scope
|
44
47
|
end
|
45
48
|
|
46
49
|
def default_extensions # :nodoc:
|
47
|
-
if scope =
|
50
|
+
if scope = scope_for_association || build_default_scope
|
48
51
|
scope.extensions
|
49
52
|
else
|
50
53
|
[]
|
@@ -54,7 +57,7 @@ module ActiveRecord
|
|
54
57
|
# Adds a class method for retrieving and querying objects.
|
55
58
|
# The method is intended to return an ActiveRecord::Relation
|
56
59
|
# object, which is composable with other scopes.
|
57
|
-
# If it returns nil or false
|
60
|
+
# If it returns +nil+ or +false+, an
|
58
61
|
# {all}[rdoc-ref:Scoping::Named::ClassMethods#all] scope is returned instead.
|
59
62
|
#
|
60
63
|
# A \scope represents a narrowing of a database query, such as
|
@@ -69,10 +72,6 @@ module ActiveRecord
|
|
69
72
|
# <tt>Shirt.dry_clean_only</tt>. <tt>Shirt.red</tt>, in effect,
|
70
73
|
# represents the query <tt>Shirt.where(color: 'red')</tt>.
|
71
74
|
#
|
72
|
-
# You should always pass a callable object to the scopes defined
|
73
|
-
# with #scope. This ensures that the scope is re-evaluated each
|
74
|
-
# time it is called.
|
75
|
-
#
|
76
75
|
# Note that this is simply 'syntactic sugar' for defining an actual
|
77
76
|
# class method:
|
78
77
|
#
|
@@ -154,7 +153,7 @@ module ActiveRecord
|
|
154
153
|
# Article.featured.titles
|
155
154
|
def scope(name, body, &block)
|
156
155
|
unless body.respond_to?(:call)
|
157
|
-
raise ArgumentError,
|
156
|
+
raise ArgumentError, "The scope body needs to be callable."
|
158
157
|
end
|
159
158
|
|
160
159
|
if dangerous_class_method?(name)
|
@@ -163,34 +162,44 @@ module ActiveRecord
|
|
163
162
|
"a class method with the same name."
|
164
163
|
end
|
165
164
|
|
165
|
+
if method_defined_within?(name, Relation)
|
166
|
+
raise ArgumentError, "You tried to define a scope named \"#{name}\" " \
|
167
|
+
"on the model \"#{self.name}\", but ActiveRecord::Relation already defined " \
|
168
|
+
"an instance method with the same name."
|
169
|
+
end
|
170
|
+
|
166
171
|
valid_scope_name?(name)
|
167
172
|
extension = Module.new(&block) if block
|
168
173
|
|
169
174
|
if body.respond_to?(:to_proc)
|
170
|
-
singleton_class.
|
171
|
-
scope = all.
|
175
|
+
singleton_class.define_method(name) do |*args|
|
176
|
+
scope = all._exec_scope(*args, &body)
|
172
177
|
scope = scope.extending(extension) if extension
|
173
|
-
|
174
|
-
scope || all
|
178
|
+
scope
|
175
179
|
end
|
176
180
|
else
|
177
|
-
singleton_class.
|
178
|
-
scope =
|
181
|
+
singleton_class.define_method(name) do |*args|
|
182
|
+
scope = body.call(*args) || all
|
179
183
|
scope = scope.extending(extension) if extension
|
180
|
-
|
181
|
-
scope || all
|
184
|
+
scope
|
182
185
|
end
|
183
186
|
end
|
187
|
+
singleton_class.send(:ruby2_keywords, name) if respond_to?(:ruby2_keywords, true)
|
188
|
+
|
189
|
+
generate_relation_method(name)
|
184
190
|
end
|
185
191
|
|
186
|
-
|
192
|
+
private
|
193
|
+
def singleton_method_added(name)
|
194
|
+
generate_relation_method(name) if Kernel.respond_to?(name) && !ActiveRecord::Relation.method_defined?(name)
|
195
|
+
end
|
187
196
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
197
|
+
def valid_scope_name?(name)
|
198
|
+
if respond_to?(name, true) && logger
|
199
|
+
logger.warn "Creating scope :#{name}. " \
|
200
|
+
"Overwriting existing method #{self.name}.#{name}."
|
201
|
+
end
|
192
202
|
end
|
193
|
-
end
|
194
203
|
end
|
195
204
|
end
|
196
205
|
end
|