activerecord 4.2.0 → 6.0.5.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +852 -801
- data/MIT-LICENSE +4 -2
- data/README.rdoc +14 -13
- data/examples/performance.rb +33 -32
- data/examples/simple.rb +5 -4
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +267 -249
- data/lib/active_record/association_relation.rb +26 -6
- data/lib/active_record/associations/alias_tracker.rb +29 -36
- data/lib/active_record/associations/association.rb +137 -55
- data/lib/active_record/associations/association_scope.rb +110 -132
- data/lib/active_record/associations/belongs_to_association.rb +67 -54
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +27 -40
- data/lib/active_record/associations/builder/belongs_to.rb +69 -55
- data/lib/active_record/associations/builder/collection_association.rb +10 -29
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +58 -70
- data/lib/active_record/associations/builder/has_many.rb +8 -4
- data/lib/active_record/associations/builder/has_one.rb +46 -5
- data/lib/active_record/associations/builder/singular_association.rb +16 -10
- data/lib/active_record/associations/collection_association.rb +150 -275
- data/lib/active_record/associations/collection_proxy.rb +253 -152
- data/lib/active_record/associations/foreign_association.rb +20 -0
- data/lib/active_record/associations/has_many_association.rb +35 -84
- data/lib/active_record/associations/has_many_through_association.rb +62 -80
- data/lib/active_record/associations/has_one_association.rb +62 -49
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +43 -78
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
- data/lib/active_record/associations/join_dependency.rb +159 -162
- data/lib/active_record/associations/preloader/association.rb +102 -113
- data/lib/active_record/associations/preloader/through_association.rb +85 -65
- data/lib/active_record/associations/preloader.rb +96 -95
- data/lib/active_record/associations/singular_association.rb +18 -45
- data/lib/active_record/associations/through_association.rb +49 -24
- data/lib/active_record/associations.rb +1737 -1596
- data/lib/active_record/attribute_assignment.rb +57 -185
- data/lib/active_record/attribute_decorators.rb +39 -17
- data/lib/active_record/attribute_methods/before_type_cast.rb +14 -5
- data/lib/active_record/attribute_methods/dirty.rb +174 -134
- data/lib/active_record/attribute_methods/primary_key.rb +90 -84
- data/lib/active_record/attribute_methods/query.rb +6 -5
- data/lib/active_record/attribute_methods/read.rb +20 -77
- data/lib/active_record/attribute_methods/serialization.rb +40 -21
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -37
- data/lib/active_record/attribute_methods/write.rb +33 -56
- data/lib/active_record/attribute_methods.rb +124 -143
- data/lib/active_record/attributes.rb +213 -74
- data/lib/active_record/autosave_association.rb +125 -54
- data/lib/active_record/base.rb +60 -49
- data/lib/active_record/callbacks.rb +101 -76
- data/lib/active_record/coders/json.rb +3 -1
- data/lib/active_record/coders/yaml_column.rb +36 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +810 -291
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +253 -108
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
- data/lib/active_record/connection_adapters/abstract/quoting.rb +171 -53
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +6 -4
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +383 -239
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +736 -235
- data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -87
- data/lib/active_record/connection_adapters/abstract_adapter.rb +487 -192
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +536 -600
- data/lib/active_record/connection_adapters/column.rb +56 -43
- data/lib/active_record/connection_adapters/connection_specification.rb +174 -153
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +196 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +59 -196
- data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +71 -115
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -57
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +5 -2
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +17 -13
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +6 -3
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -20
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
- data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +70 -34
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +67 -51
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -5
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +465 -291
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +565 -363
- data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +299 -364
- data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
- data/lib/active_record/connection_handling.rb +167 -41
- data/lib/active_record/core.rb +277 -233
- data/lib/active_record/counter_cache.rb +71 -50
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/database_configurations.rb +233 -0
- data/lib/active_record/define_callbacks.rb +22 -0
- data/lib/active_record/dynamic_matchers.rb +87 -106
- data/lib/active_record/enum.rb +172 -89
- data/lib/active_record/errors.rb +189 -53
- data/lib/active_record/explain.rb +22 -11
- data/lib/active_record/explain_registry.rb +4 -2
- data/lib/active_record/explain_subscriber.rb +11 -6
- data/lib/active_record/fixture_set/file.rb +35 -9
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +225 -497
- data/lib/active_record/gem_version.rb +6 -4
- data/lib/active_record/inheritance.rb +158 -115
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +123 -29
- data/lib/active_record/internal_metadata.rb +53 -0
- data/lib/active_record/legacy_yaml_adapter.rb +48 -0
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +99 -98
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +76 -33
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
- data/lib/active_record/middleware/database_selector.rb +74 -0
- data/lib/active_record/migration/command_recorder.rb +166 -91
- data/lib/active_record/migration/compatibility.rb +244 -0
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +636 -290
- data/lib/active_record/model_schema.rb +344 -112
- data/lib/active_record/nested_attributes.rb +265 -215
- data/lib/active_record/no_touching.rb +15 -2
- data/lib/active_record/null_relation.rb +24 -38
- data/lib/active_record/persistence.rb +559 -125
- data/lib/active_record/query_cache.rb +19 -23
- data/lib/active_record/querying.rb +44 -30
- data/lib/active_record/railtie.rb +166 -47
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +341 -202
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +461 -302
- data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
- data/lib/active_record/relation/batches.rb +206 -55
- data/lib/active_record/relation/calculations.rb +270 -249
- data/lib/active_record/relation/delegation.rb +76 -84
- data/lib/active_record/relation/finder_methods.rb +287 -255
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +86 -68
- data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -25
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
- data/lib/active_record/relation/predicate_builder.rb +112 -92
- data/lib/active_record/relation/query_attribute.rb +50 -0
- data/lib/active_record/relation/query_methods.rb +612 -392
- data/lib/active_record/relation/record_fetch_warning.rb +51 -0
- data/lib/active_record/relation/spawn_methods.rb +18 -17
- data/lib/active_record/relation/where_clause.rb +189 -0
- data/lib/active_record/relation/where_clause_factory.rb +33 -0
- data/lib/active_record/relation.rb +533 -340
- data/lib/active_record/result.rb +79 -43
- data/lib/active_record/runtime_registry.rb +6 -4
- data/lib/active_record/sanitization.rb +144 -121
- data/lib/active_record/schema.rb +21 -24
- data/lib/active_record/schema_dumper.rb +112 -93
- data/lib/active_record/schema_migration.rb +24 -20
- data/lib/active_record/scoping/default.rb +98 -82
- data/lib/active_record/scoping/named.rb +91 -33
- data/lib/active_record/scoping.rb +45 -27
- data/lib/active_record/secure_token.rb +40 -0
- data/lib/active_record/serialization.rb +5 -5
- data/lib/active_record/statement_cache.rb +73 -36
- data/lib/active_record/store.rb +127 -42
- data/lib/active_record/suppressor.rb +61 -0
- data/lib/active_record/table_metadata.rb +90 -0
- data/lib/active_record/tasks/database_tasks.rb +309 -99
- data/lib/active_record/tasks/mysql_database_tasks.rb +58 -89
- data/lib/active_record/tasks/postgresql_database_tasks.rb +81 -31
- data/lib/active_record/tasks/sqlite_database_tasks.rb +37 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +243 -0
- data/lib/active_record/timestamp.rb +86 -41
- data/lib/active_record/touch_later.rb +65 -0
- data/lib/active_record/transactions.rb +222 -146
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +126 -0
- data/lib/active_record/type/date.rb +4 -41
- data/lib/active_record/type/date_time.rb +4 -38
- data/lib/active_record/type/decimal_without_scale.rb +6 -2
- data/lib/active_record/type/hash_lookup_type_map.rb +12 -5
- data/lib/active_record/type/internal/timezone.rb +17 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +29 -15
- data/lib/active_record/type/text.rb +2 -2
- data/lib/active_record/type/time.rb +21 -16
- data/lib/active_record/type/type_map.rb +16 -19
- data/lib/active_record/type/unsigned_integer.rb +9 -8
- data/lib/active_record/type.rb +77 -23
- data/lib/active_record/type_caster/connection.rb +34 -0
- data/lib/active_record/type_caster/map.rb +20 -0
- data/lib/active_record/type_caster.rb +9 -0
- data/lib/active_record/validations/absence.rb +25 -0
- data/lib/active_record/validations/associated.rb +12 -4
- data/lib/active_record/validations/length.rb +26 -0
- data/lib/active_record/validations/presence.rb +14 -13
- data/lib/active_record/validations/uniqueness.rb +43 -46
- data/lib/active_record/validations.rb +38 -35
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +44 -21
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/attributes.rb +22 -0
- data/lib/arel/collectors/bind.rb +24 -0
- data/lib/arel/collectors/composite.rb +31 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +20 -0
- data/lib/arel/collectors/substitute_binds.rb +28 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +52 -0
- data/lib/arel/nodes/bind_param.rb +36 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +50 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +18 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +8 -0
- data/lib/arel/nodes/in.rb +8 -0
- data/lib/arel/nodes/infix_operation.rb +80 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +50 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +16 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +27 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +45 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +68 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +256 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/depth_first.rb +203 -0
- data/lib/arel/visitors/dot.rb +296 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +156 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +158 -0
- data/lib/arel/visitors/oracle12.rb +65 -0
- data/lib/arel/visitors/postgresql.rb +109 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +888 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors/where_sql.rb +22 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +62 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -8
- data/lib/rails/generators/active_record/migration.rb +30 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +174 -63
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -24
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -23
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -21
- data/lib/active_record/attribute.rb +0 -149
- data/lib/active_record/attribute_set/builder.rb +0 -86
- data/lib/active_record/attribute_set.rb +0 -77
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
- data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
- data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
- data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/serializers/xml_serializer.rb +0 -193
- data/lib/active_record/type/big_integer.rb +0 -13
- data/lib/active_record/type/binary.rb +0 -50
- data/lib/active_record/type/boolean.rb +0 -30
- data/lib/active_record/type/decimal.rb +0 -40
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -55
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -36
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/value.rb +0 -101
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -22
- data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
- /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,5 +1,6 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "stringio"
|
3
4
|
|
4
5
|
module ActiveRecord
|
5
6
|
# = Active Record Schema Dumper
|
@@ -12,14 +13,19 @@ module ActiveRecord
|
|
12
13
|
##
|
13
14
|
# :singleton-method:
|
14
15
|
# A list of tables which should not be dumped to the schema.
|
15
|
-
# Acceptable values are strings as well as regexp.
|
16
|
-
#
|
17
|
-
cattr_accessor :ignore_tables
|
18
|
-
|
16
|
+
# Acceptable values are strings as well as regexp if ActiveRecord::Base.schema_format == :ruby.
|
17
|
+
# Only strings are accepted if ActiveRecord::Base.schema_format == :sql.
|
18
|
+
cattr_accessor :ignore_tables, default: []
|
19
|
+
|
20
|
+
##
|
21
|
+
# :singleton-method:
|
22
|
+
# Specify a custom regular expression matching foreign keys which name
|
23
|
+
# should not be dumped to db/schema.rb.
|
24
|
+
cattr_accessor :fk_ignore_pattern, default: /^fk_rails_[0-9a-f]{10}$/
|
19
25
|
|
20
26
|
class << self
|
21
|
-
def dump(connection=ActiveRecord::Base.connection, stream=STDOUT, config = ActiveRecord::Base)
|
22
|
-
|
27
|
+
def dump(connection = ActiveRecord::Base.connection, stream = STDOUT, config = ActiveRecord::Base)
|
28
|
+
connection.create_schema_dumper(generate_options(config)).dump(stream)
|
23
29
|
stream
|
24
30
|
end
|
25
31
|
|
@@ -41,31 +47,36 @@ module ActiveRecord
|
|
41
47
|
end
|
42
48
|
|
43
49
|
private
|
50
|
+
attr_accessor :table_name
|
44
51
|
|
45
52
|
def initialize(connection, options = {})
|
46
53
|
@connection = connection
|
47
|
-
@
|
48
|
-
@version = Migrator::current_version rescue nil
|
54
|
+
@version = connection.migration_context.current_version rescue nil
|
49
55
|
@options = options
|
50
56
|
end
|
51
57
|
|
52
|
-
|
53
|
-
|
58
|
+
# turns 20170404131909 into "2017_04_04_131909"
|
59
|
+
def formatted_version
|
60
|
+
stringified = @version.to_s
|
61
|
+
return stringified unless stringified.length == 14
|
62
|
+
stringified.insert(4, "_").insert(7, "_").insert(10, "_")
|
63
|
+
end
|
54
64
|
|
55
|
-
|
56
|
-
|
57
|
-
|
65
|
+
def define_params
|
66
|
+
@version ? "version: #{formatted_version}" : ""
|
67
|
+
end
|
58
68
|
|
69
|
+
def header(stream)
|
59
70
|
stream.puts <<HEADER
|
60
71
|
# This file is auto-generated from the current state of the database. Instead
|
61
72
|
# of editing this file, please use the migrations feature of Active Record to
|
62
73
|
# incrementally modify your database, and then regenerate this schema definition.
|
63
74
|
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
# from scratch.
|
68
|
-
#
|
75
|
+
# This file is the source Rails uses to define your schema when running `rails
|
76
|
+
# db:schema:load`. When creating a new database, `rails db:schema:load` tends to
|
77
|
+
# be faster and is potentially less error prone than running all of your
|
78
|
+
# migrations from scratch. Old migrations may fail to apply correctly if those
|
79
|
+
# migrations use external dependencies or application code.
|
69
80
|
#
|
70
81
|
# It's strongly recommended that you check this file into your version control system.
|
71
82
|
|
@@ -78,16 +89,8 @@ HEADER
|
|
78
89
|
stream.puts "end"
|
79
90
|
end
|
80
91
|
|
92
|
+
# extensions are only supported by PostgreSQL
|
81
93
|
def extensions(stream)
|
82
|
-
return unless @connection.supports_extensions?
|
83
|
-
extensions = @connection.extensions
|
84
|
-
if extensions.any?
|
85
|
-
stream.puts " # These are extensions that must be enabled in order to support this database"
|
86
|
-
extensions.each do |extension|
|
87
|
-
stream.puts " enable_extension #{extension.inspect}"
|
88
|
-
end
|
89
|
-
stream.puts
|
90
|
-
end
|
91
94
|
end
|
92
95
|
|
93
96
|
def tables(stream)
|
@@ -108,99 +111,72 @@ HEADER
|
|
108
111
|
def table(table, stream)
|
109
112
|
columns = @connection.columns(table)
|
110
113
|
begin
|
114
|
+
self.table_name = table
|
115
|
+
|
111
116
|
tbl = StringIO.new
|
112
117
|
|
113
118
|
# first dump primary key column
|
114
119
|
pk = @connection.primary_key(table)
|
115
120
|
|
116
121
|
tbl.print " create_table #{remove_prefix_and_suffix(table).inspect}"
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
tbl.print ",
|
125
|
-
tbl.print %Q(, default: "#{pkcol.default_function}") if pkcol.default_function
|
122
|
+
|
123
|
+
case pk
|
124
|
+
when String
|
125
|
+
tbl.print ", primary_key: #{pk.inspect}" unless pk == "id"
|
126
|
+
pkcol = columns.detect { |c| c.name == pk }
|
127
|
+
pkcolspec = column_spec_for_primary_key(pkcol)
|
128
|
+
if pkcolspec.present?
|
129
|
+
tbl.print ", #{format_colspec(pkcolspec)}"
|
126
130
|
end
|
131
|
+
when Array
|
132
|
+
tbl.print ", primary_key: #{pk.inspect}"
|
127
133
|
else
|
128
134
|
tbl.print ", id: false"
|
129
135
|
end
|
130
|
-
|
131
|
-
|
136
|
+
|
137
|
+
table_options = @connection.table_options(table)
|
138
|
+
if table_options.present?
|
139
|
+
tbl.print ", #{format_options(table_options)}"
|
140
|
+
end
|
141
|
+
|
142
|
+
tbl.puts ", force: :cascade do |t|"
|
132
143
|
|
133
144
|
# then dump all non-primary key columns
|
134
|
-
|
145
|
+
columns.each do |column|
|
135
146
|
raise StandardError, "Unknown type '#{column.sql_type}' for column '#{column.name}'" unless @connection.valid_type?(column.type)
|
136
147
|
next if column.name == pk
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
lengths = keys.map { |key|
|
145
|
-
column_specs.map { |spec|
|
146
|
-
spec[key] ? spec[key].length + 2 : 0
|
147
|
-
}.max
|
148
|
-
}
|
149
|
-
|
150
|
-
# the string we're going to sprintf our values against, with standardized column widths
|
151
|
-
format_string = lengths.map{ |len| "%-#{len}s" }
|
152
|
-
|
153
|
-
# find the max length for the 'type' column, which is special
|
154
|
-
type_length = column_specs.map{ |column| column[:type].length }.max
|
155
|
-
|
156
|
-
# add column type definition to our format string
|
157
|
-
format_string.unshift " t.%-#{type_length}s "
|
158
|
-
|
159
|
-
format_string *= ''
|
160
|
-
|
161
|
-
column_specs.each do |colspec|
|
162
|
-
values = keys.zip(lengths).map{ |key, len| colspec.key?(key) ? colspec[key] + ", " : " " * len }
|
163
|
-
values.unshift colspec[:type]
|
164
|
-
tbl.print((format_string % values).gsub(/,\s*$/, ''))
|
148
|
+
type, colspec = column_spec(column)
|
149
|
+
if type.is_a?(Symbol)
|
150
|
+
tbl.print " t.#{type} #{column.name.inspect}"
|
151
|
+
else
|
152
|
+
tbl.print " t.column #{column.name.inspect}, #{type.inspect}"
|
153
|
+
end
|
154
|
+
tbl.print ", #{format_colspec(colspec)}" if colspec.present?
|
165
155
|
tbl.puts
|
166
156
|
end
|
167
157
|
|
158
|
+
indexes_in_create(table, tbl)
|
159
|
+
|
168
160
|
tbl.puts " end"
|
169
161
|
tbl.puts
|
170
162
|
|
171
|
-
indexes(table, tbl)
|
172
|
-
|
173
163
|
tbl.rewind
|
174
164
|
stream.print tbl.read
|
175
165
|
rescue => e
|
176
166
|
stream.puts "# Could not dump table #{table.inspect} because of following #{e.class}"
|
177
167
|
stream.puts "# #{e.message}"
|
178
168
|
stream.puts
|
169
|
+
ensure
|
170
|
+
self.table_name = nil
|
179
171
|
end
|
180
|
-
|
181
|
-
stream
|
182
172
|
end
|
183
173
|
|
174
|
+
# Keep it for indexing materialized views
|
184
175
|
def indexes(table, stream)
|
185
176
|
if (indexes = @connection.indexes(table)).any?
|
186
177
|
add_index_statements = indexes.map do |index|
|
187
|
-
|
188
|
-
|
189
|
-
index.columns.inspect,
|
190
|
-
"name: #{index.name.inspect}",
|
191
|
-
]
|
192
|
-
statement_parts << 'unique: true' if index.unique
|
193
|
-
|
194
|
-
index_lengths = (index.lengths || []).compact
|
195
|
-
statement_parts << "length: #{Hash[index.columns.zip(index.lengths)].inspect}" if index_lengths.any?
|
196
|
-
|
197
|
-
index_orders = index.orders || {}
|
198
|
-
statement_parts << "order: #{index.orders.inspect}" if index_orders.any?
|
199
|
-
statement_parts << "where: #{index.where.inspect}" if index.where
|
200
|
-
statement_parts << "using: #{index.using.inspect}" if index.using
|
201
|
-
statement_parts << "type: #{index.type.inspect}" if index.type
|
202
|
-
|
203
|
-
" #{statement_parts.join(', ')}"
|
178
|
+
table_name = remove_prefix_and_suffix(index.table).inspect
|
179
|
+
" add_index #{([table_name] + index_parts(index)).join(', ')}"
|
204
180
|
end
|
205
181
|
|
206
182
|
stream.puts add_index_statements.sort.join("\n")
|
@@ -208,6 +184,31 @@ HEADER
|
|
208
184
|
end
|
209
185
|
end
|
210
186
|
|
187
|
+
def indexes_in_create(table, stream)
|
188
|
+
if (indexes = @connection.indexes(table)).any?
|
189
|
+
index_statements = indexes.map do |index|
|
190
|
+
" t.index #{index_parts(index).join(', ')}"
|
191
|
+
end
|
192
|
+
stream.puts index_statements.sort.join("\n")
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def index_parts(index)
|
197
|
+
index_parts = [
|
198
|
+
index.columns.inspect,
|
199
|
+
"name: #{index.name.inspect}",
|
200
|
+
]
|
201
|
+
index_parts << "unique: true" if index.unique
|
202
|
+
index_parts << "length: #{format_index_parts(index.lengths)}" if index.lengths.present?
|
203
|
+
index_parts << "order: #{format_index_parts(index.orders)}" if index.orders.present?
|
204
|
+
index_parts << "opclass: #{format_index_parts(index.opclasses)}" if index.opclasses.present?
|
205
|
+
index_parts << "where: #{index.where.inspect}" if index.where
|
206
|
+
index_parts << "using: #{index.using.inspect}" if !@connection.default_index_type?(index)
|
207
|
+
index_parts << "type: #{index.type.inspect}" if index.type
|
208
|
+
index_parts << "comment: #{index.comment.inspect}" if index.comment
|
209
|
+
index_parts
|
210
|
+
end
|
211
|
+
|
211
212
|
def foreign_keys(table, stream)
|
212
213
|
if (foreign_keys = @connection.foreign_keys(table)).any?
|
213
214
|
add_foreign_key_statements = foreign_keys.map do |foreign_key|
|
@@ -224,7 +225,7 @@ HEADER
|
|
224
225
|
parts << "primary_key: #{foreign_key.primary_key.inspect}"
|
225
226
|
end
|
226
227
|
|
227
|
-
if foreign_key.
|
228
|
+
if foreign_key.export_name_on_schema_dump?
|
228
229
|
parts << "name: #{foreign_key.name.inspect}"
|
229
230
|
end
|
230
231
|
|
@@ -238,12 +239,30 @@ HEADER
|
|
238
239
|
end
|
239
240
|
end
|
240
241
|
|
242
|
+
def format_colspec(colspec)
|
243
|
+
colspec.map { |key, value| "#{key}: #{value}" }.join(", ")
|
244
|
+
end
|
245
|
+
|
246
|
+
def format_options(options)
|
247
|
+
options.map { |key, value| "#{key}: #{value.inspect}" }.join(", ")
|
248
|
+
end
|
249
|
+
|
250
|
+
def format_index_parts(options)
|
251
|
+
if options.is_a?(Hash)
|
252
|
+
"{ #{format_options(options)} }"
|
253
|
+
else
|
254
|
+
options.inspect
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
241
258
|
def remove_prefix_and_suffix(table)
|
242
|
-
|
259
|
+
prefix = Regexp.escape(@options[:table_name_prefix].to_s)
|
260
|
+
suffix = Regexp.escape(@options[:table_name_suffix].to_s)
|
261
|
+
table.sub(/\A#{prefix}(.+)#{suffix}\z/, "\\1")
|
243
262
|
end
|
244
263
|
|
245
264
|
def ignored?(table_name)
|
246
|
-
[
|
265
|
+
[ActiveRecord::Base.schema_migrations_table_name, ActiveRecord::Base.internal_metadata_table_name, ignore_tables].flatten.any? do |ignored|
|
247
266
|
ignored === remove_prefix_and_suffix(table_name)
|
248
267
|
end
|
249
268
|
end
|
@@ -1,43 +1,43 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_record/scoping/default"
|
4
|
+
require "active_record/scoping/named"
|
4
5
|
|
5
6
|
module ActiveRecord
|
6
|
-
class
|
7
|
+
# This class is used to create a table that keeps track of which migrations
|
8
|
+
# have been applied to a given database. When a migration is run, its schema
|
9
|
+
# number is inserted in to the `SchemaMigration.table_name` so it doesn't need
|
10
|
+
# to be executed the next time.
|
11
|
+
class SchemaMigration < ActiveRecord::Base # :nodoc:
|
7
12
|
class << self
|
8
|
-
def
|
9
|
-
|
13
|
+
def _internal?
|
14
|
+
true
|
10
15
|
end
|
11
16
|
|
12
|
-
def
|
13
|
-
"
|
17
|
+
def primary_key
|
18
|
+
"version"
|
14
19
|
end
|
15
20
|
|
16
|
-
def
|
17
|
-
"#{table_name_prefix}
|
21
|
+
def table_name
|
22
|
+
"#{table_name_prefix}#{schema_migrations_table_name}#{table_name_suffix}"
|
18
23
|
end
|
19
24
|
|
20
25
|
def table_exists?
|
21
26
|
connection.table_exists?(table_name)
|
22
27
|
end
|
23
28
|
|
24
|
-
def create_table
|
29
|
+
def create_table
|
25
30
|
unless table_exists?
|
26
|
-
version_options =
|
27
|
-
version_options[:limit] = limit if limit
|
31
|
+
version_options = connection.internal_string_options_for_primary_key
|
28
32
|
|
29
33
|
connection.create_table(table_name, id: false) do |t|
|
30
|
-
t.
|
34
|
+
t.string :version, **version_options
|
31
35
|
end
|
32
|
-
connection.add_index table_name, :version, unique: true, name: index_name
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
36
39
|
def drop_table
|
37
|
-
|
38
|
-
connection.remove_index table_name, name: index_name
|
39
|
-
connection.drop_table(table_name)
|
40
|
-
end
|
40
|
+
connection.drop_table table_name, if_exists: true
|
41
41
|
end
|
42
42
|
|
43
43
|
def normalize_migration_number(number)
|
@@ -45,7 +45,11 @@ module ActiveRecord
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def normalized_versions
|
48
|
-
|
48
|
+
all_versions.map { |v| normalize_migration_number v }
|
49
|
+
end
|
50
|
+
|
51
|
+
def all_versions
|
52
|
+
order(:version).pluck(:version)
|
49
53
|
end
|
50
54
|
end
|
51
55
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Scoping
|
3
5
|
module Default
|
@@ -5,9 +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
|
-
|
10
|
-
self.default_scopes = []
|
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
|
11
12
|
end
|
12
13
|
|
13
14
|
module ClassMethods
|
@@ -15,7 +16,7 @@ module ActiveRecord
|
|
15
16
|
#
|
16
17
|
# class Post < ActiveRecord::Base
|
17
18
|
# def self.default_scope
|
18
|
-
# where
|
19
|
+
# where(published: true)
|
19
20
|
# end
|
20
21
|
# end
|
21
22
|
#
|
@@ -33,101 +34,116 @@ module ActiveRecord
|
|
33
34
|
block_given? ? relation.scoping { yield } : relation
|
34
35
|
end
|
35
36
|
|
37
|
+
# Are there attributes associated with this scope?
|
38
|
+
def scope_attributes? # :nodoc:
|
39
|
+
super || default_scopes.any? || respond_to?(:default_scope)
|
40
|
+
end
|
41
|
+
|
36
42
|
def before_remove_const #:nodoc:
|
37
43
|
self.current_scope = nil
|
38
44
|
end
|
39
45
|
|
40
|
-
|
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?
|
41
90
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
# Article.all # => SELECT * FROM articles WHERE published = true
|
50
|
-
#
|
51
|
-
# The +default_scope+ is also applied while creating/building a record.
|
52
|
-
# It is not applied while updating a record.
|
53
|
-
#
|
54
|
-
# Article.new.published # => true
|
55
|
-
# Article.create.published # => true
|
56
|
-
#
|
57
|
-
# (You can also pass any object which responds to +call+ to the
|
58
|
-
# +default_scope+ macro, and it will be called when building the
|
59
|
-
# default scope.)
|
60
|
-
#
|
61
|
-
# If you use multiple +default_scope+ declarations in your model then
|
62
|
-
# they will be merged together:
|
63
|
-
#
|
64
|
-
# class Article < ActiveRecord::Base
|
65
|
-
# default_scope { where(published: true) }
|
66
|
-
# default_scope { where(rating: 'G') }
|
67
|
-
# end
|
68
|
-
#
|
69
|
-
# Article.all # => SELECT * FROM articles WHERE published = true AND rating = 'G'
|
70
|
-
#
|
71
|
-
# This is also the case with inheritance and module includes where the
|
72
|
-
# parent or module defines a +default_scope+ and the child or including
|
73
|
-
# class defines a second one.
|
74
|
-
#
|
75
|
-
# If you need to do more complex things with a default scope, you can
|
76
|
-
# alternatively define it as a class method:
|
77
|
-
#
|
78
|
-
# class Article < ActiveRecord::Base
|
79
|
-
# def self.default_scope
|
80
|
-
# # Should return a scope, you can call 'super' here etc.
|
81
|
-
# end
|
82
|
-
# end
|
83
|
-
def default_scope(scope = nil)
|
84
|
-
scope = Proc.new if block_given?
|
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
|
85
98
|
|
86
|
-
|
87
|
-
raise ArgumentError,
|
88
|
-
"Support for calling #default_scope without a block is removed. For example instead " \
|
89
|
-
"of `default_scope where(color: 'red')`, please use " \
|
90
|
-
"`default_scope { where(color: 'red') }`. (Alternatively you can just redefine " \
|
91
|
-
"self.default_scope.)"
|
99
|
+
self.default_scopes += [scope]
|
92
100
|
end
|
93
101
|
|
94
|
-
|
95
|
-
|
102
|
+
def build_default_scope(relation = relation())
|
103
|
+
return if abstract_class?
|
104
|
+
|
105
|
+
if default_scope_override.nil?
|
106
|
+
self.default_scope_override = !Base.is_a?(method(:default_scope).owner)
|
107
|
+
end
|
96
108
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
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
|
115
|
+
end
|
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
|
105
122
|
end
|
106
123
|
end
|
107
124
|
end
|
108
|
-
end
|
109
125
|
|
110
|
-
|
111
|
-
|
112
|
-
|
126
|
+
def ignore_default_scope?
|
127
|
+
ScopeRegistry.value_for(:ignore_default_scope, base_class)
|
128
|
+
end
|
113
129
|
|
114
|
-
|
115
|
-
|
116
|
-
|
130
|
+
def ignore_default_scope=(ignore)
|
131
|
+
ScopeRegistry.set_value_for(:ignore_default_scope, base_class, ignore)
|
132
|
+
end
|
117
133
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
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?
|
123
139
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
140
|
+
begin
|
141
|
+
self.ignore_default_scope = true
|
142
|
+
yield
|
143
|
+
ensure
|
144
|
+
self.ignore_default_scope = false
|
145
|
+
end
|
129
146
|
end
|
130
|
-
end
|
131
147
|
end
|
132
148
|
end
|
133
149
|
end
|