activerecord 4.2.9 → 6.1.4.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 +964 -1382
- data/MIT-LICENSE +4 -2
- data/README.rdoc +15 -14
- data/examples/performance.rb +33 -32
- data/examples/simple.rb +5 -4
- data/lib/active_record/aggregations.rb +266 -251
- data/lib/active_record/association_relation.rb +40 -15
- data/lib/active_record/associations/alias_tracker.rb +40 -43
- data/lib/active_record/associations/association.rb +162 -69
- data/lib/active_record/associations/association_scope.rb +105 -130
- data/lib/active_record/associations/belongs_to_association.rb +83 -65
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
- data/lib/active_record/associations/builder/association.rb +57 -43
- data/lib/active_record/associations/builder/belongs_to.rb +74 -57
- data/lib/active_record/associations/builder/collection_association.rb +15 -37
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +49 -66
- data/lib/active_record/associations/builder/has_many.rb +13 -5
- data/lib/active_record/associations/builder/has_one.rb +44 -6
- data/lib/active_record/associations/builder/singular_association.rb +16 -10
- data/lib/active_record/associations/collection_association.rb +148 -287
- data/lib/active_record/associations/collection_proxy.rb +252 -150
- data/lib/active_record/associations/foreign_association.rb +23 -1
- data/lib/active_record/associations/has_many_association.rb +56 -98
- data/lib/active_record/associations/has_many_through_association.rb +68 -89
- data/lib/active_record/associations/has_one_association.rb +73 -47
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +54 -81
- 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 +174 -169
- data/lib/active_record/associations/preloader/association.rb +108 -115
- data/lib/active_record/associations/preloader/through_association.rb +85 -65
- data/lib/active_record/associations/preloader.rb +97 -94
- data/lib/active_record/associations/singular_association.rb +18 -39
- data/lib/active_record/associations/through_association.rb +39 -19
- data/lib/active_record/associations.rb +1845 -1598
- data/lib/active_record/attribute_assignment.rb +59 -185
- data/lib/active_record/attribute_methods/before_type_cast.rb +18 -10
- data/lib/active_record/attribute_methods/dirty.rb +168 -148
- data/lib/active_record/attribute_methods/primary_key.rb +93 -83
- data/lib/active_record/attribute_methods/query.rb +8 -10
- data/lib/active_record/attribute_methods/read.rb +19 -79
- data/lib/active_record/attribute_methods/serialization.rb +49 -24
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +55 -36
- data/lib/active_record/attribute_methods/write.rb +24 -55
- data/lib/active_record/attribute_methods.rb +149 -154
- data/lib/active_record/attributes.rb +234 -78
- data/lib/active_record/autosave_association.rb +133 -60
- data/lib/active_record/base.rb +46 -46
- data/lib/active_record/callbacks.rb +234 -79
- data/lib/active_record/coders/json.rb +3 -1
- data/lib/active_record/coders/yaml_column.rb +34 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +887 -323
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +17 -41
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +292 -124
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +78 -24
- data/lib/active_record/connection_adapters/abstract/quoting.rb +177 -60
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +8 -6
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +157 -93
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +473 -255
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +869 -286
- data/lib/active_record/connection_adapters/abstract/transaction.rb +257 -91
- data/lib/active_record/connection_adapters/abstract_adapter.rb +483 -230
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +557 -640
- data/lib/active_record/connection_adapters/column.rb +67 -40
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +194 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +96 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +97 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +103 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +91 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +80 -192
- data/lib/active_record/connection_adapters/pool_config.rb +73 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +44 -11
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +75 -160
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -58
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +8 -6
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -19
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -20
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/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 -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 -5
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
- 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 +25 -25
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +145 -48
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -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 +496 -298
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +588 -375
- data/lib/active_record/connection_adapters/schema_cache.rb +167 -29
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -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 +21 -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 +170 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +322 -373
- data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
- data/lib/active_record/connection_adapters.rb +52 -0
- data/lib/active_record/connection_handling.rb +314 -41
- data/lib/active_record/core.rb +458 -241
- data/lib/active_record/counter_cache.rb +70 -49
- 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/database_configurations.rb +272 -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 -106
- data/lib/active_record/enum.rb +211 -92
- data/lib/active_record/errors.rb +224 -54
- data/lib/active_record/explain.rb +27 -11
- data/lib/active_record/explain_registry.rb +4 -2
- data/lib/active_record/explain_subscriber.rb +10 -5
- data/lib/active_record/fixture_set/file.rb +33 -14
- 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 +275 -500
- data/lib/active_record/gem_version.rb +6 -4
- data/lib/active_record/inheritance.rb +175 -110
- data/lib/active_record/insert_all.rb +212 -0
- data/lib/active_record/integration.rb +121 -29
- data/lib/active_record/internal_metadata.rb +62 -0
- data/lib/active_record/legacy_yaml_adapter.rb +27 -5
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +98 -92
- data/lib/active_record/locking/pessimistic.rb +22 -6
- data/lib/active_record/log_subscriber.rb +93 -31
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +77 -0
- data/lib/active_record/migration/command_recorder.rb +185 -90
- data/lib/active_record/migration/compatibility.rb +295 -0
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +673 -325
- data/lib/active_record/model_schema.rb +418 -113
- data/lib/active_record/nested_attributes.rb +263 -224
- data/lib/active_record/no_touching.rb +15 -2
- data/lib/active_record/null_relation.rb +24 -38
- data/lib/active_record/persistence.rb +572 -136
- data/lib/active_record/query_cache.rb +29 -23
- data/lib/active_record/querying.rb +50 -31
- data/lib/active_record/railtie.rb +170 -51
- data/lib/active_record/railties/console_sandbox.rb +3 -3
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +523 -199
- data/lib/active_record/readonly_attributes.rb +9 -4
- data/lib/active_record/reflection.rb +454 -291
- data/lib/active_record/relation/batches/batch_enumerator.rb +85 -0
- data/lib/active_record/relation/batches.rb +217 -59
- data/lib/active_record/relation/calculations.rb +324 -249
- data/lib/active_record/relation/delegation.rb +76 -84
- data/lib/active_record/relation/finder_methods.rb +316 -242
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +95 -103
- data/lib/active_record/relation/predicate_builder/array_handler.rb +26 -26
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -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 +57 -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 +136 -122
- data/lib/active_record/relation/query_attribute.rb +50 -0
- data/lib/active_record/relation/query_methods.rb +757 -413
- data/lib/active_record/relation/record_fetch_warning.rb +51 -0
- data/lib/active_record/relation/spawn_methods.rb +18 -20
- data/lib/active_record/relation/where_clause.rb +239 -0
- data/lib/active_record/relation.rb +554 -343
- data/lib/active_record/result.rb +91 -47
- data/lib/active_record/runtime_registry.rb +6 -4
- data/lib/active_record/sanitization.rb +134 -122
- data/lib/active_record/schema.rb +21 -24
- data/lib/active_record/schema_dumper.rb +141 -92
- data/lib/active_record/schema_migration.rb +24 -23
- data/lib/active_record/scoping/default.rb +96 -83
- data/lib/active_record/scoping/named.rb +78 -36
- data/lib/active_record/scoping.rb +45 -27
- data/lib/active_record/secure_token.rb +48 -0
- data/lib/active_record/serialization.rb +8 -6
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +89 -36
- data/lib/active_record/store.rb +128 -43
- data/lib/active_record/suppressor.rb +61 -0
- data/lib/active_record/table_metadata.rb +81 -0
- data/lib/active_record/tasks/database_tasks.rb +364 -130
- data/lib/active_record/tasks/mysql_database_tasks.rb +67 -113
- data/lib/active_record/tasks/postgresql_database_tasks.rb +86 -49
- data/lib/active_record/tasks/sqlite_database_tasks.rb +44 -19
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +287 -0
- data/lib/active_record/timestamp.rb +86 -43
- data/lib/active_record/touch_later.rb +65 -0
- data/lib/active_record/transactions.rb +182 -163
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +126 -0
- data/lib/active_record/type/date.rb +4 -45
- data/lib/active_record/type/date_time.rb +4 -49
- data/lib/active_record/type/decimal_without_scale.rb +6 -2
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- data/lib/active_record/type/internal/timezone.rb +17 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +27 -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 +84 -23
- data/lib/active_record/type_caster/connection.rb +33 -0
- data/lib/active_record/type_caster/map.rb +23 -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/numericality.rb +35 -0
- data/lib/active_record/validations/presence.rb +14 -13
- data/lib/active_record/validations/uniqueness.rb +63 -56
- data/lib/active_record/validations.rb +39 -35
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +42 -29
- 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/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 +76 -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/nodes.rb +70 -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/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/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +54 -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 +43 -37
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +26 -0
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +13 -4
- data/lib/rails/generators/active_record/migration.rb +35 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +55 -22
- 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.tt +22 -0
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +172 -65
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -24
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -23
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -21
- data/lib/active_record/attribute.rb +0 -163
- data/lib/active_record/attribute_decorators.rb +0 -66
- data/lib/active_record/attribute_set/builder.rb +0 -106
- data/lib/active_record/attribute_set.rb +0 -81
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -275
- 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 -31
- data/lib/active_record/type/decimal.rb +0 -64
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -59
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -40
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/value.rb +0 -110
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
- data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,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,25 @@ 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}$/
|
25
|
+
|
26
|
+
##
|
27
|
+
# :singleton-method:
|
28
|
+
# Specify a custom regular expression matching check constraints which name
|
29
|
+
# should not be dumped to db/schema.rb.
|
30
|
+
cattr_accessor :chk_ignore_pattern, default: /^chk_rails_[0-9a-f]{10}$/
|
19
31
|
|
20
32
|
class << self
|
21
|
-
def dump(connection=ActiveRecord::Base.connection, stream=STDOUT, config = ActiveRecord::Base)
|
22
|
-
|
33
|
+
def dump(connection = ActiveRecord::Base.connection, stream = STDOUT, config = ActiveRecord::Base)
|
34
|
+
connection.create_schema_dumper(generate_options(config)).dump(stream)
|
23
35
|
stream
|
24
36
|
end
|
25
37
|
|
@@ -41,31 +53,36 @@ module ActiveRecord
|
|
41
53
|
end
|
42
54
|
|
43
55
|
private
|
56
|
+
attr_accessor :table_name
|
44
57
|
|
45
58
|
def initialize(connection, options = {})
|
46
59
|
@connection = connection
|
47
|
-
@
|
48
|
-
@version = Migrator::current_version rescue nil
|
60
|
+
@version = connection.migration_context.current_version rescue nil
|
49
61
|
@options = options
|
50
62
|
end
|
51
63
|
|
52
|
-
|
53
|
-
|
64
|
+
# turns 20170404131909 into "2017_04_04_131909"
|
65
|
+
def formatted_version
|
66
|
+
stringified = @version.to_s
|
67
|
+
return stringified unless stringified.length == 14
|
68
|
+
stringified.insert(4, "_").insert(7, "_").insert(10, "_")
|
69
|
+
end
|
54
70
|
|
55
|
-
|
56
|
-
|
57
|
-
|
71
|
+
def define_params
|
72
|
+
@version ? "version: #{formatted_version}" : ""
|
73
|
+
end
|
58
74
|
|
75
|
+
def header(stream)
|
59
76
|
stream.puts <<HEADER
|
60
77
|
# This file is auto-generated from the current state of the database. Instead
|
61
78
|
# of editing this file, please use the migrations feature of Active Record to
|
62
79
|
# incrementally modify your database, and then regenerate this schema definition.
|
63
80
|
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
# from scratch.
|
68
|
-
#
|
81
|
+
# This file is the source Rails uses to define your schema when running `bin/rails
|
82
|
+
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
|
83
|
+
# be faster and is potentially less error prone than running all of your
|
84
|
+
# migrations from scratch. Old migrations may fail to apply correctly if those
|
85
|
+
# migrations use external dependencies or application code.
|
69
86
|
#
|
70
87
|
# It's strongly recommended that you check this file into your version control system.
|
71
88
|
|
@@ -78,16 +95,8 @@ HEADER
|
|
78
95
|
stream.puts "end"
|
79
96
|
end
|
80
97
|
|
98
|
+
# extensions are only supported by PostgreSQL
|
81
99
|
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
100
|
end
|
92
101
|
|
93
102
|
def tables(stream)
|
@@ -108,103 +117,123 @@ HEADER
|
|
108
117
|
def table(table, stream)
|
109
118
|
columns = @connection.columns(table)
|
110
119
|
begin
|
120
|
+
self.table_name = table
|
121
|
+
|
111
122
|
tbl = StringIO.new
|
112
123
|
|
113
124
|
# first dump primary key column
|
114
125
|
pk = @connection.primary_key(table)
|
115
126
|
|
116
127
|
tbl.print " create_table #{remove_prefix_and_suffix(table).inspect}"
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
128
|
+
|
129
|
+
case pk
|
130
|
+
when String
|
131
|
+
tbl.print ", primary_key: #{pk.inspect}" unless pk == "id"
|
132
|
+
pkcol = columns.detect { |c| c.name == pk }
|
133
|
+
pkcolspec = column_spec_for_primary_key(pkcol)
|
134
|
+
unless pkcolspec.empty?
|
135
|
+
if pkcolspec != pkcolspec.slice(:id, :default)
|
136
|
+
pkcolspec = { id: { type: pkcolspec.delete(:id), **pkcolspec }.compact }
|
137
|
+
end
|
138
|
+
tbl.print ", #{format_colspec(pkcolspec)}"
|
126
139
|
end
|
140
|
+
when Array
|
141
|
+
tbl.print ", primary_key: #{pk.inspect}"
|
127
142
|
else
|
128
143
|
tbl.print ", id: false"
|
129
144
|
end
|
130
|
-
|
131
|
-
|
145
|
+
|
146
|
+
table_options = @connection.table_options(table)
|
147
|
+
if table_options.present?
|
148
|
+
tbl.print ", #{format_options(table_options)}"
|
149
|
+
end
|
150
|
+
|
151
|
+
tbl.puts ", force: :cascade do |t|"
|
132
152
|
|
133
153
|
# then dump all non-primary key columns
|
134
|
-
|
154
|
+
columns.each do |column|
|
135
155
|
raise StandardError, "Unknown type '#{column.sql_type}' for column '#{column.name}'" unless @connection.valid_type?(column.type)
|
136
156
|
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*$/, ''))
|
157
|
+
type, colspec = column_spec(column)
|
158
|
+
if type.is_a?(Symbol)
|
159
|
+
tbl.print " t.#{type} #{column.name.inspect}"
|
160
|
+
else
|
161
|
+
tbl.print " t.column #{column.name.inspect}, #{type.inspect}"
|
162
|
+
end
|
163
|
+
tbl.print ", #{format_colspec(colspec)}" if colspec.present?
|
165
164
|
tbl.puts
|
166
165
|
end
|
167
166
|
|
167
|
+
indexes_in_create(table, tbl)
|
168
|
+
check_constraints_in_create(table, tbl) if @connection.supports_check_constraints?
|
169
|
+
|
168
170
|
tbl.puts " end"
|
169
171
|
tbl.puts
|
170
172
|
|
171
|
-
indexes(table, tbl)
|
172
|
-
|
173
173
|
tbl.rewind
|
174
174
|
stream.print tbl.read
|
175
175
|
rescue => e
|
176
176
|
stream.puts "# Could not dump table #{table.inspect} because of following #{e.class}"
|
177
177
|
stream.puts "# #{e.message}"
|
178
178
|
stream.puts
|
179
|
+
ensure
|
180
|
+
self.table_name = nil
|
179
181
|
end
|
180
|
-
|
181
|
-
stream
|
182
182
|
end
|
183
183
|
|
184
|
+
# Keep it for indexing materialized views
|
184
185
|
def indexes(table, stream)
|
185
186
|
if (indexes = @connection.indexes(table)).any?
|
186
187
|
add_index_statements = indexes.map do |index|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
"name: #{index.name.inspect}",
|
191
|
-
]
|
192
|
-
statement_parts << 'unique: true' if index.unique
|
188
|
+
table_name = remove_prefix_and_suffix(index.table).inspect
|
189
|
+
" add_index #{([table_name] + index_parts(index)).join(', ')}"
|
190
|
+
end
|
193
191
|
|
194
|
-
|
195
|
-
|
192
|
+
stream.puts add_index_statements.sort.join("\n")
|
193
|
+
stream.puts
|
194
|
+
end
|
195
|
+
end
|
196
196
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
197
|
+
def indexes_in_create(table, stream)
|
198
|
+
if (indexes = @connection.indexes(table)).any?
|
199
|
+
index_statements = indexes.map do |index|
|
200
|
+
" t.index #{index_parts(index).join(', ')}"
|
201
|
+
end
|
202
|
+
stream.puts index_statements.sort.join("\n")
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def index_parts(index)
|
207
|
+
index_parts = [
|
208
|
+
index.columns.inspect,
|
209
|
+
"name: #{index.name.inspect}",
|
210
|
+
]
|
211
|
+
index_parts << "unique: true" if index.unique
|
212
|
+
index_parts << "length: #{format_index_parts(index.lengths)}" if index.lengths.present?
|
213
|
+
index_parts << "order: #{format_index_parts(index.orders)}" if index.orders.present?
|
214
|
+
index_parts << "opclass: #{format_index_parts(index.opclasses)}" if index.opclasses.present?
|
215
|
+
index_parts << "where: #{index.where.inspect}" if index.where
|
216
|
+
index_parts << "using: #{index.using.inspect}" if !@connection.default_index_type?(index)
|
217
|
+
index_parts << "type: #{index.type.inspect}" if index.type
|
218
|
+
index_parts << "comment: #{index.comment.inspect}" if index.comment
|
219
|
+
index_parts
|
220
|
+
end
|
202
221
|
|
203
|
-
|
222
|
+
def check_constraints_in_create(table, stream)
|
223
|
+
if (check_constraints = @connection.check_constraints(table)).any?
|
224
|
+
add_check_constraint_statements = check_constraints.map do |check_constraint|
|
225
|
+
parts = [
|
226
|
+
"t.check_constraint #{check_constraint.expression.inspect}"
|
227
|
+
]
|
228
|
+
|
229
|
+
if check_constraint.export_name_on_schema_dump?
|
230
|
+
parts << "name: #{check_constraint.name.inspect}"
|
231
|
+
end
|
232
|
+
|
233
|
+
" #{parts.join(', ')}"
|
204
234
|
end
|
205
235
|
|
206
|
-
stream.puts
|
207
|
-
stream.puts
|
236
|
+
stream.puts add_check_constraint_statements.sort.join("\n")
|
208
237
|
end
|
209
238
|
end
|
210
239
|
|
@@ -224,7 +253,7 @@ HEADER
|
|
224
253
|
parts << "primary_key: #{foreign_key.primary_key.inspect}"
|
225
254
|
end
|
226
255
|
|
227
|
-
if foreign_key.
|
256
|
+
if foreign_key.export_name_on_schema_dump?
|
228
257
|
parts << "name: #{foreign_key.name.inspect}"
|
229
258
|
end
|
230
259
|
|
@@ -238,12 +267,32 @@ HEADER
|
|
238
267
|
end
|
239
268
|
end
|
240
269
|
|
270
|
+
def format_colspec(colspec)
|
271
|
+
colspec.map do |key, value|
|
272
|
+
"#{key}: #{ value.is_a?(Hash) ? "{ #{format_colspec(value)} }" : value }"
|
273
|
+
end.join(", ")
|
274
|
+
end
|
275
|
+
|
276
|
+
def format_options(options)
|
277
|
+
options.map { |key, value| "#{key}: #{value.inspect}" }.join(", ")
|
278
|
+
end
|
279
|
+
|
280
|
+
def format_index_parts(options)
|
281
|
+
if options.is_a?(Hash)
|
282
|
+
"{ #{format_options(options)} }"
|
283
|
+
else
|
284
|
+
options.inspect
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
241
288
|
def remove_prefix_and_suffix(table)
|
242
|
-
|
289
|
+
prefix = Regexp.escape(@options[:table_name_prefix].to_s)
|
290
|
+
suffix = Regexp.escape(@options[:table_name_suffix].to_s)
|
291
|
+
table.sub(/\A#{prefix}(.+)#{suffix}\z/, "\\1")
|
243
292
|
end
|
244
293
|
|
245
294
|
def ignored?(table_name)
|
246
|
-
[
|
295
|
+
[ActiveRecord::Base.schema_migrations_table_name, ActiveRecord::Base.internal_metadata_table_name, ignore_tables].flatten.any? do |ignored|
|
247
296
|
ignored === remove_prefix_and_suffix(table_name)
|
248
297
|
end
|
249
298
|
end
|
@@ -1,40 +1,37 @@
|
|
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
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
def table_name
|
13
|
-
"#{table_name_prefix}#{ActiveRecord::Base.schema_migrations_table_name}#{table_name_suffix}"
|
13
|
+
def _internal?
|
14
|
+
true
|
14
15
|
end
|
15
16
|
|
16
|
-
def
|
17
|
-
"
|
17
|
+
def primary_key
|
18
|
+
"version"
|
18
19
|
end
|
19
20
|
|
20
|
-
def
|
21
|
-
|
21
|
+
def table_name
|
22
|
+
"#{table_name_prefix}#{schema_migrations_table_name}#{table_name_suffix}"
|
22
23
|
end
|
23
24
|
|
24
|
-
def create_table
|
25
|
-
unless table_exists?
|
26
|
-
version_options = {null: false}
|
27
|
-
version_options[:limit] = limit if limit
|
28
|
-
|
25
|
+
def create_table
|
26
|
+
unless connection.table_exists?(table_name)
|
29
27
|
connection.create_table(table_name, id: false) do |t|
|
30
|
-
t.
|
28
|
+
t.string :version, **connection.internal_string_options_for_primary_key
|
31
29
|
end
|
32
|
-
connection.add_index table_name, :version, unique: true, name: index_name
|
33
30
|
end
|
34
31
|
end
|
35
32
|
|
36
33
|
def drop_table
|
37
|
-
connection.drop_table table_name
|
34
|
+
connection.drop_table table_name, if_exists: true
|
38
35
|
end
|
39
36
|
|
40
37
|
def normalize_migration_number(number)
|
@@ -42,7 +39,11 @@ module ActiveRecord
|
|
42
39
|
end
|
43
40
|
|
44
41
|
def normalized_versions
|
45
|
-
|
42
|
+
all_versions.map { |v| normalize_migration_number v }
|
43
|
+
end
|
44
|
+
|
45
|
+
def all_versions
|
46
|
+
order(:version).pluck(:version)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
@@ -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,102 +34,114 @@ 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
|
-
|
105
|
-
|
109
|
+
if default_scope_override
|
110
|
+
# The user has defined their own default scope method, so call that
|
111
|
+
evaluate_default_scope do
|
112
|
+
relation.scoping { default_scope }
|
113
|
+
end
|
114
|
+
elsif default_scopes.any?
|
115
|
+
evaluate_default_scope do
|
116
|
+
default_scopes.inject(relation) do |default_scope, scope|
|
117
|
+
scope = scope.respond_to?(:to_proc) ? scope : scope.method(:call)
|
118
|
+
default_scope.instance_exec(&scope) || default_scope
|
119
|
+
end
|
106
120
|
end
|
107
121
|
end
|
108
122
|
end
|
109
|
-
end
|
110
123
|
|
111
|
-
|
112
|
-
|
113
|
-
|
124
|
+
def ignore_default_scope?
|
125
|
+
ScopeRegistry.value_for(:ignore_default_scope, base_class)
|
126
|
+
end
|
114
127
|
|
115
|
-
|
116
|
-
|
117
|
-
|
128
|
+
def ignore_default_scope=(ignore)
|
129
|
+
ScopeRegistry.set_value_for(:ignore_default_scope, base_class, ignore)
|
130
|
+
end
|
118
131
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
132
|
+
# The ignore_default_scope flag is used to prevent an infinite recursion
|
133
|
+
# situation where a default scope references a scope which has a default
|
134
|
+
# scope which references a scope...
|
135
|
+
def evaluate_default_scope
|
136
|
+
return if ignore_default_scope?
|
124
137
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
138
|
+
begin
|
139
|
+
self.ignore_default_scope = true
|
140
|
+
yield
|
141
|
+
ensure
|
142
|
+
self.ignore_default_scope = false
|
143
|
+
end
|
130
144
|
end
|
131
|
-
end
|
132
145
|
end
|
133
146
|
end
|
134
147
|
end
|