activerecord 6.0.6.1 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +782 -928
 - data/MIT-LICENSE +1 -1
 - data/README.rdoc +3 -3
 - data/lib/active_record/aggregations.rb +1 -1
 - data/lib/active_record/association_relation.rb +22 -14
 - data/lib/active_record/associations/alias_tracker.rb +19 -15
 - data/lib/active_record/associations/association.rb +43 -26
 - data/lib/active_record/associations/association_scope.rb +11 -15
 - data/lib/active_record/associations/belongs_to_association.rb +15 -5
 - data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
 - data/lib/active_record/associations/builder/association.rb +9 -3
 - data/lib/active_record/associations/builder/belongs_to.rb +10 -7
 - data/lib/active_record/associations/builder/collection_association.rb +5 -4
 - data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -1
 - data/lib/active_record/associations/builder/has_many.rb +6 -2
 - data/lib/active_record/associations/builder/has_one.rb +11 -14
 - data/lib/active_record/associations/builder/singular_association.rb +1 -1
 - data/lib/active_record/associations/collection_association.rb +19 -13
 - data/lib/active_record/associations/collection_proxy.rb +12 -5
 - data/lib/active_record/associations/foreign_association.rb +13 -0
 - data/lib/active_record/associations/has_many_association.rb +24 -2
 - data/lib/active_record/associations/has_many_through_association.rb +10 -4
 - data/lib/active_record/associations/has_one_association.rb +15 -1
 - data/lib/active_record/associations/join_dependency/join_association.rb +29 -14
 - data/lib/active_record/associations/join_dependency/join_part.rb +1 -1
 - data/lib/active_record/associations/join_dependency.rb +63 -49
 - data/lib/active_record/associations/preloader/association.rb +13 -5
 - data/lib/active_record/associations/preloader/through_association.rb +1 -1
 - data/lib/active_record/associations/preloader.rb +5 -3
 - data/lib/active_record/associations/singular_association.rb +1 -1
 - data/lib/active_record/associations.rb +114 -11
 - data/lib/active_record/attribute_assignment.rb +10 -8
 - data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
 - data/lib/active_record/attribute_methods/dirty.rb +1 -11
 - data/lib/active_record/attribute_methods/primary_key.rb +6 -2
 - data/lib/active_record/attribute_methods/query.rb +3 -6
 - data/lib/active_record/attribute_methods/read.rb +8 -11
 - data/lib/active_record/attribute_methods/serialization.rb +11 -5
 - data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -13
 - data/lib/active_record/attribute_methods/write.rb +12 -20
 - data/lib/active_record/attribute_methods.rb +64 -54
 - data/lib/active_record/attributes.rb +32 -7
 - data/lib/active_record/autosave_association.rb +47 -30
 - data/lib/active_record/base.rb +2 -14
 - data/lib/active_record/callbacks.rb +152 -22
 - data/lib/active_record/coders/yaml_column.rb +2 -24
 - data/lib/active_record/connection_adapters/abstract/connection_pool.rb +185 -134
 - data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
 - data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -22
 - data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -7
 - data/lib/active_record/connection_adapters/abstract/quoting.rb +35 -44
 - data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
 - data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
 - data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +110 -30
 - data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
 - data/lib/active_record/connection_adapters/abstract/schema_statements.rb +224 -85
 - data/lib/active_record/connection_adapters/abstract/transaction.rb +80 -32
 - data/lib/active_record/connection_adapters/abstract_adapter.rb +49 -72
 - data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +123 -87
 - data/lib/active_record/connection_adapters/column.rb +15 -1
 - 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/database_statements.rb +22 -24
 - data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -1
 - data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
 - data/lib/active_record/connection_adapters/mysql/schema_creation.rb +32 -6
 - data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
 - data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
 - data/lib/active_record/connection_adapters/mysql/schema_statements.rb +3 -3
 - data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
 - data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -12
 - 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 +24 -1
 - data/lib/active_record/connection_adapters/postgresql/database_statements.rb +12 -53
 - data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
 - data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
 - data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -2
 - data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -2
 - data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
 - data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -2
 - data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -1
 - data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
 - data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +5 -1
 - data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +61 -29
 - data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
 - data/lib/active_record/connection_adapters/postgresql_adapter.rb +72 -55
 - data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
 - data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
 - data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +30 -5
 - data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -1
 - data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
 - data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +36 -3
 - data/lib/active_record/connection_adapters/sqlite3_adapter.rb +48 -50
 - data/lib/active_record/connection_adapters.rb +50 -0
 - data/lib/active_record/connection_handling.rb +210 -71
 - data/lib/active_record/core.rb +223 -66
 - data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
 - data/lib/active_record/database_configurations/database_config.rb +52 -9
 - data/lib/active_record/database_configurations/hash_config.rb +54 -8
 - data/lib/active_record/database_configurations/url_config.rb +15 -40
 - data/lib/active_record/database_configurations.rb +124 -85
 - data/lib/active_record/delegated_type.rb +209 -0
 - data/lib/active_record/destroy_association_async_job.rb +36 -0
 - data/lib/active_record/enum.rb +27 -10
 - data/lib/active_record/errors.rb +47 -12
 - data/lib/active_record/explain.rb +9 -4
 - data/lib/active_record/explain_subscriber.rb +1 -1
 - data/lib/active_record/fixture_set/file.rb +10 -17
 - data/lib/active_record/fixture_set/model_metadata.rb +1 -2
 - data/lib/active_record/fixture_set/render_context.rb +1 -1
 - data/lib/active_record/fixture_set/table_row.rb +2 -2
 - data/lib/active_record/fixtures.rb +54 -8
 - data/lib/active_record/gem_version.rb +3 -3
 - data/lib/active_record/inheritance.rb +40 -18
 - data/lib/active_record/insert_all.rb +34 -5
 - data/lib/active_record/integration.rb +3 -5
 - data/lib/active_record/internal_metadata.rb +16 -7
 - data/lib/active_record/legacy_yaml_adapter.rb +7 -3
 - data/lib/active_record/locking/optimistic.rb +13 -16
 - data/lib/active_record/locking/pessimistic.rb +6 -2
 - data/lib/active_record/log_subscriber.rb +26 -8
 - data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
 - data/lib/active_record/middleware/database_selector/resolver.rb +5 -0
 - data/lib/active_record/middleware/database_selector.rb +4 -1
 - data/lib/active_record/migration/command_recorder.rb +47 -27
 - data/lib/active_record/migration/compatibility.rb +67 -17
 - data/lib/active_record/migration.rb +113 -83
 - data/lib/active_record/model_schema.rb +88 -13
 - data/lib/active_record/nested_attributes.rb +2 -3
 - data/lib/active_record/no_touching.rb +1 -1
 - data/lib/active_record/persistence.rb +50 -45
 - data/lib/active_record/query_cache.rb +15 -5
 - data/lib/active_record/querying.rb +11 -6
 - data/lib/active_record/railtie.rb +64 -44
 - data/lib/active_record/railties/databases.rake +266 -95
 - data/lib/active_record/readonly_attributes.rb +4 -0
 - data/lib/active_record/reflection.rb +60 -44
 - data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
 - data/lib/active_record/relation/batches.rb +38 -31
 - data/lib/active_record/relation/calculations.rb +100 -43
 - data/lib/active_record/relation/finder_methods.rb +44 -14
 - data/lib/active_record/relation/from_clause.rb +1 -1
 - data/lib/active_record/relation/merger.rb +20 -23
 - data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
 - data/lib/active_record/relation/predicate_builder/association_query_value.rb +4 -5
 - data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +3 -3
 - data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
 - data/lib/active_record/relation/predicate_builder.rb +57 -33
 - data/lib/active_record/relation/query_methods.rb +318 -197
 - data/lib/active_record/relation/record_fetch_warning.rb +3 -3
 - data/lib/active_record/relation/spawn_methods.rb +8 -7
 - data/lib/active_record/relation/where_clause.rb +104 -57
 - data/lib/active_record/relation.rb +90 -64
 - data/lib/active_record/result.rb +41 -33
 - data/lib/active_record/runtime_registry.rb +2 -2
 - data/lib/active_record/sanitization.rb +6 -17
 - data/lib/active_record/schema_dumper.rb +34 -4
 - data/lib/active_record/schema_migration.rb +2 -8
 - data/lib/active_record/scoping/named.rb +1 -17
 - data/lib/active_record/secure_token.rb +16 -8
 - data/lib/active_record/serialization.rb +5 -3
 - data/lib/active_record/signed_id.rb +116 -0
 - data/lib/active_record/statement_cache.rb +20 -4
 - data/lib/active_record/store.rb +2 -2
 - data/lib/active_record/suppressor.rb +2 -2
 - data/lib/active_record/table_metadata.rb +39 -51
 - data/lib/active_record/tasks/database_tasks.rb +139 -113
 - data/lib/active_record/tasks/mysql_database_tasks.rb +34 -35
 - data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -26
 - data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -9
 - data/lib/active_record/test_databases.rb +5 -4
 - data/lib/active_record/test_fixtures.rb +36 -33
 - data/lib/active_record/timestamp.rb +4 -6
 - data/lib/active_record/touch_later.rb +21 -21
 - data/lib/active_record/transactions.rb +15 -64
 - data/lib/active_record/type/serialized.rb +6 -2
 - data/lib/active_record/type.rb +8 -1
 - data/lib/active_record/type_caster/connection.rb +0 -1
 - data/lib/active_record/type_caster/map.rb +8 -5
 - data/lib/active_record/validations/associated.rb +1 -1
 - data/lib/active_record/validations/numericality.rb +35 -0
 - data/lib/active_record/validations/uniqueness.rb +24 -4
 - data/lib/active_record/validations.rb +1 -0
 - data/lib/active_record.rb +7 -14
 - data/lib/arel/attributes/attribute.rb +4 -0
 - data/lib/arel/collectors/bind.rb +5 -0
 - data/lib/arel/collectors/composite.rb +8 -0
 - data/lib/arel/collectors/sql_string.rb +7 -0
 - data/lib/arel/collectors/substitute_binds.rb +7 -0
 - data/lib/arel/nodes/binary.rb +82 -8
 - data/lib/arel/nodes/bind_param.rb +8 -0
 - data/lib/arel/nodes/casted.rb +21 -9
 - data/lib/arel/nodes/equality.rb +6 -9
 - data/lib/arel/nodes/grouping.rb +3 -0
 - data/lib/arel/nodes/homogeneous_in.rb +72 -0
 - data/lib/arel/nodes/in.rb +8 -1
 - data/lib/arel/nodes/infix_operation.rb +13 -1
 - data/lib/arel/nodes/join_source.rb +1 -1
 - data/lib/arel/nodes/node.rb +7 -6
 - data/lib/arel/nodes/ordering.rb +27 -0
 - data/lib/arel/nodes/sql_literal.rb +3 -0
 - data/lib/arel/nodes/table_alias.rb +7 -3
 - data/lib/arel/nodes/unary.rb +0 -1
 - data/lib/arel/nodes.rb +3 -1
 - data/lib/arel/predications.rb +12 -18
 - data/lib/arel/select_manager.rb +1 -2
 - data/lib/arel/table.rb +13 -5
 - data/lib/arel/visitors/dot.rb +14 -2
 - data/lib/arel/visitors/mysql.rb +11 -1
 - data/lib/arel/visitors/postgresql.rb +15 -4
 - data/lib/arel/visitors/to_sql.rb +89 -78
 - data/lib/arel/visitors.rb +0 -7
 - data/lib/arel.rb +5 -13
 - data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
 - data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
 - data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +3 -3
 - data/lib/rails/generators/active_record/migration.rb +6 -1
 - data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
 - data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
 - metadata +28 -30
 - data/lib/active_record/advisory_lock_base.rb +0 -18
 - data/lib/active_record/attribute_decorators.rb +0 -88
 - data/lib/active_record/connection_adapters/connection_specification.rb +0 -296
 - data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
 - data/lib/active_record/define_callbacks.rb +0 -22
 - data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
 - data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
 - data/lib/active_record/relation/where_clause_factory.rb +0 -33
 - data/lib/arel/attributes.rb +0 -22
 - data/lib/arel/visitors/depth_first.rb +0 -203
 - data/lib/arel/visitors/ibm_db.rb +0 -34
 - data/lib/arel/visitors/informix.rb +0 -62
 - data/lib/arel/visitors/mssql.rb +0 -156
 - data/lib/arel/visitors/oracle.rb +0 -158
 - data/lib/arel/visitors/oracle12.rb +0 -65
 - data/lib/arel/visitors/where_sql.rb +0 -22
 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,109 +1,68 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            ## Rails 6.0 
     | 
| 
      
 1 
     | 
    
         
            +
            ## Rails 6.1.0 (December 09, 2020) ##
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            *    
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
                Though this method was likely never meant to take user input, it was
         
     | 
| 
       6 
     | 
    
         
            -
                attempting sanitization. That sanitization could be bypassed with
         
     | 
| 
       7 
     | 
    
         
            -
                carefully crafted input.
         
     | 
| 
      
 3 
     | 
    
         
            +
            *   Only warn about negative enums if a positive form that would cause conflicts exists.
         
     | 
| 
       8 
4 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                 
     | 
| 
       10 
     | 
    
         
            -
                occurrances of "/*" or "*/" with "/ *" or "* /". It also performs a
         
     | 
| 
       11 
     | 
    
         
            -
                first pass to remove one surrounding comment to avoid compatibility
         
     | 
| 
       12 
     | 
    
         
            -
                issues for users relying on the existing removal.
         
     | 
| 
      
 5 
     | 
    
         
            +
                Fixes #39065.
         
     | 
| 
       13 
6 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
                 
     | 
| 
       15 
     | 
    
         
            -
                be provided user input.
         
     | 
| 
      
 7 
     | 
    
         
            +
                *Alex Ghiculescu*
         
     | 
| 
       16 
8 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
            *   Change `attribute_for_inspect` to take `filter_attributes` in consideration.
         
     | 
| 
       18 
10 
     | 
    
         | 
| 
      
 11 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       19 
12 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
            *   Fix odd behavior of inverse_of with multiple belongs_to to same class.
         
     | 
| 
       21 
14 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
                Fixes #35204.
         
     | 
| 
       23 
16 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                 
     | 
| 
      
 17 
     | 
    
         
            +
                *Tomoyuki Kai*
         
     | 
| 
       25 
18 
     | 
    
         | 
| 
      
 19 
     | 
    
         
            +
            *   Build predicate conditions with objects that delegate `#id` and primary key:
         
     | 
| 
       26 
20 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 21 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 22 
     | 
    
         
            +
                class AdminAuthor
         
     | 
| 
      
 23 
     | 
    
         
            +
                  delegate_missing_to :@author
         
     | 
| 
       28 
24 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
      
 25 
     | 
    
         
            +
                  def initialize(author)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    @author = author
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
       30 
29 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
                 
     | 
| 
       32 
     | 
    
         
            -
                follows:
         
     | 
| 
       33 
     | 
    
         
            -
                
         
     | 
| 
       34 
     | 
    
         
            -
                * `config.active_storage.use_yaml_unsafe_load`
         
     | 
| 
       35 
     | 
    
         
            -
                
         
     | 
| 
       36 
     | 
    
         
            -
                When set to true, this configuration option tells Rails to use the old
         
     | 
| 
       37 
     | 
    
         
            -
                "unsafe" YAML loading strategy, maintaining the existing behavior but leaving
         
     | 
| 
       38 
     | 
    
         
            -
                the possible escalation vulnerability in place.  Setting this option to true
         
     | 
| 
       39 
     | 
    
         
            -
                is *not* recommended, but can aid in upgrading.
         
     | 
| 
       40 
     | 
    
         
            -
                
         
     | 
| 
       41 
     | 
    
         
            -
                * `config.active_record.yaml_column_permitted_classes`
         
     | 
| 
       42 
     | 
    
         
            -
                
         
     | 
| 
       43 
     | 
    
         
            -
                The "safe YAML" loading method does not allow all classes to be deserialized
         
     | 
| 
       44 
     | 
    
         
            -
                by default.  This option allows you to specify classes deemed "safe" in your
         
     | 
| 
       45 
     | 
    
         
            -
                application.  For example, if your application uses Symbol and Time in
         
     | 
| 
       46 
     | 
    
         
            -
                serialized data, you can add Symbol and Time to the allowed list as follows:
         
     | 
| 
       47 
     | 
    
         
            -
                
         
     | 
| 
       48 
     | 
    
         
            -
                ```
         
     | 
| 
       49 
     | 
    
         
            -
                config.active_record.yaml_column_permitted_classes = [Symbol, Date, Time]
         
     | 
| 
      
 30 
     | 
    
         
            +
                Post.where(author: AdminAuthor.new(author))
         
     | 
| 
       50 
31 
     | 
    
         
             
                ```
         
     | 
| 
       51 
32 
     | 
    
         | 
| 
       52 
     | 
    
         
            -
                 
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
            ## Rails 6.0.5 (May 09, 2022) ##
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
            ## Rails 6.0.4.8 (April 26, 2022) ##
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
            ## Rails 6.0.4.7 (March 08, 2022) ##
         
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
            ## Rails 6.0.4.6 (February 11, 2022) ##
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
      
 33 
     | 
    
         
            +
                *Sean Doyle*
         
     | 
| 
       73 
34 
     | 
    
         | 
| 
      
 35 
     | 
    
         
            +
            *   Add `connected_to_many` API.
         
     | 
| 
       74 
36 
     | 
    
         | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
      
 37 
     | 
    
         
            +
                This API allows applications to connect to multiple databases at once without switching all of them or implementing a deeply nested stack.
         
     | 
| 
       76 
38 
     | 
    
         | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
            ## Rails 6.0.4.4 (December 15, 2021) ##
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
            ## Rails 6.0.4.3 (December 14, 2021) ##
         
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
            ## Rails 6.0.4.2 (December 14, 2021) ##
         
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
      
 39 
     | 
    
         
            +
                Before:
         
     | 
| 
       93 
40 
     | 
    
         | 
| 
      
 41 
     | 
    
         
            +
                  AnimalsRecord.connected_to(role: :reading) do
         
     | 
| 
      
 42 
     | 
    
         
            +
                    MealsRecord.connected_to(role: :reading) do
         
     | 
| 
      
 43 
     | 
    
         
            +
                      Dog.first # read from animals replica
         
     | 
| 
      
 44 
     | 
    
         
            +
                      Dinner.first # read from meals replica
         
     | 
| 
      
 45 
     | 
    
         
            +
                      Person.first # read from primary writer
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
       94 
48 
     | 
    
         | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
      
 49 
     | 
    
         
            +
                After:
         
     | 
| 
       96 
50 
     | 
    
         | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
      
 51 
     | 
    
         
            +
                  ActiveRecord::Base.connected_to_many([AnimalsRecord, MealsRecord], role: :reading) do
         
     | 
| 
      
 52 
     | 
    
         
            +
                    Dog.first # read from animals replica
         
     | 
| 
      
 53 
     | 
    
         
            +
                    Dinner.first # read from meals replica
         
     | 
| 
      
 54 
     | 
    
         
            +
                    Person.first # read from primary writer
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
       98 
56 
     | 
    
         | 
| 
      
 57 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       99 
58 
     | 
    
         | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
      
 59 
     | 
    
         
            +
            *   Add option to raise or log for `ActiveRecord::StrictLoadingViolationError`.
         
     | 
| 
       101 
60 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
      
 61 
     | 
    
         
            +
                Some applications may not want to raise an error in production if using `strict_loading`. This would allow an application to set strict loading to log for the production environment while still raising in development and test environments.
         
     | 
| 
       103 
62 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
                 
     | 
| 
      
 63 
     | 
    
         
            +
                Set `config.active_record.action_on_strict_loading_violation` to `:log` errors instead of raising.
         
     | 
| 
       105 
64 
     | 
    
         | 
| 
       106 
     | 
    
         
            -
                * 
     | 
| 
      
 65 
     | 
    
         
            +
                *Eileen M. Uchitelle*
         
     | 
| 
       107 
66 
     | 
    
         | 
| 
       108 
67 
     | 
    
         
             
            *   Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
         
     | 
| 
       109 
68 
     | 
    
         | 
| 
         @@ -111,1339 +70,1234 @@ 
     | 
|
| 
       111 
70 
     | 
    
         | 
| 
       112 
71 
     | 
    
         
             
                *Steven Weber*
         
     | 
| 
       113 
72 
     | 
    
         | 
| 
       114 
     | 
    
         
            -
            *    
     | 
| 
      
 73 
     | 
    
         
            +
            *   Optimise the length of index names for polymorphic references by using the reference name rather than the type and id column names.
         
     | 
| 
       115 
74 
     | 
    
         | 
| 
       116 
     | 
    
         
            -
                 
     | 
| 
      
 75 
     | 
    
         
            +
                Because the default behaviour when adding an index with multiple columns is to use all column names in the index name, this could frequently lead to overly long index names for polymorphic references which would fail the migration if it exceeded the database limit.
         
     | 
| 
       117 
76 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
                 
     | 
| 
      
 77 
     | 
    
         
            +
                This change reduces the chance of that happening by using the reference name, e.g. `index_my_table_on_my_reference`.
         
     | 
| 
       119 
78 
     | 
    
         | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
      
 79 
     | 
    
         
            +
                Fixes #38655.
         
     | 
| 
       121 
80 
     | 
    
         | 
| 
       122 
     | 
    
         
            -
                * 
     | 
| 
      
 81 
     | 
    
         
            +
                *Luke Redpath*
         
     | 
| 
       123 
82 
     | 
    
         | 
| 
       124 
     | 
    
         
            -
            *    
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
                Fixes #39173.
         
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
                *Eugene Kenny*
         
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
            *   Resolve issue with insert_all unique_by option when used with expression index.
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
                When the `:unique_by` option of `ActiveRecord::Persistence.insert_all` and
         
     | 
| 
       133 
     | 
    
         
            -
                `ActiveRecord::Persistence.upsert_all` was used with the name of an expression index, an error
         
     | 
| 
       134 
     | 
    
         
            -
                was raised. Adding a guard around the formatting behavior for the `:unique_by` corrects this.
         
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
                Usage:
         
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
                ```ruby
         
     | 
| 
       139 
     | 
    
         
            -
                create_table :books, id: :integer, force: true do |t|
         
     | 
| 
       140 
     | 
    
         
            -
                  t.column :name, :string
         
     | 
| 
       141 
     | 
    
         
            -
                  t.index "lower(name)", unique: true
         
     | 
| 
       142 
     | 
    
         
            -
                end
         
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
     | 
    
         
            -
                Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
         
     | 
| 
       145 
     | 
    
         
            -
                ```
         
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
     | 
    
         
            -
                Fixes #39516.
         
     | 
| 
       148 
     | 
    
         
            -
             
     | 
| 
       149 
     | 
    
         
            -
                *Austen Madden*
         
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
       151 
     | 
    
         
            -
            *   Fix preloading for polymorphic association with custom scope.
         
     | 
| 
      
 83 
     | 
    
         
            +
            *   MySQL: Uniqueness validator now respects default database collation,
         
     | 
| 
      
 84 
     | 
    
         
            +
                no longer enforce case sensitive comparison by default.
         
     | 
| 
       152 
85 
     | 
    
         | 
| 
       153 
86 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       154 
87 
     | 
    
         | 
| 
       155 
     | 
    
         
            -
            *    
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
       157 
     | 
    
         
            -
                *Takumi Shotoku*
         
     | 
| 
      
 88 
     | 
    
         
            +
            *   Remove deprecated methods from `ActiveRecord::ConnectionAdapters::DatabaseLimits`.
         
     | 
| 
       158 
89 
     | 
    
         | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
      
 90 
     | 
    
         
            +
                `column_name_length`
         
     | 
| 
      
 91 
     | 
    
         
            +
                `table_name_length`
         
     | 
| 
      
 92 
     | 
    
         
            +
                `columns_per_table`
         
     | 
| 
      
 93 
     | 
    
         
            +
                `indexes_per_table`
         
     | 
| 
      
 94 
     | 
    
         
            +
                `columns_per_multicolumn_index`
         
     | 
| 
      
 95 
     | 
    
         
            +
                `sql_query_length`
         
     | 
| 
      
 96 
     | 
    
         
            +
                `joins_per_query`
         
     | 
| 
       160 
97 
     | 
    
         | 
| 
       161 
     | 
    
         
            -
                 
     | 
| 
       162 
     | 
    
         
            -
                cache. This avoids raising an unnecessary `ActiveRecord::StaleObjectError`
         
     | 
| 
       163 
     | 
    
         
            -
                upon subsequent transactions by maintaining parity with the corresponding
         
     | 
| 
       164 
     | 
    
         
            -
                database record's `lock_version` column.
         
     | 
| 
      
 98 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       165 
99 
     | 
    
         | 
| 
       166 
     | 
    
         
            -
             
     | 
| 
      
 100 
     | 
    
         
            +
            *   Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?`.
         
     | 
| 
       167 
101 
     | 
    
         | 
| 
       168 
     | 
    
         
            -
                * 
     | 
| 
      
 102 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       169 
103 
     | 
    
         | 
| 
       170 
     | 
    
         
            -
            *    
     | 
| 
      
 104 
     | 
    
         
            +
            *   Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?`.
         
     | 
| 
       171 
105 
     | 
    
         | 
| 
       172 
     | 
    
         
            -
                * 
     | 
| 
      
 106 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       173 
107 
     | 
    
         | 
| 
       174 
     | 
    
         
            -
            *    
     | 
| 
      
 108 
     | 
    
         
            +
            *   Remove deprecated `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?`.
         
     | 
| 
       175 
109 
     | 
    
         | 
| 
       176 
     | 
    
         
            -
                * 
     | 
| 
      
 110 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       177 
111 
     | 
    
         | 
| 
       178 
     | 
    
         
            -
            *    
     | 
| 
      
 112 
     | 
    
         
            +
            *   Remove deprecated `ActiveRecord::Base#update_attributes` and `ActiveRecord::Base#update_attributes!`.
         
     | 
| 
       179 
113 
     | 
    
         | 
| 
       180 
     | 
    
         
            -
                * 
     | 
| 
      
 114 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       181 
115 
     | 
    
         | 
| 
       182 
     | 
    
         
            -
            *    
     | 
| 
      
 116 
     | 
    
         
            +
            *   Remove deprecated `migrations_path` argument in `ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version`.
         
     | 
| 
       183 
117 
     | 
    
         | 
| 
       184 
     | 
    
         
            -
                * 
     | 
| 
      
 118 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       185 
119 
     | 
    
         | 
| 
       186 
     | 
    
         
            -
            *    
     | 
| 
      
 120 
     | 
    
         
            +
            *   Remove deprecated `config.active_record.sqlite3.represent_boolean_as_integer`.
         
     | 
| 
       187 
121 
     | 
    
         | 
| 
       188 
     | 
    
         
            -
                * 
     | 
| 
      
 122 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       189 
123 
     | 
    
         | 
| 
       190 
     | 
    
         
            -
            *    
     | 
| 
      
 124 
     | 
    
         
            +
            *   `relation.create` does no longer leak scope to class level querying methods
         
     | 
| 
      
 125 
     | 
    
         
            +
                in initialization block and callbacks.
         
     | 
| 
       191 
126 
     | 
    
         | 
| 
       192 
     | 
    
         
            -
                 
     | 
| 
      
 127 
     | 
    
         
            +
                Before:
         
     | 
| 
       193 
128 
     | 
    
         | 
| 
       194 
     | 
    
         
            -
             
     | 
| 
       195 
     | 
    
         
            -
             
     | 
| 
      
 129 
     | 
    
         
            +
                    User.where(name: "John").create do |john|
         
     | 
| 
      
 130 
     | 
    
         
            +
                      User.find_by(name: "David") # => nil
         
     | 
| 
      
 131 
     | 
    
         
            +
                    end
         
     | 
| 
       196 
132 
     | 
    
         | 
| 
       197 
     | 
    
         
            -
                 
     | 
| 
      
 133 
     | 
    
         
            +
                After:
         
     | 
| 
       198 
134 
     | 
    
         | 
| 
       199 
     | 
    
         
            -
             
     | 
| 
      
 135 
     | 
    
         
            +
                    User.where(name: "John").create do |john|
         
     | 
| 
      
 136 
     | 
    
         
            +
                      User.find_by(name: "David") # => #<User name: "David", ...>
         
     | 
| 
      
 137 
     | 
    
         
            +
                    end
         
     | 
| 
       200 
138 
     | 
    
         | 
| 
       201 
139 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       202 
140 
     | 
    
         | 
| 
       203 
     | 
    
         
            -
            *    
     | 
| 
       204 
     | 
    
         
            -
             
     | 
| 
       205 
     | 
    
         
            -
                *Bogdan Gusiev*
         
     | 
| 
       206 
     | 
    
         
            -
             
     | 
| 
       207 
     | 
    
         
            -
             
     | 
| 
       208 
     | 
    
         
            -
            ## Rails 6.0.3.7 (May 05, 2021) ##
         
     | 
| 
       209 
     | 
    
         
            -
             
     | 
| 
       210 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
       211 
     | 
    
         
            -
             
     | 
| 
       212 
     | 
    
         
            -
             
     | 
| 
       213 
     | 
    
         
            -
            ## Rails 6.0.3.6 (March 26, 2021) ##
         
     | 
| 
       214 
     | 
    
         
            -
             
     | 
| 
       215 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
       216 
     | 
    
         
            -
             
     | 
| 
       217 
     | 
    
         
            -
             
     | 
| 
       218 
     | 
    
         
            -
            ## Rails 6.0.3.5 (February 10, 2021) ##
         
     | 
| 
       219 
     | 
    
         
            -
             
     | 
| 
       220 
     | 
    
         
            -
            *   Fix possible DoS vector in PostgreSQL money type
         
     | 
| 
      
 141 
     | 
    
         
            +
            *   Named scope chain does no longer leak scope to class level querying methods.
         
     | 
| 
       221 
142 
     | 
    
         | 
| 
       222 
     | 
    
         
            -
             
     | 
| 
       223 
     | 
    
         
            -
             
     | 
| 
       224 
     | 
    
         
            -
             
     | 
| 
       225 
     | 
    
         
            -
             
     | 
| 
       226 
     | 
    
         
            -
                Thanks to @dee-see from Hackerone for this patch!
         
     | 
| 
       227 
     | 
    
         
            -
             
     | 
| 
       228 
     | 
    
         
            -
                [CVE-2021-22880]
         
     | 
| 
       229 
     | 
    
         
            -
             
     | 
| 
       230 
     | 
    
         
            -
                *Aaron Patterson*
         
     | 
| 
      
 143 
     | 
    
         
            +
                    class User < ActiveRecord::Base
         
     | 
| 
      
 144 
     | 
    
         
            +
                      scope :david, -> { User.where(name: "David") }
         
     | 
| 
      
 145 
     | 
    
         
            +
                    end
         
     | 
| 
       231 
146 
     | 
    
         | 
| 
      
 147 
     | 
    
         
            +
                Before:
         
     | 
| 
       232 
148 
     | 
    
         | 
| 
       233 
     | 
    
         
            -
             
     | 
| 
      
 149 
     | 
    
         
            +
                    User.where(name: "John").david
         
     | 
| 
      
 150 
     | 
    
         
            +
                    # SELECT * FROM users WHERE name = 'John' AND name = 'David'
         
     | 
| 
       234 
151 
     | 
    
         | 
| 
       235 
     | 
    
         
            -
             
     | 
| 
      
 152 
     | 
    
         
            +
                After:
         
     | 
| 
       236 
153 
     | 
    
         | 
| 
      
 154 
     | 
    
         
            +
                    User.where(name: "John").david
         
     | 
| 
      
 155 
     | 
    
         
            +
                    # SELECT * FROM users WHERE name = 'David'
         
     | 
| 
       237 
156 
     | 
    
         | 
| 
       238 
     | 
    
         
            -
             
     | 
| 
      
 157 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       239 
158 
     | 
    
         | 
| 
       240 
     | 
    
         
            -
            *    
     | 
| 
      
 159 
     | 
    
         
            +
            *   Remove deprecated methods from `ActiveRecord::DatabaseConfigurations`.
         
     | 
| 
       241 
160 
     | 
    
         | 
| 
      
 161 
     | 
    
         
            +
                `fetch`
         
     | 
| 
      
 162 
     | 
    
         
            +
                `each`
         
     | 
| 
      
 163 
     | 
    
         
            +
                `first`
         
     | 
| 
      
 164 
     | 
    
         
            +
                `values`
         
     | 
| 
      
 165 
     | 
    
         
            +
                `[]=`
         
     | 
| 
       242 
166 
     | 
    
         | 
| 
       243 
     | 
    
         
            -
             
     | 
| 
      
 167 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       244 
168 
     | 
    
         | 
| 
       245 
     | 
    
         
            -
            *    
     | 
| 
      
 169 
     | 
    
         
            +
            *   `where.not` now generates NAND predicates instead of NOR.
         
     | 
| 
       246 
170 
     | 
    
         | 
| 
      
 171 
     | 
    
         
            +
                 Before:
         
     | 
| 
       247 
172 
     | 
    
         | 
| 
       248 
     | 
    
         
            -
             
     | 
| 
      
 173 
     | 
    
         
            +
                     User.where.not(name: "Jon", role: "admin")
         
     | 
| 
      
 174 
     | 
    
         
            +
                     # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
         
     | 
| 
       249 
175 
     | 
    
         | 
| 
       250 
     | 
    
         
            -
             
     | 
| 
      
 176 
     | 
    
         
            +
                 After:
         
     | 
| 
       251 
177 
     | 
    
         | 
| 
      
 178 
     | 
    
         
            +
                     User.where.not(name: "Jon", role: "admin")
         
     | 
| 
      
 179 
     | 
    
         
            +
                     # SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
         
     | 
| 
       252 
180 
     | 
    
         | 
| 
       253 
     | 
    
         
            -
             
     | 
| 
      
 181 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       254 
182 
     | 
    
         | 
| 
       255 
     | 
    
         
            -
            *    
     | 
| 
      
 183 
     | 
    
         
            +
            *   Remove deprecated `ActiveRecord::Result#to_hash` method.
         
     | 
| 
       256 
184 
     | 
    
         | 
| 
       257 
     | 
    
         
            -
                 
     | 
| 
      
 185 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       258 
186 
     | 
    
         | 
| 
       259 
     | 
    
         
            -
             
     | 
| 
      
 187 
     | 
    
         
            +
            *   Deprecate `ActiveRecord::Base.allow_unsafe_raw_sql`.
         
     | 
| 
       260 
188 
     | 
    
         | 
| 
       261 
     | 
    
         
            -
            * 
     | 
| 
      
 189 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       262 
190 
     | 
    
         | 
| 
       263 
     | 
    
         
            -
             
     | 
| 
      
 191 
     | 
    
         
            +
            *   Remove deprecated support for using unsafe raw SQL in `ActiveRecord::Relation` methods.
         
     | 
| 
       264 
192 
     | 
    
         | 
| 
       265 
     | 
    
         
            -
            * 
     | 
| 
      
 193 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       266 
194 
     | 
    
         | 
| 
       267 
     | 
    
         
            -
             
     | 
| 
      
 195 
     | 
    
         
            +
            *   Allow users to silence the "Rails couldn't infer whether you are using multiple databases..."
         
     | 
| 
      
 196 
     | 
    
         
            +
                message using `config.active_record.suppress_multiple_database_warning`.
         
     | 
| 
       268 
197 
     | 
    
         | 
| 
       269 
     | 
    
         
            -
            * 
     | 
| 
      
 198 
     | 
    
         
            +
                *Omri Gabay*
         
     | 
| 
       270 
199 
     | 
    
         | 
| 
       271 
     | 
    
         
            -
             
     | 
| 
      
 200 
     | 
    
         
            +
            *   Connections can be granularly switched for abstract classes when `connected_to` is called.
         
     | 
| 
       272 
201 
     | 
    
         | 
| 
       273 
     | 
    
         
            -
                 
     | 
| 
      
 202 
     | 
    
         
            +
                This change allows `connected_to` to switch a `role` and/or `shard` for a single abstract class instead of all classes globally. Applications that want to use the new feature need to set `config.active_record.legacy_connection_handling` to `false` in their application configuration.
         
     | 
| 
       274 
203 
     | 
    
         | 
| 
       275 
     | 
    
         
            -
             
     | 
| 
      
 204 
     | 
    
         
            +
                Example usage:
         
     | 
| 
       276 
205 
     | 
    
         | 
| 
       277 
     | 
    
         
            -
                 
     | 
| 
      
 206 
     | 
    
         
            +
                Given an application we have a `User` model that inherits from `ApplicationRecord` and a `Dog` model that inherits from `AnimalsRecord`. `AnimalsRecord` and `ApplicationRecord` have writing and reading connections as well as shard `default`, `one`, and `two`.
         
     | 
| 
       278 
207 
     | 
    
         | 
| 
       279 
     | 
    
         
            -
                 
     | 
| 
      
 208 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 209 
     | 
    
         
            +
                ActiveRecord::Base.connected_to(role: :reading) do
         
     | 
| 
      
 210 
     | 
    
         
            +
                  User.first # reads from default replica
         
     | 
| 
      
 211 
     | 
    
         
            +
                  Dog.first # reads from default replica
         
     | 
| 
       280 
212 
     | 
    
         | 
| 
       281 
     | 
    
         
            -
             
     | 
| 
      
 213 
     | 
    
         
            +
                  AnimalsRecord.connected_to(role: :writing, shard: :one) do
         
     | 
| 
      
 214 
     | 
    
         
            +
                    User.first # reads from default replica
         
     | 
| 
      
 215 
     | 
    
         
            +
                    Dog.first # reads from shard one primary
         
     | 
| 
      
 216 
     | 
    
         
            +
                  end
         
     | 
| 
       282 
217 
     | 
    
         | 
| 
       283 
     | 
    
         
            -
             
     | 
| 
      
 218 
     | 
    
         
            +
                  User.first # reads from default replica
         
     | 
| 
      
 219 
     | 
    
         
            +
                  Dog.first # reads from default replica
         
     | 
| 
       284 
220 
     | 
    
         | 
| 
       285 
     | 
    
         
            -
             
     | 
| 
      
 221 
     | 
    
         
            +
                  ApplicationRecord.connected_to(role: :writing, shard: :two) do
         
     | 
| 
      
 222 
     | 
    
         
            +
                    User.first # reads from shard two primary
         
     | 
| 
      
 223 
     | 
    
         
            +
                    Dog.first # reads from default replica
         
     | 
| 
      
 224 
     | 
    
         
            +
                  end
         
     | 
| 
      
 225 
     | 
    
         
            +
                end
         
     | 
| 
      
 226 
     | 
    
         
            +
                ```
         
     | 
| 
       286 
227 
     | 
    
         | 
| 
       287 
228 
     | 
    
         
             
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       288 
229 
     | 
    
         | 
| 
       289 
     | 
    
         
            -
            *    
     | 
| 
      
 230 
     | 
    
         
            +
            *   Allow double-dash comment syntax when querying read-only databases
         
     | 
| 
       290 
231 
     | 
    
         | 
| 
       291 
     | 
    
         
            -
                 
     | 
| 
      
 232 
     | 
    
         
            +
                *James Adam*
         
     | 
| 
       292 
233 
     | 
    
         | 
| 
       293 
     | 
    
         
            -
             
     | 
| 
      
 234 
     | 
    
         
            +
            *   Add `values_at` method.
         
     | 
| 
       294 
235 
     | 
    
         | 
| 
       295 
     | 
    
         
            -
             
     | 
| 
       296 
     | 
    
         
            -
                ActiveRecord::Relation#cache_key_with_version. This method will be used by
         
     | 
| 
       297 
     | 
    
         
            -
                ActionController::ConditionalGet to ensure that when collection cache versioning
         
     | 
| 
       298 
     | 
    
         
            -
                is enabled, requests using ConditionalGet don't return the same ETag header
         
     | 
| 
       299 
     | 
    
         
            -
                after a collection is modified. Fixes #38078.
         
     | 
| 
       300 
     | 
    
         
            -
             
     | 
| 
       301 
     | 
    
         
            -
                *Aaron Lipman*
         
     | 
| 
       302 
     | 
    
         
            -
             
     | 
| 
       303 
     | 
    
         
            -
            *   A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgresSQL `options`.
         
     | 
| 
       304 
     | 
    
         
            -
             
     | 
| 
       305 
     | 
    
         
            -
                 *Joshua Flanagan*
         
     | 
| 
       306 
     | 
    
         
            -
             
     | 
| 
       307 
     | 
    
         
            -
            *   Retain explicit selections on the base model after applying `includes` and `joins`.
         
     | 
| 
      
 236 
     | 
    
         
            +
                Returns an array containing the values associated with the given methods.
         
     | 
| 
       308 
237 
     | 
    
         | 
| 
       309 
     | 
    
         
            -
                 
     | 
| 
       310 
     | 
    
         
            -
             
     | 
| 
       311 
     | 
    
         
            -
                 
     | 
| 
       312 
     | 
    
         
            -
             
     | 
| 
       313 
     | 
    
         
            -
             
     | 
| 
       314 
     | 
    
         
            -
            ## Rails 6.0.2.2 (March 19, 2020) ##
         
     | 
| 
       315 
     | 
    
         
            -
             
     | 
| 
       316 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
       317 
     | 
    
         
            -
             
     | 
| 
       318 
     | 
    
         
            -
             
     | 
| 
       319 
     | 
    
         
            -
            ## Rails 6.0.2.1 (December 18, 2019) ##
         
     | 
| 
       320 
     | 
    
         
            -
             
     | 
| 
       321 
     | 
    
         
            -
            *   No changes.
         
     | 
| 
       322 
     | 
    
         
            -
             
     | 
| 
       323 
     | 
    
         
            -
             
     | 
| 
       324 
     | 
    
         
            -
            ## Rails 6.0.2 (December 13, 2019) ##
         
     | 
| 
       325 
     | 
    
         
            -
             
     | 
| 
       326 
     | 
    
         
            -
            *   Share the same connection pool for primary and replica databases in the
         
     | 
| 
       327 
     | 
    
         
            -
                transactional tests for the same database.
         
     | 
| 
       328 
     | 
    
         
            -
             
     | 
| 
       329 
     | 
    
         
            -
                *Edouard Chin*
         
     | 
| 
       330 
     | 
    
         
            -
             
     | 
| 
       331 
     | 
    
         
            -
            *   Fix the preloader when one record is fetched using `after_initialize`
         
     | 
| 
       332 
     | 
    
         
            -
                but not the entire collection.
         
     | 
| 
       333 
     | 
    
         
            -
             
     | 
| 
       334 
     | 
    
         
            -
                *Bradley Price*
         
     | 
| 
       335 
     | 
    
         
            -
             
     | 
| 
       336 
     | 
    
         
            -
            *   Fix collection callbacks not terminating when `:abort` is thrown.
         
     | 
| 
       337 
     | 
    
         
            -
             
     | 
| 
       338 
     | 
    
         
            -
                *Edouard Chin*, *Ryuta Kamizono*
         
     | 
| 
       339 
     | 
    
         
            -
             
     | 
| 
       340 
     | 
    
         
            -
            *   Correctly deprecate `where.not` working as NOR for relations.
         
     | 
| 
      
 238 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 239 
     | 
    
         
            +
                topic = Topic.first
         
     | 
| 
      
 240 
     | 
    
         
            +
                topic.values_at(:title, :author_name)
         
     | 
| 
      
 241 
     | 
    
         
            +
                # => ["Budget", "Jason"]
         
     | 
| 
      
 242 
     | 
    
         
            +
                ```
         
     | 
| 
       341 
243 
     | 
    
         | 
| 
       342 
     | 
    
         
            -
                 
     | 
| 
       343 
     | 
    
         
            -
                doing a relation query like `where.not(relation: { ... })`
         
     | 
| 
       344 
     | 
    
         
            -
                wouldn't be properly deprecated and `where.not` would work as
         
     | 
| 
       345 
     | 
    
         
            -
                NAND instead.
         
     | 
| 
      
 244 
     | 
    
         
            +
                Similar to `Hash#values_at` but on an Active Record instance.
         
     | 
| 
       346 
245 
     | 
    
         | 
| 
       347 
     | 
    
         
            -
                * 
     | 
| 
      
 246 
     | 
    
         
            +
                *Guillaume Briday*
         
     | 
| 
       348 
247 
     | 
    
         | 
| 
       349 
     | 
    
         
            -
            *   Fix ` 
     | 
| 
       350 
     | 
    
         
            -
                to the previous database.
         
     | 
| 
      
 248 
     | 
    
         
            +
            *   Fix `read_attribute_before_type_cast` to consider attribute aliases.
         
     | 
| 
       351 
249 
     | 
    
         | 
| 
       352 
     | 
    
         
            -
                 
     | 
| 
       353 
     | 
    
         
            -
                resulting in the last one to be used by subsequent rake tasks.
         
     | 
| 
       354 
     | 
    
         
            -
                We should reestablish a connection to the connection that was
         
     | 
| 
       355 
     | 
    
         
            -
                established before the migrate tasks was run
         
     | 
| 
      
 250 
     | 
    
         
            +
                *Marcelo Lauxen*
         
     | 
| 
       356 
251 
     | 
    
         | 
| 
       357 
     | 
    
         
            -
             
     | 
| 
      
 252 
     | 
    
         
            +
            *   Support passing record to uniqueness validator `:conditions` callable:
         
     | 
| 
       358 
253 
     | 
    
         | 
| 
       359 
     | 
    
         
            -
             
     | 
| 
      
 254 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 255 
     | 
    
         
            +
                class Article < ApplicationRecord
         
     | 
| 
      
 256 
     | 
    
         
            +
                  validates_uniqueness_of :title, conditions: ->(article) {
         
     | 
| 
      
 257 
     | 
    
         
            +
                    published_at = article.published_at
         
     | 
| 
      
 258 
     | 
    
         
            +
                    where(published_at: published_at.beginning_of_year..published_at.end_of_year)
         
     | 
| 
      
 259 
     | 
    
         
            +
                  }
         
     | 
| 
      
 260 
     | 
    
         
            +
                end
         
     | 
| 
      
 261 
     | 
    
         
            +
                ```
         
     | 
| 
       360 
262 
     | 
    
         | 
| 
       361 
     | 
    
         
            -
                * 
     | 
| 
      
 263 
     | 
    
         
            +
                *Eliot Sykes*
         
     | 
| 
       362 
264 
     | 
    
         | 
| 
      
 265 
     | 
    
         
            +
            *   `BatchEnumerator#update_all` and `BatchEnumerator#delete_all` now return the
         
     | 
| 
      
 266 
     | 
    
         
            +
                total number of rows affected, just like their non-batched counterparts.
         
     | 
| 
       363 
267 
     | 
    
         | 
| 
       364 
     | 
    
         
            -
             
     | 
| 
      
 268 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 269 
     | 
    
         
            +
                Person.in_batches.update_all("first_name = 'Eugene'") # => 42
         
     | 
| 
      
 270 
     | 
    
         
            +
                Person.in_batches.delete_all # => 42
         
     | 
| 
      
 271 
     | 
    
         
            +
                ```
         
     | 
| 
       365 
272 
     | 
    
         | 
| 
       366 
     | 
    
         
            -
             
     | 
| 
      
 273 
     | 
    
         
            +
                Fixes #40287.
         
     | 
| 
       367 
274 
     | 
    
         | 
| 
       368 
     | 
    
         
            -
             
     | 
| 
      
 275 
     | 
    
         
            +
                *Eugene Kenny*
         
     | 
| 
       369 
276 
     | 
    
         | 
| 
       370 
     | 
    
         
            -
            * 
     | 
| 
      
 277 
     | 
    
         
            +
            *   Add support for PostgreSQL `interval` data type with conversion to
         
     | 
| 
      
 278 
     | 
    
         
            +
                `ActiveSupport::Duration` when loading records from database and
         
     | 
| 
      
 279 
     | 
    
         
            +
                serialization to ISO 8601 formatted duration string on save.
         
     | 
| 
      
 280 
     | 
    
         
            +
                Add support to define a column in migrations and get it in a schema dump.
         
     | 
| 
      
 281 
     | 
    
         
            +
                Optional column precision is supported.
         
     | 
| 
       371 
282 
     | 
    
         | 
| 
       372 
     | 
    
         
            -
             
     | 
| 
      
 283 
     | 
    
         
            +
                To use this in 6.1, you need to place the next string to your model file:
         
     | 
| 
       373 
284 
     | 
    
         | 
| 
       374 
     | 
    
         
            -
             
     | 
| 
      
 285 
     | 
    
         
            +
                    attribute :duration, :interval
         
     | 
| 
       375 
286 
     | 
    
         | 
| 
       376 
     | 
    
         
            -
             
     | 
| 
      
 287 
     | 
    
         
            +
                To keep old behavior until 6.2 is released:
         
     | 
| 
       377 
288 
     | 
    
         | 
| 
       378 
     | 
    
         
            -
             
     | 
| 
       379 
     | 
    
         
            -
                 context is used.
         
     | 
| 
      
 289 
     | 
    
         
            +
                    attribute :duration, :string
         
     | 
| 
       380 
290 
     | 
    
         | 
| 
       381 
     | 
    
         
            -
             
     | 
| 
      
 291 
     | 
    
         
            +
                Example:
         
     | 
| 
       382 
292 
     | 
    
         | 
| 
       383 
     | 
    
         
            -
             
     | 
| 
       384 
     | 
    
         
            -
             
     | 
| 
      
 293 
     | 
    
         
            +
                    create_table :events do |t|
         
     | 
| 
      
 294 
     | 
    
         
            +
                      t.string   :name
         
     | 
| 
      
 295 
     | 
    
         
            +
                      t.interval :duration
         
     | 
| 
      
 296 
     | 
    
         
            +
                    end
         
     | 
| 
       385 
297 
     | 
    
         | 
| 
       386 
     | 
    
         
            -
             
     | 
| 
      
 298 
     | 
    
         
            +
                    class Event < ApplicationRecord
         
     | 
| 
      
 299 
     | 
    
         
            +
                      attribute :duration, :interval
         
     | 
| 
      
 300 
     | 
    
         
            +
                    end
         
     | 
| 
       387 
301 
     | 
    
         | 
| 
       388 
     | 
    
         
            -
             
     | 
| 
       389 
     | 
    
         
            -
             
     | 
| 
      
 302 
     | 
    
         
            +
                    Event.create!(name: 'Rock Fest', duration: 2.days)
         
     | 
| 
      
 303 
     | 
    
         
            +
                    Event.last.duration # => 2 days
         
     | 
| 
      
 304 
     | 
    
         
            +
                    Event.last.duration.iso8601 # => "P2D"
         
     | 
| 
      
 305 
     | 
    
         
            +
                    Event.new(duration: 'P1DT12H3S').duration # => 1 day, 12 hours, and 3 seconds
         
     | 
| 
      
 306 
     | 
    
         
            +
                    Event.new(duration: '1 day') # Unknown value will be ignored and NULL will be written to database
         
     | 
| 
       390 
307 
     | 
    
         | 
| 
       391 
     | 
    
         
            -
             
     | 
| 
      
 308 
     | 
    
         
            +
                *Andrey Novikov*
         
     | 
| 
       392 
309 
     | 
    
         | 
| 
       393 
     | 
    
         
            -
            * 
     | 
| 
      
 310 
     | 
    
         
            +
            *   Allow associations supporting the `dependent:` key to take `dependent: :destroy_async`.
         
     | 
| 
       394 
311 
     | 
    
         | 
| 
       395 
     | 
    
         
            -
             
     | 
| 
      
 312 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 313 
     | 
    
         
            +
                class Account < ActiveRecord::Base
         
     | 
| 
      
 314 
     | 
    
         
            +
                    belongs_to :supplier, dependent: :destroy_async
         
     | 
| 
      
 315 
     | 
    
         
            +
                end
         
     | 
| 
      
 316 
     | 
    
         
            +
                ```
         
     | 
| 
       396 
317 
     | 
    
         | 
| 
       397 
     | 
    
         
            -
             
     | 
| 
      
 318 
     | 
    
         
            +
                `:destroy_async` will enqueue a job to destroy associated records in the background.
         
     | 
| 
       398 
319 
     | 
    
         | 
| 
       399 
     | 
    
         
            -
                * 
     | 
| 
      
 320 
     | 
    
         
            +
                *DHH*, *George Claghorn*, *Cory Gwin*, *Rafael Mendonça França*, *Adrianna Chang*
         
     | 
| 
       400 
321 
     | 
    
         | 
| 
       401 
     | 
    
         
            -
            *    
     | 
| 
      
 322 
     | 
    
         
            +
            *   Add `SKIP_TEST_DATABASE` environment variable to disable modifying the test database when `rails db:create` and `rails db:drop` are called.
         
     | 
| 
       402 
323 
     | 
    
         | 
| 
       403 
     | 
    
         
            -
                * 
     | 
| 
      
 324 
     | 
    
         
            +
                *Jason Schweier*
         
     | 
| 
       404 
325 
     | 
    
         | 
| 
       405 
     | 
    
         
            -
            *    
     | 
| 
       406 
     | 
    
         
            -
                fixes that idle connections in forked processes wouldn't be reaped.
         
     | 
| 
      
 326 
     | 
    
         
            +
            *   `connects_to` can only be called on `ActiveRecord::Base` or abstract classes.
         
     | 
| 
       407 
327 
     | 
    
         | 
| 
       408 
     | 
    
         
            -
                 
     | 
| 
      
 328 
     | 
    
         
            +
                Ensure that `connects_to` can only be called from `ActiveRecord::Base` or abstract classes. This protects the application from opening duplicate or too many connections.
         
     | 
| 
       409 
329 
     | 
    
         | 
| 
       410 
     | 
    
         
            -
            * 
     | 
| 
       411 
     | 
    
         
            -
                when `ActiveRecord::Relation#reset` or `ActiveRecord::Relation#reload`
         
     | 
| 
       412 
     | 
    
         
            -
                is called.
         
     | 
| 
      
 330 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       413 
331 
     | 
    
         | 
| 
       414 
     | 
    
         
            -
             
     | 
| 
      
 332 
     | 
    
         
            +
            *   All connection adapters `execute` now raises `ActiveRecord::ConnectionNotEstablished` rather than
         
     | 
| 
      
 333 
     | 
    
         
            +
                `ActiveRecord::StatementInvalid` when they encounter a connection error.
         
     | 
| 
       415 
334 
     | 
    
         | 
| 
       416 
     | 
    
         
            -
            * 
     | 
| 
      
 335 
     | 
    
         
            +
                *Jean Boussier*
         
     | 
| 
       417 
336 
     | 
    
         | 
| 
       418 
     | 
    
         
            -
             
     | 
| 
      
 337 
     | 
    
         
            +
            *   `Mysql2Adapter#quote_string` now raises `ActiveRecord::ConnectionNotEstablished` rather than
         
     | 
| 
      
 338 
     | 
    
         
            +
                `ActiveRecord::StatementInvalid` when it can't connect to the MySQL server.
         
     | 
| 
       419 
339 
     | 
    
         | 
| 
       420 
     | 
    
         
            -
            * 
     | 
| 
      
 340 
     | 
    
         
            +
                *Jean Boussier*
         
     | 
| 
       421 
341 
     | 
    
         | 
| 
       422 
     | 
    
         
            -
             
     | 
| 
      
 342 
     | 
    
         
            +
            *   Add support for check constraints that are `NOT VALID` via `validate: false` (PostgreSQL-only).
         
     | 
| 
       423 
343 
     | 
    
         | 
| 
       424 
     | 
    
         
            -
            * 
     | 
| 
      
 344 
     | 
    
         
            +
                *Alex Robbin*
         
     | 
| 
       425 
345 
     | 
    
         | 
| 
       426 
     | 
    
         
            -
             
     | 
| 
      
 346 
     | 
    
         
            +
            *   Ensure the default configuration is considered primary or first for an environment
         
     | 
| 
       427 
347 
     | 
    
         | 
| 
       428 
     | 
    
         
            -
                 
     | 
| 
      
 348 
     | 
    
         
            +
                If a multiple database application provides a configuration named primary, that will be treated as default. In applications that do not have a primary entry, the default database configuration will be the first configuration for an environment.
         
     | 
| 
       429 
349 
     | 
    
         | 
| 
       430 
350 
     | 
    
         
             
                *Eileen M. Uchitelle*
         
     | 
| 
       431 
351 
     | 
    
         | 
| 
       432 
     | 
    
         
            -
            *    
     | 
| 
       433 
     | 
    
         
            -
             
     | 
| 
       434 
     | 
    
         
            -
                *Kir Shatrov*
         
     | 
| 
       435 
     | 
    
         
            -
             
     | 
| 
       436 
     | 
    
         
            -
             
     | 
| 
       437 
     | 
    
         
            -
            ## Rails 6.0.0 (August 16, 2019) ##
         
     | 
| 
      
 352 
     | 
    
         
            +
            *   Allow `where` references association names as joined table name aliases.
         
     | 
| 
       438 
353 
     | 
    
         | 
| 
       439 
     | 
    
         
            -
             
     | 
| 
      
 354 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 355 
     | 
    
         
            +
                class Comment < ActiveRecord::Base
         
     | 
| 
      
 356 
     | 
    
         
            +
                  enum label: [:default, :child]
         
     | 
| 
      
 357 
     | 
    
         
            +
                  has_many :children, class_name: "Comment", foreign_key: :parent_id
         
     | 
| 
      
 358 
     | 
    
         
            +
                end
         
     | 
| 
       440 
359 
     | 
    
         | 
| 
       441 
     | 
    
         
            -
                 
     | 
| 
      
 360 
     | 
    
         
            +
                # ... FROM comments LEFT OUTER JOIN comments children ON ... WHERE children.label = 1
         
     | 
| 
      
 361 
     | 
    
         
            +
                Comment.includes(:children).where("children.label": "child")
         
     | 
| 
      
 362 
     | 
    
         
            +
                ```
         
     | 
| 
       442 
363 
     | 
    
         | 
| 
       443 
364 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       444 
365 
     | 
    
         | 
| 
       445 
     | 
    
         
            -
            *    
     | 
| 
      
 366 
     | 
    
         
            +
            *   Support storing demodulized class name for polymorphic type.
         
     | 
| 
       446 
367 
     | 
    
         | 
| 
       447 
     | 
    
         
            -
                 
     | 
| 
      
 368 
     | 
    
         
            +
                Before Rails 6.1, storing demodulized class name is supported only for STI type
         
     | 
| 
      
 369 
     | 
    
         
            +
                by `store_full_sti_class` class attribute.
         
     | 
| 
       448 
370 
     | 
    
         | 
| 
       449 
     | 
    
         
            -
             
     | 
| 
       450 
     | 
    
         
            -
             
     | 
| 
       451 
     | 
    
         
            -
                    class Foo
         
     | 
| 
       452 
     | 
    
         
            -
                      enum status: [:sent, :not_sent]
         
     | 
| 
       453 
     | 
    
         
            -
                    end
         
     | 
| 
       454 
     | 
    
         
            -
             
     | 
| 
       455 
     | 
    
         
            -
                *Edu Depetris*
         
     | 
| 
       456 
     | 
    
         
            -
             
     | 
| 
       457 
     | 
    
         
            -
            *   Make currency symbols optional for money column type in PostgreSQL
         
     | 
| 
       458 
     | 
    
         
            -
             
     | 
| 
       459 
     | 
    
         
            -
                *Joel Schneider*
         
     | 
| 
      
 371 
     | 
    
         
            +
                Now `store_full_class_name` class attribute can handle both STI and polymorphic types.
         
     | 
| 
       460 
372 
     | 
    
         | 
| 
      
 373 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       461 
374 
     | 
    
         | 
| 
       462 
     | 
    
         
            -
             
     | 
| 
      
 375 
     | 
    
         
            +
            *   Deprecate `rails db:structure:{load, dump}` tasks and extend
         
     | 
| 
      
 376 
     | 
    
         
            +
                `rails db:schema:{load, dump}` tasks to work with either `:ruby` or `:sql` format,
         
     | 
| 
      
 377 
     | 
    
         
            +
                depending on `config.active_record.schema_format` configuration value.
         
     | 
| 
       463 
378 
     | 
    
         | 
| 
       464 
     | 
    
         
            -
            * 
     | 
| 
      
 379 
     | 
    
         
            +
                *fatkodima*
         
     | 
| 
       465 
380 
     | 
    
         | 
| 
       466 
     | 
    
         
            -
             
     | 
| 
       467 
     | 
    
         
            -
             
     | 
| 
       468 
     | 
    
         
            -
            *   PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
         
     | 
| 
      
 381 
     | 
    
         
            +
            *   Respect the `select` values for eager loading.
         
     | 
| 
       469 
382 
     | 
    
         | 
| 
       470 
     | 
    
         
            -
                 
     | 
| 
      
 383 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 384 
     | 
    
         
            +
                post = Post.select("UPPER(title) AS title").first
         
     | 
| 
      
 385 
     | 
    
         
            +
                post.title # => "WELCOME TO THE WEBLOG"
         
     | 
| 
      
 386 
     | 
    
         
            +
                post.body  # => ActiveModel::MissingAttributeError
         
     | 
| 
      
 387 
     | 
    
         
            +
             
     | 
| 
      
 388 
     | 
    
         
            +
                # Rails 6.0 (ignore the `select` values)
         
     | 
| 
      
 389 
     | 
    
         
            +
                post = Post.select("UPPER(title) AS title").eager_load(:comments).first
         
     | 
| 
      
 390 
     | 
    
         
            +
                post.title # => "Welcome to the weblog"
         
     | 
| 
      
 391 
     | 
    
         
            +
                post.body  # => "Such a lovely day"
         
     | 
| 
      
 392 
     | 
    
         
            +
             
     | 
| 
      
 393 
     | 
    
         
            +
                # Rails 6.1 (respect the `select` values)
         
     | 
| 
      
 394 
     | 
    
         
            +
                post = Post.select("UPPER(title) AS title").eager_load(:comments).first
         
     | 
| 
      
 395 
     | 
    
         
            +
                post.title # => "WELCOME TO THE WEBLOG"
         
     | 
| 
      
 396 
     | 
    
         
            +
                post.body  # => ActiveModel::MissingAttributeError
         
     | 
| 
      
 397 
     | 
    
         
            +
                ```
         
     | 
| 
       471 
398 
     | 
    
         | 
| 
       472 
399 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       473 
400 
     | 
    
         | 
| 
       474 
     | 
    
         
            -
            *    
     | 
| 
       475 
     | 
    
         
            -
             
     | 
| 
       476 
     | 
    
         
            -
                Fixes #36465.
         
     | 
| 
       477 
     | 
    
         
            -
             
     | 
| 
       478 
     | 
    
         
            -
                *Jeff Doering*
         
     | 
| 
      
 401 
     | 
    
         
            +
            *   Allow attribute's default to be configured but keeping its own type.
         
     | 
| 
       479 
402 
     | 
    
         | 
| 
       480 
     | 
    
         
            -
             
     | 
| 
      
 403 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 404 
     | 
    
         
            +
                class Post < ActiveRecord::Base
         
     | 
| 
      
 405 
     | 
    
         
            +
                  attribute :written_at, default: -> { Time.now.utc }
         
     | 
| 
      
 406 
     | 
    
         
            +
                end
         
     | 
| 
       481 
407 
     | 
    
         | 
| 
       482 
     | 
    
         
            -
                 
     | 
| 
      
 408 
     | 
    
         
            +
                # Rails 6.0
         
     | 
| 
      
 409 
     | 
    
         
            +
                Post.type_for_attribute(:written_at) # => #<Type::Value ... precision: nil, ...>
         
     | 
| 
       483 
410 
     | 
    
         | 
| 
       484 
     | 
    
         
            -
             
     | 
| 
      
 411 
     | 
    
         
            +
                # Rails 6.1
         
     | 
| 
      
 412 
     | 
    
         
            +
                Post.type_for_attribute(:written_at) # => #<Type::DateTime ... precision: 6, ...>
         
     | 
| 
      
 413 
     | 
    
         
            +
                ```
         
     | 
| 
       485 
414 
     | 
    
         | 
| 
       486 
     | 
    
         
            -
                 
     | 
| 
      
 415 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       487 
416 
     | 
    
         | 
| 
       488 
     | 
    
         
            -
             
     | 
| 
      
 417 
     | 
    
         
            +
            *   Allow default to be configured for Enum.
         
     | 
| 
       489 
418 
     | 
    
         | 
| 
       490 
     | 
    
         
            -
             
     | 
| 
      
 419 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 420 
     | 
    
         
            +
                class Book < ActiveRecord::Base
         
     | 
| 
      
 421 
     | 
    
         
            +
                  enum status: [:proposed, :written, :published], _default: :published
         
     | 
| 
      
 422 
     | 
    
         
            +
                end
         
     | 
| 
       491 
423 
     | 
    
         | 
| 
       492 
     | 
    
         
            -
                 
     | 
| 
      
 424 
     | 
    
         
            +
                Book.new.status # => "published"
         
     | 
| 
      
 425 
     | 
    
         
            +
                ```
         
     | 
| 
       493 
426 
     | 
    
         | 
| 
       494 
     | 
    
         
            -
            * 
     | 
| 
      
 427 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       495 
428 
     | 
    
         | 
| 
       496 
     | 
    
         
            -
             
     | 
| 
      
 429 
     | 
    
         
            +
            *   Deprecate YAML loading from legacy format older than Rails 5.0.
         
     | 
| 
       497 
430 
     | 
    
         | 
| 
       498 
431 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       499 
432 
     | 
    
         | 
| 
      
 433 
     | 
    
         
            +
            *   Added the setting `ActiveRecord::Base.immutable_strings_by_default`, which
         
     | 
| 
      
 434 
     | 
    
         
            +
                allows you to specify that all string columns should be frozen unless
         
     | 
| 
      
 435 
     | 
    
         
            +
                otherwise specified. This will reduce memory pressure for applications which
         
     | 
| 
      
 436 
     | 
    
         
            +
                do not generally mutate string properties of Active Record objects.
         
     | 
| 
       500 
437 
     | 
    
         | 
| 
       501 
     | 
    
         
            -
             
     | 
| 
      
 438 
     | 
    
         
            +
                *Sean Griffin*, *Ryuta Kamizono*
         
     | 
| 
       502 
439 
     | 
    
         | 
| 
       503 
     | 
    
         
            -
            *    
     | 
| 
      
 440 
     | 
    
         
            +
            *   Deprecate `map!` and `collect!` on `ActiveRecord::Result`.
         
     | 
| 
       504 
441 
     | 
    
         | 
| 
       505 
     | 
    
         
            -
                * 
     | 
| 
      
 442 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       506 
443 
     | 
    
         | 
| 
       507 
     | 
    
         
            -
            *    
     | 
| 
      
 444 
     | 
    
         
            +
            *   Support `relation.and` for intersection as Set theory.
         
     | 
| 
       508 
445 
     | 
    
         | 
| 
       509 
446 
     | 
    
         
             
                ```ruby
         
     | 
| 
       510 
     | 
    
         
            -
                 
     | 
| 
       511 
     | 
    
         
            -
                 
     | 
| 
       512 
     | 
    
         
            -
                ```
         
     | 
| 
      
 447 
     | 
    
         
            +
                david_and_mary = Author.where(id: [david, mary])
         
     | 
| 
      
 448 
     | 
    
         
            +
                mary_and_bob   = Author.where(id: [mary, bob])
         
     | 
| 
       513 
449 
     | 
    
         | 
| 
       514 
     | 
    
         
            -
                 
     | 
| 
      
 450 
     | 
    
         
            +
                david_and_mary.merge(mary_and_bob) # => [mary, bob]
         
     | 
| 
       515 
451 
     | 
    
         | 
| 
       516 
     | 
    
         
            -
                 
     | 
| 
       517 
     | 
    
         
            -
                 
     | 
| 
       518 
     | 
    
         
            -
             
     | 
| 
       519 
     | 
    
         
            -
                nor = all.reject { |e|
         
     | 
| 
       520 
     | 
    
         
            -
                  e.estimate_of_type == sapphire.class.polymorphic_name
         
     | 
| 
       521 
     | 
    
         
            -
                }.reject { |e|
         
     | 
| 
       522 
     | 
    
         
            -
                  e.estimate_of_id == sapphire.id
         
     | 
| 
       523 
     | 
    
         
            -
                }
         
     | 
| 
       524 
     | 
    
         
            -
                assert_equal [cars(:honda)], nor
         
     | 
| 
       525 
     | 
    
         
            -
             
     | 
| 
       526 
     | 
    
         
            -
                without_sapphire = PriceEstimate.where.not(
         
     | 
| 
       527 
     | 
    
         
            -
                  estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
         
     | 
| 
       528 
     | 
    
         
            -
                )
         
     | 
| 
       529 
     | 
    
         
            -
                assert_equal nor, without_sapphire.map(&:estimate_of)
         
     | 
| 
      
 452 
     | 
    
         
            +
                david_and_mary.and(mary_and_bob) # => [mary]
         
     | 
| 
      
 453 
     | 
    
         
            +
                david_and_mary.or(mary_and_bob)  # => [david, mary, bob]
         
     | 
| 
       530 
454 
     | 
    
         
             
                ```
         
     | 
| 
       531 
455 
     | 
    
         | 
| 
       532 
     | 
    
         
            -
                 
     | 
| 
       533 
     | 
    
         
            -
             
     | 
| 
       534 
     | 
    
         
            -
                ```ruby
         
     | 
| 
       535 
     | 
    
         
            -
                sapphire = treasures(:sapphire)
         
     | 
| 
      
 456 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       536 
457 
     | 
    
         | 
| 
       537 
     | 
    
         
            -
             
     | 
| 
       538 
     | 
    
         
            -
                 
     | 
| 
      
 458 
     | 
    
         
            +
            *   Merging conditions on the same column no longer maintain both conditions,
         
     | 
| 
      
 459 
     | 
    
         
            +
                and will be consistently replaced by the latter condition in Rails 6.2.
         
     | 
| 
      
 460 
     | 
    
         
            +
                To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
         
     | 
| 
       539 
461 
     | 
    
         | 
| 
       540 
     | 
    
         
            -
                 
     | 
| 
       541 
     | 
    
         
            -
             
     | 
| 
       542 
     | 
    
         
            -
                )
         
     | 
| 
       543 
     | 
    
         
            -
                assert_equal nand, without_sapphire.map(&:estimate_of)
         
     | 
| 
       544 
     | 
    
         
            -
                ```
         
     | 
| 
      
 462 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 463 
     | 
    
         
            +
                # Rails 6.1 (IN clause is replaced by merger side equality condition)
         
     | 
| 
      
 464 
     | 
    
         
            +
                Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
         
     | 
| 
       545 
465 
     | 
    
         | 
| 
       546 
     | 
    
         
            -
                 
     | 
| 
      
 466 
     | 
    
         
            +
                # Rails 6.1 (both conflict conditions exists, deprecated)
         
     | 
| 
      
 467 
     | 
    
         
            +
                Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
         
     | 
| 
       547 
468 
     | 
    
         | 
| 
       548 
     | 
    
         
            -
             
     | 
| 
      
 469 
     | 
    
         
            +
                # Rails 6.1 with rewhere to migrate to Rails 6.2's behavior
         
     | 
| 
      
 470 
     | 
    
         
            +
                Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
         
     | 
| 
       549 
471 
     | 
    
         | 
| 
       550 
     | 
    
         
            -
                 
     | 
| 
      
 472 
     | 
    
         
            +
                # Rails 6.2 (same behavior with IN clause, mergee side condition is consistently replaced)
         
     | 
| 
      
 473 
     | 
    
         
            +
                Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
         
     | 
| 
      
 474 
     | 
    
         
            +
                Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
         
     | 
| 
      
 475 
     | 
    
         
            +
                ```
         
     | 
| 
       551 
476 
     | 
    
         | 
| 
       552 
477 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       553 
478 
     | 
    
         | 
| 
       554 
     | 
    
         
            -
            *    
     | 
| 
       555 
     | 
    
         
            -
                the versioned entries in `ActiveSupport::Cache`. This also means that
         
     | 
| 
       556 
     | 
    
         
            -
                `ActiveRecord::Relation#cache_key` will now return a stable key that does not
         
     | 
| 
       557 
     | 
    
         
            -
                include the max timestamp or count any more.
         
     | 
| 
      
 479 
     | 
    
         
            +
            *   Do not mark Postgresql MAC address and UUID attributes as changed when the assigned value only varies by case.
         
     | 
| 
       558 
480 
     | 
    
         | 
| 
       559 
     | 
    
         
            -
                 
     | 
| 
       560 
     | 
    
         
            -
                cache keys with timestamps until you set `ActiveRecord::Base.collection_cache_versioning = true`.
         
     | 
| 
       561 
     | 
    
         
            -
                That's the setting for all new apps on Rails 6.0+
         
     | 
| 
      
 481 
     | 
    
         
            +
                *Peter Fry*
         
     | 
| 
       562 
482 
     | 
    
         | 
| 
       563 
     | 
    
         
            -
             
     | 
| 
      
 483 
     | 
    
         
            +
            *   Resolve issue with insert_all unique_by option when used with expression index.
         
     | 
| 
       564 
484 
     | 
    
         | 
| 
       565 
     | 
    
         
            -
             
     | 
| 
      
 485 
     | 
    
         
            +
                When the `:unique_by` option of `ActiveRecord::Persistence.insert_all` and
         
     | 
| 
      
 486 
     | 
    
         
            +
                `ActiveRecord::Persistence.upsert_all` was used with the name of an expression index, an error
         
     | 
| 
      
 487 
     | 
    
         
            +
                was raised. Adding a guard around the formatting behavior for the `:unique_by` corrects this.
         
     | 
| 
       566 
488 
     | 
    
         | 
| 
       567 
     | 
    
         
            -
                 
     | 
| 
      
 489 
     | 
    
         
            +
                Usage:
         
     | 
| 
       568 
490 
     | 
    
         | 
| 
       569 
     | 
    
         
            -
                 
     | 
| 
      
 491 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 492 
     | 
    
         
            +
                create_table :books, id: :integer, force: true do |t|
         
     | 
| 
      
 493 
     | 
    
         
            +
                  t.column :name, :string
         
     | 
| 
      
 494 
     | 
    
         
            +
                  t.index "lower(name)", unique: true
         
     | 
| 
      
 495 
     | 
    
         
            +
                end
         
     | 
| 
       570 
496 
     | 
    
         | 
| 
       571 
     | 
    
         
            -
             
     | 
| 
       572 
     | 
    
         
            -
                 
     | 
| 
      
 497 
     | 
    
         
            +
                Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
         
     | 
| 
      
 498 
     | 
    
         
            +
                ```
         
     | 
| 
       573 
499 
     | 
    
         | 
| 
       574 
     | 
    
         
            -
                 
     | 
| 
      
 500 
     | 
    
         
            +
                Fixes #39516.
         
     | 
| 
       575 
501 
     | 
    
         | 
| 
       576 
     | 
    
         
            -
            * 
     | 
| 
      
 502 
     | 
    
         
            +
                *Austen Madden*
         
     | 
| 
       577 
503 
     | 
    
         | 
| 
       578 
     | 
    
         
            -
             
     | 
| 
      
 504 
     | 
    
         
            +
            *   Add basic support for CHECK constraints to database migrations.
         
     | 
| 
       579 
505 
     | 
    
         | 
| 
       580 
     | 
    
         
            -
                 
     | 
| 
      
 506 
     | 
    
         
            +
                Usage:
         
     | 
| 
       581 
507 
     | 
    
         | 
| 
       582 
     | 
    
         
            -
             
     | 
| 
      
 508 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 509 
     | 
    
         
            +
                add_check_constraint :products, "price > 0", name: "price_check"
         
     | 
| 
      
 510 
     | 
    
         
            +
                remove_check_constraint :products, name: "price_check"
         
     | 
| 
      
 511 
     | 
    
         
            +
                ```
         
     | 
| 
       583 
512 
     | 
    
         | 
| 
       584 
     | 
    
         
            -
                 
     | 
| 
       585 
     | 
    
         
            -
                associations, the callback for a `has_many` association was run while
         
     | 
| 
       586 
     | 
    
         
            -
                another instance of the same callback on the same association hadn't
         
     | 
| 
       587 
     | 
    
         
            -
                finished running. When control returned to the first instance of the
         
     | 
| 
       588 
     | 
    
         
            -
                callback, the instance variable had changed, and subsequent associated
         
     | 
| 
       589 
     | 
    
         
            -
                records weren't saved correctly. Specifically, the ID field for the
         
     | 
| 
       590 
     | 
    
         
            -
                `belongs_to` corresponding to the `has_many` was `nil`.
         
     | 
| 
      
 513 
     | 
    
         
            +
                *fatkodima*
         
     | 
| 
       591 
514 
     | 
    
         | 
| 
       592 
     | 
    
         
            -
             
     | 
| 
      
 515 
     | 
    
         
            +
            *   Add `ActiveRecord::Base.strict_loading_by_default` and `ActiveRecord::Base.strict_loading_by_default=`
         
     | 
| 
      
 516 
     | 
    
         
            +
                to enable/disable strict_loading mode by default for a model. The configuration's value is
         
     | 
| 
      
 517 
     | 
    
         
            +
                inheritable by subclasses, but they can override that value and it will not impact parent class.
         
     | 
| 
       593 
518 
     | 
    
         | 
| 
       594 
     | 
    
         
            -
                 
     | 
| 
      
 519 
     | 
    
         
            +
                Usage:
         
     | 
| 
       595 
520 
     | 
    
         | 
| 
       596 
     | 
    
         
            -
             
     | 
| 
      
 521 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 522 
     | 
    
         
            +
                class Developer < ApplicationRecord
         
     | 
| 
      
 523 
     | 
    
         
            +
                  self.strict_loading_by_default = true
         
     | 
| 
       597 
524 
     | 
    
         | 
| 
       598 
     | 
    
         
            -
             
     | 
| 
      
 525 
     | 
    
         
            +
                  has_many :projects
         
     | 
| 
      
 526 
     | 
    
         
            +
                end
         
     | 
| 
       599 
527 
     | 
    
         | 
| 
       600 
     | 
    
         
            -
                 
     | 
| 
       601 
     | 
    
         
            -
                 
     | 
| 
       602 
     | 
    
         
            -
                 
     | 
| 
       603 
     | 
    
         
            -
                add_column :items, :attr3, :integer,  limit: 10     # => ActiveRecordError
         
     | 
| 
       604 
     | 
    
         
            -
                add_column :items, :attr4, :datetime, precision: 10 # => ActiveRecordError
         
     | 
| 
      
 528 
     | 
    
         
            +
                dev = Developer.first
         
     | 
| 
      
 529 
     | 
    
         
            +
                dev.projects.first
         
     | 
| 
      
 530 
     | 
    
         
            +
                # => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.
         
     | 
| 
       605 
531 
     | 
    
         
             
                ```
         
     | 
| 
       606 
532 
     | 
    
         | 
| 
       607 
     | 
    
         
            -
                 
     | 
| 
      
 533 
     | 
    
         
            +
                *bogdanvlviv*
         
     | 
| 
       608 
534 
     | 
    
         | 
| 
       609 
     | 
    
         
            -
             
     | 
| 
       610 
     | 
    
         
            -
                add_column :items, :attr1, :binary,   size: 10      # => ArgumentError
         
     | 
| 
       611 
     | 
    
         
            -
                add_column :items, :attr2, :decimal,  scale: 10     # => ArgumentError
         
     | 
| 
       612 
     | 
    
         
            -
                add_column :items, :attr3, :integer,  limit: 10     # => ArgumentError
         
     | 
| 
       613 
     | 
    
         
            -
                add_column :items, :attr4, :datetime, precision: 10 # => ArgumentError
         
     | 
| 
       614 
     | 
    
         
            -
                ```
         
     | 
| 
      
 535 
     | 
    
         
            +
            *   Deprecate passing an Active Record object to `quote`/`type_cast` directly.
         
     | 
| 
       615 
536 
     | 
    
         | 
| 
       616 
537 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       617 
538 
     | 
    
         | 
| 
       618 
     | 
    
         
            -
            *    
     | 
| 
       619 
     | 
    
         
            -
                whether preloaded / eager loaded or not, with the exception of `unscoped`.
         
     | 
| 
      
 539 
     | 
    
         
            +
            *   Default engine `ENGINE=InnoDB` is no longer dumped to make schema more agnostic.
         
     | 
| 
       620 
540 
     | 
    
         | 
| 
       621 
541 
     | 
    
         
             
                Before:
         
     | 
| 
       622 
542 
     | 
    
         | 
| 
       623 
543 
     | 
    
         
             
                ```ruby
         
     | 
| 
       624 
     | 
    
         
            -
                 
     | 
| 
       625 
     | 
    
         
            -
                  Comment.find(1).post                   # => nil
         
     | 
| 
       626 
     | 
    
         
            -
                  Comment.preload(:post).find(1).post    # => #<Post id: 1, ...>
         
     | 
| 
       627 
     | 
    
         
            -
                  Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
         
     | 
| 
      
 544 
     | 
    
         
            +
                create_table "accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
         
     | 
| 
       628 
545 
     | 
    
         
             
                end
         
     | 
| 
       629 
546 
     | 
    
         
             
                ```
         
     | 
| 
       630 
547 
     | 
    
         | 
| 
       631 
548 
     | 
    
         
             
                After:
         
     | 
| 
       632 
549 
     | 
    
         | 
| 
       633 
550 
     | 
    
         
             
                ```ruby
         
     | 
| 
       634 
     | 
    
         
            -
                 
     | 
| 
       635 
     | 
    
         
            -
                  Comment.find(1).post                   # => #<Post id: 1, ...>
         
     | 
| 
       636 
     | 
    
         
            -
                  Comment.preload(:post).find(1).post    # => #<Post id: 1, ...>
         
     | 
| 
       637 
     | 
    
         
            -
                  Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
         
     | 
| 
      
 551 
     | 
    
         
            +
                create_table "accounts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
         
     | 
| 
       638 
552 
     | 
    
         
             
                end
         
     | 
| 
       639 
553 
     | 
    
         
             
                ```
         
     | 
| 
       640 
554 
     | 
    
         | 
| 
       641 
     | 
    
         
            -
                Fixes #34638, #35398.
         
     | 
| 
       642 
     | 
    
         
            -
             
     | 
| 
       643 
555 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       644 
556 
     | 
    
         | 
| 
       645 
     | 
    
         
            -
            *    
     | 
| 
       646 
     | 
    
         
            -
             
     | 
| 
       647 
     | 
    
         
            -
                Runs `db:migrate` if the database exists or `db:setup` if it doesn't.
         
     | 
| 
       648 
     | 
    
         
            -
             
     | 
| 
       649 
     | 
    
         
            -
                *Roberto Miranda*
         
     | 
| 
       650 
     | 
    
         
            -
             
     | 
| 
       651 
     | 
    
         
            -
            *   Add `after_save_commit` callback as shortcut for `after_commit :hook, on: [ :create, :update ]`.
         
     | 
| 
       652 
     | 
    
         
            -
             
     | 
| 
       653 
     | 
    
         
            -
                *DHH*
         
     | 
| 
       654 
     | 
    
         
            -
             
     | 
| 
       655 
     | 
    
         
            -
            *   Assign all attributes before calling `build` to ensure the child record is visible in
         
     | 
| 
       656 
     | 
    
         
            -
                `before_add` and `after_add` callbacks for `has_many :through` associations.
         
     | 
| 
       657 
     | 
    
         
            -
             
     | 
| 
       658 
     | 
    
         
            -
                Fixes #33249.
         
     | 
| 
       659 
     | 
    
         
            -
             
     | 
| 
       660 
     | 
    
         
            -
                *Ryan H. Kerr*
         
     | 
| 
       661 
     | 
    
         
            -
             
     | 
| 
       662 
     | 
    
         
            -
            *   Add `ActiveRecord::Relation#extract_associated` for extracting associated records from a relation.
         
     | 
| 
       663 
     | 
    
         
            -
             
     | 
| 
       664 
     | 
    
         
            -
                ```
         
     | 
| 
       665 
     | 
    
         
            -
                account.memberships.extract_associated(:user)
         
     | 
| 
       666 
     | 
    
         
            -
                # => Returns collection of User records
         
     | 
| 
       667 
     | 
    
         
            -
                ```
         
     | 
| 
      
 557 
     | 
    
         
            +
            *   Added delegated type as an alternative to single-table inheritance for representing class hierarchies.
         
     | 
| 
      
 558 
     | 
    
         
            +
                See ActiveRecord::DelegatedType for the full description.
         
     | 
| 
       668 
559 
     | 
    
         | 
| 
       669 
560 
     | 
    
         
             
                *DHH*
         
     | 
| 
       670 
561 
     | 
    
         | 
| 
       671 
     | 
    
         
            -
            *    
     | 
| 
      
 562 
     | 
    
         
            +
            *   Deprecate aggregations with group by duplicated fields.
         
     | 
| 
       672 
563 
     | 
    
         | 
| 
       673 
     | 
    
         
            -
                 
     | 
| 
      
 564 
     | 
    
         
            +
                To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
         
     | 
| 
       674 
565 
     | 
    
         | 
| 
      
 566 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 567 
     | 
    
         
            +
                accounts = Account.group(:firm_id)
         
     | 
| 
      
 568 
     | 
    
         
            +
             
     | 
| 
      
 569 
     | 
    
         
            +
                # duplicated group fields, deprecated.
         
     | 
| 
      
 570 
     | 
    
         
            +
                accounts.merge(accounts.where.not(credit_limit: nil)).sum(:credit_limit)
         
     | 
| 
      
 571 
     | 
    
         
            +
                # => {
         
     | 
| 
      
 572 
     | 
    
         
            +
                #   [1, 1] => 50,
         
     | 
| 
      
 573 
     | 
    
         
            +
                #   [2, 2] => 60
         
     | 
| 
      
 574 
     | 
    
         
            +
                # }
         
     | 
| 
      
 575 
     | 
    
         
            +
             
     | 
| 
      
 576 
     | 
    
         
            +
                # use `uniq!(:group)` to deduplicate group fields.
         
     | 
| 
      
 577 
     | 
    
         
            +
                accounts.merge(accounts.where.not(credit_limit: nil)).uniq!(:group).sum(:credit_limit)
         
     | 
| 
      
 578 
     | 
    
         
            +
                # => {
         
     | 
| 
      
 579 
     | 
    
         
            +
                #   1 => 50,
         
     | 
| 
      
 580 
     | 
    
         
            +
                #   2 => 60
         
     | 
| 
      
 581 
     | 
    
         
            +
                # }
         
     | 
| 
       675 
582 
     | 
    
         
             
                ```
         
     | 
| 
       676 
     | 
    
         
            -
                Post.where(id: 123).annotate("this is a comment").to_sql
         
     | 
| 
       677 
     | 
    
         
            -
                # SELECT "posts".* FROM "posts" WHERE "posts"."id" = 123 /* this is a comment */
         
     | 
| 
       678 
     | 
    
         
            -
                ```
         
     | 
| 
       679 
     | 
    
         
            -
             
     | 
| 
       680 
     | 
    
         
            -
                This can be useful in instrumentation or other analysis of issued queries.
         
     | 
| 
       681 
     | 
    
         
            -
             
     | 
| 
       682 
     | 
    
         
            -
                *Matt Yoho*
         
     | 
| 
       683 
     | 
    
         
            -
             
     | 
| 
       684 
     | 
    
         
            -
            *   Support Optimizer Hints.
         
     | 
| 
       685 
     | 
    
         
            -
             
     | 
| 
       686 
     | 
    
         
            -
                In most databases, a way to control the optimizer is by using optimizer hints,
         
     | 
| 
       687 
     | 
    
         
            -
                which can be specified within individual statements.
         
     | 
| 
       688 
     | 
    
         
            -
             
     | 
| 
       689 
     | 
    
         
            -
                Example (for MySQL):
         
     | 
| 
       690 
     | 
    
         
            -
             
     | 
| 
       691 
     | 
    
         
            -
                    Topic.optimizer_hints("MAX_EXECUTION_TIME(50000)", "NO_INDEX_MERGE(topics)")
         
     | 
| 
       692 
     | 
    
         
            -
                    # SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`
         
     | 
| 
       693 
     | 
    
         
            -
             
     | 
| 
       694 
     | 
    
         
            -
                Example (for PostgreSQL with pg_hint_plan):
         
     | 
| 
       695 
     | 
    
         
            -
             
     | 
| 
       696 
     | 
    
         
            -
                    Topic.optimizer_hints("SeqScan(topics)", "Parallel(topics 8)")
         
     | 
| 
       697 
     | 
    
         
            -
                    # SELECT /*+ SeqScan(topics) Parallel(topics 8) */ "topics".* FROM "topics"
         
     | 
| 
       698 
     | 
    
         
            -
             
     | 
| 
       699 
     | 
    
         
            -
                See also:
         
     | 
| 
       700 
     | 
    
         
            -
             
     | 
| 
       701 
     | 
    
         
            -
                * https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html
         
     | 
| 
       702 
     | 
    
         
            -
                * https://pghintplan.osdn.jp/pg_hint_plan.html
         
     | 
| 
       703 
     | 
    
         
            -
                * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/influencing-the-optimizer.html
         
     | 
| 
       704 
     | 
    
         
            -
                * https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-2017
         
     | 
| 
       705 
     | 
    
         
            -
                * https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.admin.perf.doc/doc/c0070117.html
         
     | 
| 
       706 
583 
     | 
    
         | 
| 
       707 
584 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       708 
585 
     | 
    
         | 
| 
       709 
     | 
    
         
            -
            *    
     | 
| 
       710 
     | 
    
         
            -
             
     | 
| 
       711 
     | 
    
         
            -
                For example, the following code no longer return false as casted non-empty string:
         
     | 
| 
      
 586 
     | 
    
         
            +
            *   Deprecate duplicated query annotations.
         
     | 
| 
       712 
587 
     | 
    
         | 
| 
       713 
     | 
    
         
            -
                 
     | 
| 
       714 
     | 
    
         
            -
                class Post < ActiveRecord::Base
         
     | 
| 
       715 
     | 
    
         
            -
                  attribute :user_defined_text, :text
         
     | 
| 
       716 
     | 
    
         
            -
                end
         
     | 
| 
      
 588 
     | 
    
         
            +
                To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
         
     | 
| 
       717 
589 
     | 
    
         | 
| 
       718 
     | 
    
         
            -
                 
     | 
| 
       719 
     | 
    
         
            -
                 
     | 
| 
       720 
     | 
    
         
            -
             
     | 
| 
       721 
     | 
    
         
            -
                *Yuji Kamijima*
         
     | 
| 
       722 
     | 
    
         
            -
             
     | 
| 
       723 
     | 
    
         
            -
            *   Quote empty ranges like other empty enumerables.
         
     | 
| 
       724 
     | 
    
         
            -
             
     | 
| 
       725 
     | 
    
         
            -
                *Patrick Rebsch*
         
     | 
| 
       726 
     | 
    
         
            -
             
     | 
| 
       727 
     | 
    
         
            -
            *   Add `insert_all`/`insert_all!`/`upsert_all` methods to `ActiveRecord::Persistence`,
         
     | 
| 
       728 
     | 
    
         
            -
                allowing bulk inserts akin to the bulk updates provided by `update_all` and
         
     | 
| 
       729 
     | 
    
         
            -
                bulk deletes by `delete_all`.
         
     | 
| 
       730 
     | 
    
         
            -
             
     | 
| 
       731 
     | 
    
         
            -
                Supports skipping or upserting duplicates through the `ON CONFLICT` syntax
         
     | 
| 
       732 
     | 
    
         
            -
                for PostgreSQL (9.5+) and SQLite (3.24+) and `ON DUPLICATE KEY UPDATE` syntax
         
     | 
| 
       733 
     | 
    
         
            -
                for MySQL.
         
     | 
| 
       734 
     | 
    
         
            -
             
     | 
| 
       735 
     | 
    
         
            -
                *Bob Lail*
         
     | 
| 
       736 
     | 
    
         
            -
             
     | 
| 
       737 
     | 
    
         
            -
            *   Add `rails db:seed:replant` that truncates tables of each database
         
     | 
| 
       738 
     | 
    
         
            -
                for current environment and loads the seeds.
         
     | 
| 
       739 
     | 
    
         
            -
             
     | 
| 
       740 
     | 
    
         
            -
                *bogdanvlviv*, *DHH*
         
     | 
| 
       741 
     | 
    
         
            -
             
     | 
| 
       742 
     | 
    
         
            -
            *   Add `ActiveRecord::Base.connection.truncate` for SQLite3 adapter.
         
     | 
| 
       743 
     | 
    
         
            -
             
     | 
| 
       744 
     | 
    
         
            -
                *bogdanvlviv*
         
     | 
| 
      
 590 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 591 
     | 
    
         
            +
                accounts = Account.where(id: [1, 2]).annotate("david and mary")
         
     | 
| 
       745 
592 
     | 
    
         | 
| 
       746 
     | 
    
         
            -
             
     | 
| 
      
 593 
     | 
    
         
            +
                # duplicated annotations, deprecated.
         
     | 
| 
      
 594 
     | 
    
         
            +
                accounts.merge(accounts.rewhere(id: 3))
         
     | 
| 
      
 595 
     | 
    
         
            +
                # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */ /* david and mary */
         
     | 
| 
       747 
596 
     | 
    
         | 
| 
       748 
     | 
    
         
            -
                 
     | 
| 
       749 
     | 
    
         
            -
                 
     | 
| 
       750 
     | 
    
         
            -
                 
     | 
| 
      
 597 
     | 
    
         
            +
                # use `uniq!(:annotate)` to deduplicate annotations.
         
     | 
| 
      
 598 
     | 
    
         
            +
                accounts.merge(accounts.rewhere(id: 3)).uniq!(:annotate)
         
     | 
| 
      
 599 
     | 
    
         
            +
                # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */
         
     | 
| 
      
 600 
     | 
    
         
            +
                ```
         
     | 
| 
       751 
601 
     | 
    
         | 
| 
       752 
602 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       753 
603 
     | 
    
         | 
| 
       754 
     | 
    
         
            -
            *    
     | 
| 
      
 604 
     | 
    
         
            +
            *   Resolve conflict between counter cache and optimistic locking.
         
     | 
| 
      
 605 
     | 
    
         
            +
             
     | 
| 
      
 606 
     | 
    
         
            +
                Bump an Active Record instance's lock version after updating its counter
         
     | 
| 
      
 607 
     | 
    
         
            +
                cache. This avoids raising an unnecessary `ActiveRecord::StaleObjectError`
         
     | 
| 
      
 608 
     | 
    
         
            +
                upon subsequent transactions by maintaining parity with the corresponding
         
     | 
| 
      
 609 
     | 
    
         
            +
                database record's `lock_version` column.
         
     | 
| 
       755 
610 
     | 
    
         | 
| 
       756 
     | 
    
         
            -
                Fixes # 
     | 
| 
      
 611 
     | 
    
         
            +
                Fixes #16449.
         
     | 
| 
       757 
612 
     | 
    
         | 
| 
       758 
     | 
    
         
            -
                * 
     | 
| 
      
 613 
     | 
    
         
            +
                *Aaron Lipman*
         
     | 
| 
       759 
614 
     | 
    
         | 
| 
       760 
     | 
    
         
            -
            *    
     | 
| 
      
 615 
     | 
    
         
            +
            *   Support merging option `:rewhere` to allow mergee side condition to be replaced exactly.
         
     | 
| 
       761 
616 
     | 
    
         | 
| 
       762 
     | 
    
         
            -
                 
     | 
| 
      
 617 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 618 
     | 
    
         
            +
                david_and_mary = Author.where(id: david.id..mary.id)
         
     | 
| 
       763 
619 
     | 
    
         | 
| 
       764 
     | 
    
         
            -
             
     | 
| 
       765 
     | 
    
         
            -
             
     | 
| 
       766 
     | 
    
         
            -
                    end
         
     | 
| 
      
 620 
     | 
    
         
            +
                # both conflict conditions exists
         
     | 
| 
      
 621 
     | 
    
         
            +
                david_and_mary.merge(Author.where(id: bob)) # => []
         
     | 
| 
       767 
622 
     | 
    
         | 
| 
       768 
     | 
    
         
            -
             
     | 
| 
       769 
     | 
    
         
            -
             
     | 
| 
       770 
     | 
    
         
            -
                    Post.not_trashed # => where.not(status: :trashed)
         
     | 
| 
      
 623 
     | 
    
         
            +
                # mergee side condition is replaced by rewhere
         
     | 
| 
      
 624 
     | 
    
         
            +
                david_and_mary.merge(Author.rewhere(id: bob)) # => [bob]
         
     | 
| 
       771 
625 
     | 
    
         | 
| 
       772 
     | 
    
         
            -
                 
     | 
| 
      
 626 
     | 
    
         
            +
                # mergee side condition is replaced by rewhere option
         
     | 
| 
      
 627 
     | 
    
         
            +
                david_and_mary.merge(Author.where(id: bob), rewhere: true) # => [bob]
         
     | 
| 
      
 628 
     | 
    
         
            +
                ```
         
     | 
| 
       773 
629 
     | 
    
         | 
| 
       774 
     | 
    
         
            -
            * 
     | 
| 
      
 630 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       775 
631 
     | 
    
         | 
| 
       776 
     | 
    
         
            -
             
     | 
| 
      
 632 
     | 
    
         
            +
            *   Add support for finding records based on signed ids, which are tamper-proof, verified ids that can be
         
     | 
| 
      
 633 
     | 
    
         
            +
                set to expire and scoped with a purpose. This is particularly useful for things like password reset
         
     | 
| 
      
 634 
     | 
    
         
            +
                or email verification, where you want the bearer of the signed id to be able to interact with the
         
     | 
| 
      
 635 
     | 
    
         
            +
                underlying record, but usually only within a certain time period.
         
     | 
| 
       777 
636 
     | 
    
         | 
| 
       778 
     | 
    
         
            -
                 
     | 
| 
      
 637 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 638 
     | 
    
         
            +
                signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset
         
     | 
| 
       779 
639 
     | 
    
         | 
| 
      
 640 
     | 
    
         
            +
                User.find_signed signed_id # => nil, since the purpose does not match
         
     | 
| 
       780 
641 
     | 
    
         | 
| 
       781 
     | 
    
         
            -
             
     | 
| 
      
 642 
     | 
    
         
            +
                travel 16.minutes
         
     | 
| 
      
 643 
     | 
    
         
            +
                User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired
         
     | 
| 
       782 
644 
     | 
    
         | 
| 
       783 
     | 
    
         
            -
             
     | 
| 
      
 645 
     | 
    
         
            +
                travel_back
         
     | 
| 
      
 646 
     | 
    
         
            +
                User.find_signed signed_id, purpose: :password_reset # => User.first
         
     | 
| 
       784 
647 
     | 
    
         | 
| 
      
 648 
     | 
    
         
            +
                User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
         
     | 
| 
      
 649 
     | 
    
         
            +
                ```
         
     | 
| 
       785 
650 
     | 
    
         | 
| 
       786 
     | 
    
         
            -
             
     | 
| 
      
 651 
     | 
    
         
            +
                *DHH*
         
     | 
| 
       787 
652 
     | 
    
         | 
| 
       788 
     | 
    
         
            -
            *    
     | 
| 
      
 653 
     | 
    
         
            +
            *   Support `ALGORITHM = INSTANT` DDL option for index operations on MySQL.
         
     | 
| 
       789 
654 
     | 
    
         | 
| 
       790 
655 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       791 
656 
     | 
    
         | 
| 
       792 
     | 
    
         
            -
            *    
     | 
| 
      
 657 
     | 
    
         
            +
            *   Fix index creation to preserve index comment in bulk change table on MySQL.
         
     | 
| 
       793 
658 
     | 
    
         | 
| 
       794 
659 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       795 
660 
     | 
    
         | 
| 
       796 
     | 
    
         
            -
            *    
     | 
| 
      
 661 
     | 
    
         
            +
            *   Allow `unscope` to be aware of table name qualified values.
         
     | 
| 
       797 
662 
     | 
    
         | 
| 
       798 
     | 
    
         
            -
                 
     | 
| 
      
 663 
     | 
    
         
            +
                It is possible to unscope only the column in the specified table.
         
     | 
| 
       799 
664 
     | 
    
         | 
| 
       800 
     | 
    
         
            -
             
     | 
| 
      
 665 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 666 
     | 
    
         
            +
                posts = Post.joins(:comments).group(:"posts.hidden")
         
     | 
| 
      
 667 
     | 
    
         
            +
                posts = posts.where("posts.hidden": false, "comments.hidden": false)
         
     | 
| 
       801 
668 
     | 
    
         | 
| 
       802 
     | 
    
         
            -
                 
     | 
| 
       803 
     | 
    
         
            -
                 
     | 
| 
      
 669 
     | 
    
         
            +
                posts.count
         
     | 
| 
      
 670 
     | 
    
         
            +
                # => { false => 10 }
         
     | 
| 
       804 
671 
     | 
    
         | 
| 
       805 
     | 
    
         
            -
                 
     | 
| 
      
 672 
     | 
    
         
            +
                # unscope both hidden columns
         
     | 
| 
      
 673 
     | 
    
         
            +
                posts.unscope(where: :hidden).count
         
     | 
| 
      
 674 
     | 
    
         
            +
                # => { false => 11, true => 1 }
         
     | 
| 
       806 
675 
     | 
    
         | 
| 
       807 
     | 
    
         
            -
             
     | 
| 
       808 
     | 
    
         
            -
             
     | 
| 
      
 676 
     | 
    
         
            +
                # unscope only comments.hidden column
         
     | 
| 
      
 677 
     | 
    
         
            +
                posts.unscope(where: :"comments.hidden").count
         
     | 
| 
      
 678 
     | 
    
         
            +
                # => { false => 11 }
         
     | 
| 
      
 679 
     | 
    
         
            +
                ```
         
     | 
| 
       809 
680 
     | 
    
         | 
| 
       810 
     | 
    
         
            -
             
     | 
| 
       811 
     | 
    
         
            -
                    david.posts.destroy_by(id: [1, 2, 3])
         
     | 
| 
      
 681 
     | 
    
         
            +
                *Ryuta Kamizono*, *Slava Korolev*
         
     | 
| 
       812 
682 
     | 
    
         | 
| 
       813 
     | 
    
         
            -
             
     | 
| 
       814 
     | 
    
         
            -
                `delete_all` on the matched records.
         
     | 
| 
      
 683 
     | 
    
         
            +
            *   Fix `rewhere` to truly overwrite collided where clause by new where clause.
         
     | 
| 
       815 
684 
     | 
    
         | 
| 
       816 
     | 
    
         
            -
                 
     | 
| 
      
 685 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 686 
     | 
    
         
            +
                steve = Person.find_by(name: "Steve")
         
     | 
| 
      
 687 
     | 
    
         
            +
                david = Author.find_by(name: "David")
         
     | 
| 
       817 
688 
     | 
    
         | 
| 
       818 
     | 
    
         
            -
             
     | 
| 
       819 
     | 
    
         
            -
                    Person.delete_by(name: 'David', rating: 4)
         
     | 
| 
      
 689 
     | 
    
         
            +
                relation = Essay.where(writer: steve)
         
     | 
| 
       820 
690 
     | 
    
         | 
| 
       821 
     | 
    
         
            -
             
     | 
| 
       822 
     | 
    
         
            -
             
     | 
| 
      
 691 
     | 
    
         
            +
                # Before
         
     | 
| 
      
 692 
     | 
    
         
            +
                relation.rewhere(writer: david).to_a # => []
         
     | 
| 
       823 
693 
     | 
    
         | 
| 
       824 
     | 
    
         
            -
                 
     | 
| 
      
 694 
     | 
    
         
            +
                # After
         
     | 
| 
      
 695 
     | 
    
         
            +
                relation.rewhere(writer: david).to_a # => [david]
         
     | 
| 
      
 696 
     | 
    
         
            +
                ```
         
     | 
| 
       825 
697 
     | 
    
         | 
| 
       826 
     | 
    
         
            -
            * 
     | 
| 
      
 698 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       827 
699 
     | 
    
         | 
| 
       828 
     | 
    
         
            -
             
     | 
| 
      
 700 
     | 
    
         
            +
            *   Inspect time attributes with subsec and time zone offset.
         
     | 
| 
       829 
701 
     | 
    
         | 
| 
       830 
     | 
    
         
            -
                 
     | 
| 
      
 702 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 703 
     | 
    
         
            +
                p Knot.create
         
     | 
| 
      
 704 
     | 
    
         
            +
                => #<Knot id: 1, created_at: "2016-05-05 01:29:47.116928000 +0000">
         
     | 
| 
      
 705 
     | 
    
         
            +
                ```
         
     | 
| 
       831 
706 
     | 
    
         | 
| 
       832 
     | 
    
         
            -
            * 
     | 
| 
      
 707 
     | 
    
         
            +
                *akinomaeni*, *Jonathan Hefner*
         
     | 
| 
      
 708 
     | 
    
         
            +
             
     | 
| 
      
 709 
     | 
    
         
            +
            *   Deprecate passing a column to `type_cast`.
         
     | 
| 
       833 
710 
     | 
    
         | 
| 
       834 
711 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       835 
712 
     | 
    
         | 
| 
       836 
     | 
    
         
            -
            *   Deprecate  
     | 
| 
       837 
     | 
    
         
            -
                regarded as leaked. Use `klass.unscoped` to avoid the leaking scope.
         
     | 
| 
      
 713 
     | 
    
         
            +
            *   Deprecate `in_clause_length` and `allowed_index_name_length` in `DatabaseLimits`.
         
     | 
| 
       838 
714 
     | 
    
         | 
| 
       839 
715 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       840 
716 
     | 
    
         | 
| 
       841 
     | 
    
         
            -
            *    
     | 
| 
       842 
     | 
    
         
            -
             
     | 
| 
       843 
     | 
    
         
            -
                Adds a middleware and configuration options that can be used in your
         
     | 
| 
       844 
     | 
    
         
            -
                application to automatically switch between the writing and reading
         
     | 
| 
       845 
     | 
    
         
            -
                database connections.
         
     | 
| 
      
 717 
     | 
    
         
            +
            *   Support bulk insert/upsert on relation to preserve scope values.
         
     | 
| 
       846 
718 
     | 
    
         | 
| 
       847 
     | 
    
         
            -
                 
     | 
| 
       848 
     | 
    
         
            -
                a write in the last 2 seconds, otherwise they will read from the primary.
         
     | 
| 
       849 
     | 
    
         
            -
                Non-get requests will always write to the primary. The middleware accepts
         
     | 
| 
       850 
     | 
    
         
            -
                an argument for a Resolver class and an Operations class where you are able
         
     | 
| 
       851 
     | 
    
         
            -
                to change how the auto-switcher works to be most beneficial for your
         
     | 
| 
       852 
     | 
    
         
            -
                application.
         
     | 
| 
      
 719 
     | 
    
         
            +
                *Josef Šimánek*, *Ryuta Kamizono*
         
     | 
| 
       853 
720 
     | 
    
         | 
| 
       854 
     | 
    
         
            -
             
     | 
| 
       855 
     | 
    
         
            -
                configuration options:
         
     | 
| 
      
 721 
     | 
    
         
            +
            *   Preserve column comment value on changing column name on MySQL.
         
     | 
| 
       856 
722 
     | 
    
         | 
| 
       857 
     | 
    
         
            -
                 
     | 
| 
       858 
     | 
    
         
            -
                config.active_record.database_selector = { delay: 2.seconds }
         
     | 
| 
       859 
     | 
    
         
            -
                config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
         
     | 
| 
       860 
     | 
    
         
            -
                config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
         
     | 
| 
       861 
     | 
    
         
            -
                ```
         
     | 
| 
      
 723 
     | 
    
         
            +
                *Islam Taha*
         
     | 
| 
       862 
724 
     | 
    
         | 
| 
       863 
     | 
    
         
            -
             
     | 
| 
       864 
     | 
    
         
            -
                configuration options:
         
     | 
| 
      
 725 
     | 
    
         
            +
            *   Add support for `if_exists` option for removing an index.
         
     | 
| 
       865 
726 
     | 
    
         | 
| 
       866 
     | 
    
         
            -
                 
     | 
| 
       867 
     | 
    
         
            -
                config.active_record.database_selector = { delay: 10.seconds }
         
     | 
| 
       868 
     | 
    
         
            -
                config.active_record.database_resolver = MyResolver
         
     | 
| 
       869 
     | 
    
         
            -
                config.active_record.database_resolver_context = MyResolver::MyCookies
         
     | 
| 
       870 
     | 
    
         
            -
                ```
         
     | 
| 
      
 727 
     | 
    
         
            +
                The `remove_index` method can take an `if_exists` option. If this is set to true an error won't be raised if the index doesn't exist.
         
     | 
| 
       871 
728 
     | 
    
         | 
| 
       872 
729 
     | 
    
         
             
                *Eileen M. Uchitelle*
         
     | 
| 
       873 
730 
     | 
    
         | 
| 
       874 
     | 
    
         
            -
            *    
     | 
| 
      
 731 
     | 
    
         
            +
            *   Remove ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base.
         
     | 
| 
       875 
732 
     | 
    
         | 
| 
       876 
733 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       877 
734 
     | 
    
         | 
| 
       878 
     | 
    
         
            -
            *    
     | 
| 
      
 735 
     | 
    
         
            +
            *   Prevent `build_association` from `touching` a parent record if the record isn't persisted for `has_one` associations.
         
     | 
| 
       879 
736 
     | 
    
         | 
| 
       880 
     | 
    
         
            -
                 
     | 
| 
      
 737 
     | 
    
         
            +
                Fixes #38219.
         
     | 
| 
       881 
738 
     | 
    
         | 
| 
      
 739 
     | 
    
         
            +
                *Josh Brody*
         
     | 
| 
       882 
740 
     | 
    
         | 
| 
       883 
     | 
    
         
            -
             
     | 
| 
      
 741 
     | 
    
         
            +
            *   Add support for `if_not_exists` option for adding index.
         
     | 
| 
       884 
742 
     | 
    
         | 
| 
       885 
     | 
    
         
            -
             
     | 
| 
      
 743 
     | 
    
         
            +
                The `add_index` method respects `if_not_exists` option. If it is set to true
         
     | 
| 
      
 744 
     | 
    
         
            +
                index won't be added.
         
     | 
| 
       886 
745 
     | 
    
         | 
| 
       887 
     | 
    
         
            -
                 
     | 
| 
      
 746 
     | 
    
         
            +
                Usage:
         
     | 
| 
       888 
747 
     | 
    
         | 
| 
       889 
     | 
    
         
            -
             
     | 
| 
      
 748 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 749 
     | 
    
         
            +
                  add_index :users, :account_id, if_not_exists: true
         
     | 
| 
      
 750 
     | 
    
         
            +
                ```
         
     | 
| 
       890 
751 
     | 
    
         | 
| 
       891 
     | 
    
         
            -
                 
     | 
| 
      
 752 
     | 
    
         
            +
                The `if_not_exists` option passed to `create_table` also gets propagated to indexes
         
     | 
| 
      
 753 
     | 
    
         
            +
                created within that migration so that if table and its indexes exist then there is no
         
     | 
| 
      
 754 
     | 
    
         
            +
                attempt to create them again.
         
     | 
| 
       892 
755 
     | 
    
         | 
| 
       893 
     | 
    
         
            -
            * 
     | 
| 
      
 756 
     | 
    
         
            +
                *Prathamesh Sonpatki*
         
     | 
| 
       894 
757 
     | 
    
         | 
| 
       895 
     | 
    
         
            -
             
     | 
| 
      
 758 
     | 
    
         
            +
            *   Add `ActiveRecord::Base#previously_new_record?` to show if a record was new before the last save.
         
     | 
| 
       896 
759 
     | 
    
         | 
| 
       897 
     | 
    
         
            -
            * 
     | 
| 
      
 760 
     | 
    
         
            +
                *Tom Ward*
         
     | 
| 
       898 
761 
     | 
    
         | 
| 
       899 
     | 
    
         
            -
             
     | 
| 
      
 762 
     | 
    
         
            +
            *   Support descending order for `find_each`, `find_in_batches`, and `in_batches`.
         
     | 
| 
       900 
763 
     | 
    
         | 
| 
       901 
     | 
    
         
            -
             
     | 
| 
      
 764 
     | 
    
         
            +
                Batch processing methods allow you to work with the records in batches, greatly reducing memory consumption, but records are always batched from oldest id to newest.
         
     | 
| 
       902 
765 
     | 
    
         | 
| 
       903 
     | 
    
         
            -
                 
     | 
| 
      
 766 
     | 
    
         
            +
                This change allows reversing the order, batching from newest to oldest. This is useful when you need to process newer batches of records first.
         
     | 
| 
       904 
767 
     | 
    
         | 
| 
       905 
     | 
    
         
            -
             
     | 
| 
      
 768 
     | 
    
         
            +
                Pass `order: :desc` to yield batches in descending order. The default remains `order: :asc`.
         
     | 
| 
       906 
769 
     | 
    
         | 
| 
       907 
     | 
    
         
            -
                 
     | 
| 
      
 770 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 771 
     | 
    
         
            +
                Person.find_each(order: :desc) do |person|
         
     | 
| 
      
 772 
     | 
    
         
            +
                  person.party_all_night!
         
     | 
| 
      
 773 
     | 
    
         
            +
                end
         
     | 
| 
      
 774 
     | 
    
         
            +
                ```
         
     | 
| 
       908 
775 
     | 
    
         | 
| 
       909 
     | 
    
         
            -
            * 
     | 
| 
      
 776 
     | 
    
         
            +
                *Alexey Vasiliev*
         
     | 
| 
       910 
777 
     | 
    
         | 
| 
       911 
     | 
    
         
            -
             
     | 
| 
      
 778 
     | 
    
         
            +
            *   Fix `insert_all` with enum values.
         
     | 
| 
       912 
779 
     | 
    
         | 
| 
       913 
     | 
    
         
            -
             
     | 
| 
      
 780 
     | 
    
         
            +
                Fixes #38716.
         
     | 
| 
       914 
781 
     | 
    
         | 
| 
       915 
     | 
    
         
            -
                * 
     | 
| 
      
 782 
     | 
    
         
            +
                *Joel Blum*
         
     | 
| 
       916 
783 
     | 
    
         | 
| 
       917 
     | 
    
         
            -
            *    
     | 
| 
      
 784 
     | 
    
         
            +
            *   Add support for `db:rollback:name` for multiple database applications.
         
     | 
| 
       918 
785 
     | 
    
         | 
| 
       919 
     | 
    
         
            -
                 
     | 
| 
      
 786 
     | 
    
         
            +
                Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
         
     | 
| 
       920 
787 
     | 
    
         | 
| 
       921 
     | 
    
         
            -
            * 
     | 
| 
      
 788 
     | 
    
         
            +
                *Eileen M. Uchitelle*
         
     | 
| 
       922 
789 
     | 
    
         | 
| 
       923 
     | 
    
         
            -
             
     | 
| 
      
 790 
     | 
    
         
            +
            *   `Relation#pick` now uses already loaded results instead of making another query.
         
     | 
| 
       924 
791 
     | 
    
         | 
| 
       925 
     | 
    
         
            -
            * 
     | 
| 
      
 792 
     | 
    
         
            +
                *Eugene Kenny*
         
     | 
| 
       926 
793 
     | 
    
         | 
| 
       927 
     | 
    
         
            -
             
     | 
| 
      
 794 
     | 
    
         
            +
            *   Deprecate using `return`, `break` or `throw` to exit a transaction block after writes.
         
     | 
| 
       928 
795 
     | 
    
         | 
| 
       929 
     | 
    
         
            -
            * 
     | 
| 
      
 796 
     | 
    
         
            +
                *Dylan Thacker-Smith*
         
     | 
| 
       930 
797 
     | 
    
         | 
| 
       931 
     | 
    
         
            -
             
     | 
| 
      
 798 
     | 
    
         
            +
            *   Dump the schema or structure of a database when calling `db:migrate:name`.
         
     | 
| 
       932 
799 
     | 
    
         | 
| 
       933 
     | 
    
         
            -
             
     | 
| 
      
 800 
     | 
    
         
            +
                In previous versions of Rails, `rails db:migrate` would dump the schema of the database. In Rails 6, that holds true (`rails db:migrate` dumps all databases' schemas), but `rails db:migrate:name` does not share that behavior.
         
     | 
| 
       934 
801 
     | 
    
         | 
| 
       935 
     | 
    
         
            -
                 
     | 
| 
      
 802 
     | 
    
         
            +
                Going forward, calls to `rails db:migrate:name` will dump the schema (or structure) of the database being migrated.
         
     | 
| 
       936 
803 
     | 
    
         | 
| 
       937 
     | 
    
         
            -
            * 
     | 
| 
      
 804 
     | 
    
         
            +
                *Kyle Thompson*
         
     | 
| 
       938 
805 
     | 
    
         | 
| 
       939 
     | 
    
         
            -
             
     | 
| 
      
 806 
     | 
    
         
            +
            *   Reset the `ActiveRecord::Base` connection after `rails db:migrate:name`.
         
     | 
| 
       940 
807 
     | 
    
         | 
| 
       941 
     | 
    
         
            -
                 
     | 
| 
      
 808 
     | 
    
         
            +
                When `rails db:migrate` has finished, it ensures the `ActiveRecord::Base` connection is reset to its original configuration. Going forward, `rails db:migrate:name` will have the same behavior.
         
     | 
| 
       942 
809 
     | 
    
         | 
| 
       943 
     | 
    
         
            -
            * 
     | 
| 
      
 810 
     | 
    
         
            +
                *Kyle Thompson*
         
     | 
| 
       944 
811 
     | 
    
         | 
| 
       945 
     | 
    
         
            -
             
     | 
| 
      
 812 
     | 
    
         
            +
            *   Disallow calling `connected_to` on subclasses of `ActiveRecord::Base`.
         
     | 
| 
       946 
813 
     | 
    
         | 
| 
       947 
     | 
    
         
            -
             
     | 
| 
      
 814 
     | 
    
         
            +
                Behavior has not changed here but the previous API could be misleading to people who thought it would switch connections for only that class. `connected_to` switches the context from which we are getting connections, not the connections themselves.
         
     | 
| 
       948 
815 
     | 
    
         | 
| 
       949 
     | 
    
         
            -
                * 
     | 
| 
      
 816 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       950 
817 
     | 
    
         | 
| 
       951 
     | 
    
         
            -
            *    
     | 
| 
      
 818 
     | 
    
         
            +
            *   Add support for horizontal sharding to `connects_to` and `connected_to`.
         
     | 
| 
       952 
819 
     | 
    
         | 
| 
       953 
     | 
    
         
            -
                 
     | 
| 
      
 820 
     | 
    
         
            +
                Applications can now connect to multiple shards and switch between their shards in an application. Note that the shard swapping is still a manual process as this change does not include an API for automatic shard swapping.
         
     | 
| 
       954 
821 
     | 
    
         | 
| 
       955 
     | 
    
         
            -
             
     | 
| 
      
 822 
     | 
    
         
            +
                Usage:
         
     | 
| 
       956 
823 
     | 
    
         | 
| 
       957 
     | 
    
         
            -
                 
     | 
| 
       958 
     | 
    
         
            -
                format for InnoDB tables. The default setting is `DYNAMIC`.
         
     | 
| 
       959 
     | 
    
         
            -
                The row format is required for indexing on `varchar(255)` with `utf8mb4` columns.
         
     | 
| 
      
 824 
     | 
    
         
            +
                Given the following configuration:
         
     | 
| 
       960 
825 
     | 
    
         | 
| 
       961 
     | 
    
         
            -
                 
     | 
| 
      
 826 
     | 
    
         
            +
                ```yaml
         
     | 
| 
      
 827 
     | 
    
         
            +
                # config/database.yml
         
     | 
| 
      
 828 
     | 
    
         
            +
                production:
         
     | 
| 
      
 829 
     | 
    
         
            +
                  primary:
         
     | 
| 
      
 830 
     | 
    
         
            +
                    database: my_database
         
     | 
| 
      
 831 
     | 
    
         
            +
                  primary_shard_one:
         
     | 
| 
      
 832 
     | 
    
         
            +
                    database: my_database_shard_one
         
     | 
| 
      
 833 
     | 
    
         
            +
                ```
         
     | 
| 
       962 
834 
     | 
    
         | 
| 
       963 
     | 
    
         
            -
             
     | 
| 
      
 835 
     | 
    
         
            +
                Connect to multiple shards:
         
     | 
| 
       964 
836 
     | 
    
         | 
| 
       965 
     | 
    
         
            -
                 
     | 
| 
      
 837 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 838 
     | 
    
         
            +
                class ApplicationRecord < ActiveRecord::Base
         
     | 
| 
      
 839 
     | 
    
         
            +
                  self.abstract_class = true
         
     | 
| 
       966 
840 
     | 
    
         | 
| 
       967 
     | 
    
         
            -
             
     | 
| 
      
 841 
     | 
    
         
            +
                  connects_to shards: {
         
     | 
| 
      
 842 
     | 
    
         
            +
                    default: { writing: :primary },
         
     | 
| 
      
 843 
     | 
    
         
            +
                    shard_one: { writing: :primary_shard_one }
         
     | 
| 
      
 844 
     | 
    
         
            +
                  }
         
     | 
| 
      
 845 
     | 
    
         
            +
                ```
         
     | 
| 
       968 
846 
     | 
    
         | 
| 
       969 
     | 
    
         
            -
                 
     | 
| 
      
 847 
     | 
    
         
            +
                Swap between shards in your controller / model code:
         
     | 
| 
       970 
848 
     | 
    
         | 
| 
       971 
     | 
    
         
            -
             
     | 
| 
      
 849 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 850 
     | 
    
         
            +
                ActiveRecord::Base.connected_to(shard: :shard_one) do
         
     | 
| 
      
 851 
     | 
    
         
            +
                  # Read from shard one
         
     | 
| 
      
 852 
     | 
    
         
            +
                end
         
     | 
| 
      
 853 
     | 
    
         
            +
                ```
         
     | 
| 
       972 
854 
     | 
    
         | 
| 
       973 
     | 
    
         
            -
                 
     | 
| 
      
 855 
     | 
    
         
            +
                The horizontal sharding API also supports read replicas. See guides for more details.
         
     | 
| 
       974 
856 
     | 
    
         | 
| 
       975 
     | 
    
         
            -
            * 
     | 
| 
      
 857 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       976 
858 
     | 
    
         | 
| 
       977 
     | 
    
         
            -
             
     | 
| 
      
 859 
     | 
    
         
            +
            *   Deprecate `spec_name` in favor of `name` on database configurations.
         
     | 
| 
       978 
860 
     | 
    
         | 
| 
       979 
     | 
    
         
            -
             
     | 
| 
      
 861 
     | 
    
         
            +
                The accessors for `spec_name` on `configs_for` and `DatabaseConfig` are deprecated. Please use `name` instead.
         
     | 
| 
       980 
862 
     | 
    
         | 
| 
       981 
     | 
    
         
            -
                 
     | 
| 
       982 
     | 
    
         
            -
                you're building out multiple databases and want to make sure you're not sending
         
     | 
| 
       983 
     | 
    
         
            -
                writes when you want a read.
         
     | 
| 
      
 863 
     | 
    
         
            +
                Deprecated behavior:
         
     | 
| 
       984 
864 
     | 
    
         | 
| 
       985 
     | 
    
         
            -
                 
     | 
| 
       986 
     | 
    
         
            -
                 
     | 
| 
       987 
     | 
    
         
            -
                 
     | 
| 
      
 865 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 866 
     | 
    
         
            +
                db_config = ActiveRecord::Base.configs_for(env_name: "development", spec_name: "primary")
         
     | 
| 
      
 867 
     | 
    
         
            +
                db_config.spec_name
         
     | 
| 
      
 868 
     | 
    
         
            +
                ```
         
     | 
| 
       988 
869 
     | 
    
         | 
| 
       989 
     | 
    
         
            -
                 
     | 
| 
       990 
     | 
    
         
            -
                read-only queries without opening a second connection. One purpose of this is to
         
     | 
| 
       991 
     | 
    
         
            -
                catch accidental writes, not all writes.
         
     | 
| 
      
 870 
     | 
    
         
            +
                New behavior:
         
     | 
| 
       992 
871 
     | 
    
         | 
| 
       993 
     | 
    
         
            -
                 
     | 
| 
      
 872 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 873 
     | 
    
         
            +
                db_config = ActiveRecord::Base.configs_for(env_name: "development", name: "primary")
         
     | 
| 
      
 874 
     | 
    
         
            +
                db_config.name
         
     | 
| 
      
 875 
     | 
    
         
            +
                ```
         
     | 
| 
       994 
876 
     | 
    
         | 
| 
       995 
     | 
    
         
            -
            * 
     | 
| 
      
 877 
     | 
    
         
            +
                *Eileen M. Uchitelle*
         
     | 
| 
       996 
878 
     | 
    
         | 
| 
       997 
     | 
    
         
            -
             
     | 
| 
      
 879 
     | 
    
         
            +
            *   Add additional database-specific rake tasks for multi-database users.
         
     | 
| 
       998 
880 
     | 
    
         | 
| 
       999 
     | 
    
         
            -
             
     | 
| 
      
 881 
     | 
    
         
            +
                Previously, `rails db:create`, `rails db:drop`, and `rails db:migrate` were the only rails tasks that could operate on a single
         
     | 
| 
      
 882 
     | 
    
         
            +
                database. For example:
         
     | 
| 
       1000 
883 
     | 
    
         | 
| 
       1001 
     | 
    
         
            -
                 
     | 
| 
      
 884 
     | 
    
         
            +
                ```
         
     | 
| 
      
 885 
     | 
    
         
            +
                rails db:create
         
     | 
| 
      
 886 
     | 
    
         
            +
                rails db:create:primary
         
     | 
| 
      
 887 
     | 
    
         
            +
                rails db:create:animals
         
     | 
| 
      
 888 
     | 
    
         
            +
                rails db:drop
         
     | 
| 
      
 889 
     | 
    
         
            +
                rails db:drop:primary
         
     | 
| 
      
 890 
     | 
    
         
            +
                rails db:drop:animals
         
     | 
| 
      
 891 
     | 
    
         
            +
                rails db:migrate
         
     | 
| 
      
 892 
     | 
    
         
            +
                rails db:migrate:primary
         
     | 
| 
      
 893 
     | 
    
         
            +
                rails db:migrate:animals
         
     | 
| 
      
 894 
     | 
    
         
            +
                ```
         
     | 
| 
       1002 
895 
     | 
    
         | 
| 
       1003 
     | 
    
         
            -
                 
     | 
| 
      
 896 
     | 
    
         
            +
                With these changes, `rails db:schema:dump`, `rails db:schema:load`, `rails db:structure:dump`, `rails db:structure:load` and
         
     | 
| 
      
 897 
     | 
    
         
            +
                `rails db:test:prepare` can additionally operate on a single database. For example:
         
     | 
| 
       1004 
898 
     | 
    
         | 
| 
       1005 
     | 
    
         
            -
             
     | 
| 
      
 899 
     | 
    
         
            +
                ```
         
     | 
| 
      
 900 
     | 
    
         
            +
                rails db:schema:dump
         
     | 
| 
      
 901 
     | 
    
         
            +
                rails db:schema:dump:primary
         
     | 
| 
      
 902 
     | 
    
         
            +
                rails db:schema:dump:animals
         
     | 
| 
      
 903 
     | 
    
         
            +
                rails db:schema:load
         
     | 
| 
      
 904 
     | 
    
         
            +
                rails db:schema:load:primary
         
     | 
| 
      
 905 
     | 
    
         
            +
                rails db:schema:load:animals
         
     | 
| 
      
 906 
     | 
    
         
            +
                rails db:structure:dump
         
     | 
| 
      
 907 
     | 
    
         
            +
                rails db:structure:dump:primary
         
     | 
| 
      
 908 
     | 
    
         
            +
                rails db:structure:dump:animals
         
     | 
| 
      
 909 
     | 
    
         
            +
                rails db:structure:load
         
     | 
| 
      
 910 
     | 
    
         
            +
                rails db:structure:load:primary
         
     | 
| 
      
 911 
     | 
    
         
            +
                rails db:structure:load:animals
         
     | 
| 
      
 912 
     | 
    
         
            +
                rails db:test:prepare
         
     | 
| 
      
 913 
     | 
    
         
            +
                rails db:test:prepare:primary
         
     | 
| 
      
 914 
     | 
    
         
            +
                rails db:test:prepare:animals
         
     | 
| 
      
 915 
     | 
    
         
            +
                ```
         
     | 
| 
       1006 
916 
     | 
    
         | 
| 
       1007 
     | 
    
         
            -
                 
     | 
| 
       1008 
     | 
    
         
            -
                was passing for SQLite and MySQL, but failed for PostgreSQL:
         
     | 
| 
      
 917 
     | 
    
         
            +
                *Kyle Thompson*
         
     | 
| 
       1009 
918 
     | 
    
         | 
| 
       1010 
     | 
    
         
            -
             
     | 
| 
       1011 
     | 
    
         
            -
                class DeveloperName < ActiveRecord::Type::String
         
     | 
| 
       1012 
     | 
    
         
            -
                  def deserialize(value)
         
     | 
| 
       1013 
     | 
    
         
            -
                    "Developer: #{value}"
         
     | 
| 
       1014 
     | 
    
         
            -
                  end
         
     | 
| 
       1015 
     | 
    
         
            -
                end
         
     | 
| 
      
 919 
     | 
    
         
            +
            *   Add support for `strict_loading` mode on association declarations.
         
     | 
| 
       1016 
920 
     | 
    
         | 
| 
       1017 
     | 
    
         
            -
                 
     | 
| 
       1018 
     | 
    
         
            -
                  self.table_name = "developers"
         
     | 
| 
      
 921 
     | 
    
         
            +
                Raise an error if attempting to load a record from an association that has been marked as `strict_loading` unless it was explicitly eager loaded.
         
     | 
| 
       1019 
922 
     | 
    
         | 
| 
       1020 
     | 
    
         
            -
             
     | 
| 
      
 923 
     | 
    
         
            +
                Usage:
         
     | 
| 
       1021 
924 
     | 
    
         | 
| 
       1022 
     | 
    
         
            -
             
     | 
| 
      
 925 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 926 
     | 
    
         
            +
                class Developer < ApplicationRecord
         
     | 
| 
      
 927 
     | 
    
         
            +
                  has_many :projects, strict_loading: true
         
     | 
| 
       1023 
928 
     | 
    
         
             
                end
         
     | 
| 
       1024 
929 
     | 
    
         | 
| 
       1025 
     | 
    
         
            -
                 
     | 
| 
       1026 
     | 
    
         
            -
                 
     | 
| 
       1027 
     | 
    
         
            -
             
     | 
| 
       1028 
     | 
    
         
            -
                loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
         
     | 
| 
       1029 
     | 
    
         
            -
                puts loaded_developer.name # should be "Developer: name" but it's just "name"
         
     | 
| 
      
 930 
     | 
    
         
            +
                dev = Developer.first
         
     | 
| 
      
 931 
     | 
    
         
            +
                dev.projects.first
         
     | 
| 
      
 932 
     | 
    
         
            +
                # => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.
         
     | 
| 
       1030 
933 
     | 
    
         
             
                ```
         
     | 
| 
       1031 
934 
     | 
    
         | 
| 
       1032 
     | 
    
         
            -
                * 
     | 
| 
       1033 
     | 
    
         
            -
             
     | 
| 
       1034 
     | 
    
         
            -
            *   Make the implicit order column configurable.
         
     | 
| 
       1035 
     | 
    
         
            -
             
     | 
| 
       1036 
     | 
    
         
            -
                When calling ordered finder methods such as `first` or `last` without an
         
     | 
| 
       1037 
     | 
    
         
            -
                explicit order clause, ActiveRecord sorts records by primary key. This can
         
     | 
| 
       1038 
     | 
    
         
            -
                result in unpredictable and surprising behaviour when the primary key is
         
     | 
| 
       1039 
     | 
    
         
            -
                not an auto-incrementing integer, for example when it's a UUID. This change
         
     | 
| 
       1040 
     | 
    
         
            -
                makes it possible to override the column used for implicit ordering such
         
     | 
| 
       1041 
     | 
    
         
            -
                that `first` and `last` will return more predictable results.
         
     | 
| 
       1042 
     | 
    
         
            -
             
     | 
| 
       1043 
     | 
    
         
            -
                Example:
         
     | 
| 
       1044 
     | 
    
         
            -
             
     | 
| 
       1045 
     | 
    
         
            -
                    class Project < ActiveRecord::Base
         
     | 
| 
       1046 
     | 
    
         
            -
                      self.implicit_order_column = "created_at"
         
     | 
| 
       1047 
     | 
    
         
            -
                    end
         
     | 
| 
      
 935 
     | 
    
         
            +
                *Kevin Deisz*
         
     | 
| 
       1048 
936 
     | 
    
         | 
| 
       1049 
     | 
    
         
            -
             
     | 
| 
      
 937 
     | 
    
         
            +
            *   Add support for `strict_loading` mode to prevent lazy loading of records.
         
     | 
| 
       1050 
938 
     | 
    
         | 
| 
       1051 
     | 
    
         
            -
             
     | 
| 
      
 939 
     | 
    
         
            +
                Raise an error if a parent record is marked as `strict_loading` and attempts to lazily load its associations. This is useful for finding places you may want to preload an association and avoid additional queries.
         
     | 
| 
       1052 
940 
     | 
    
         | 
| 
       1053 
     | 
    
         
            -
                 
     | 
| 
      
 941 
     | 
    
         
            +
                Usage:
         
     | 
| 
       1054 
942 
     | 
    
         | 
| 
       1055 
     | 
    
         
            -
             
     | 
| 
      
 943 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 944 
     | 
    
         
            +
                dev = Developer.strict_loading.first
         
     | 
| 
      
 945 
     | 
    
         
            +
                dev.audit_logs.to_a
         
     | 
| 
      
 946 
     | 
    
         
            +
                # => ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.
         
     | 
| 
      
 947 
     | 
    
         
            +
                ```
         
     | 
| 
       1056 
948 
     | 
    
         | 
| 
       1057 
     | 
    
         
            -
                * 
     | 
| 
      
 949 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *Aaron Patterson*
         
     | 
| 
       1058 
950 
     | 
    
         | 
| 
       1059 
     | 
    
         
            -
            *    
     | 
| 
      
 951 
     | 
    
         
            +
            *   Add support for PostgreSQL 11+ partitioned indexes when using `upsert_all`.
         
     | 
| 
       1060 
952 
     | 
    
         | 
| 
       1061 
     | 
    
         
            -
                 
     | 
| 
      
 953 
     | 
    
         
            +
                *Sebastián Palma*
         
     | 
| 
       1062 
954 
     | 
    
         | 
| 
       1063 
     | 
    
         
            -
             
     | 
| 
      
 955 
     | 
    
         
            +
            *   Adds support for `if_not_exists` to `add_column` and `if_exists` to `remove_column`.
         
     | 
| 
       1064 
956 
     | 
    
         | 
| 
       1065 
     | 
    
         
            -
                 
     | 
| 
      
 957 
     | 
    
         
            +
                Applications can set their migrations to ignore exceptions raised when adding a column that already exists or when removing a column that does not exist.
         
     | 
| 
       1066 
958 
     | 
    
         | 
| 
       1067 
     | 
    
         
            -
                Example:
         
     | 
| 
      
 959 
     | 
    
         
            +
                Example Usage:
         
     | 
| 
       1068 
960 
     | 
    
         | 
| 
       1069 
     | 
    
         
            -
                ```
         
     | 
| 
       1070 
     | 
    
         
            -
                class  
     | 
| 
       1071 
     | 
    
         
            -
                  def  
     | 
| 
       1072 
     | 
    
         
            -
                     
     | 
| 
      
 961 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 962 
     | 
    
         
            +
                class AddColumnTitle < ActiveRecord::Migration[6.1]
         
     | 
| 
      
 963 
     | 
    
         
            +
                  def change
         
     | 
| 
      
 964 
     | 
    
         
            +
                    add_column :posts, :title, :string, if_not_exists: true
         
     | 
| 
       1073 
965 
     | 
    
         
             
                  end
         
     | 
| 
       1074 
966 
     | 
    
         
             
                end
         
     | 
| 
       1075 
967 
     | 
    
         
             
                ```
         
     | 
| 
       1076 
968 
     | 
    
         | 
| 
       1077 
     | 
    
         
            -
                 
     | 
| 
      
 969 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 970 
     | 
    
         
            +
                class RemoveColumnTitle < ActiveRecord::Migration[6.1]
         
     | 
| 
      
 971 
     | 
    
         
            +
                  def change
         
     | 
| 
      
 972 
     | 
    
         
            +
                    remove_column :posts, :title, if_exists: true
         
     | 
| 
      
 973 
     | 
    
         
            +
                  end
         
     | 
| 
      
 974 
     | 
    
         
            +
                end
         
     | 
| 
      
 975 
     | 
    
         
            +
                ```
         
     | 
| 
       1078 
976 
     | 
    
         | 
| 
       1079 
     | 
    
         
            -
            * 
     | 
| 
      
 977 
     | 
    
         
            +
                *Eileen M. Uchitelle*
         
     | 
| 
       1080 
978 
     | 
    
         | 
| 
       1081 
     | 
    
         
            -
             
     | 
| 
      
 979 
     | 
    
         
            +
            *   Regexp-escape table name for MS SQL Server.
         
     | 
| 
       1082 
980 
     | 
    
         | 
| 
       1083 
     | 
    
         
            -
             
     | 
| 
       1084 
     | 
    
         
            -
                      t.string :title
         
     | 
| 
       1085 
     | 
    
         
            -
                    end
         
     | 
| 
      
 981 
     | 
    
         
            +
                Add `Regexp.escape` to one method in ActiveRecord, so that table names with regular expression characters in them work as expected. Since MS SQL Server uses "[" and "]" to quote table and column names, and those characters are regular expression characters, methods like `pluck` and `select` fail in certain cases when used with the MS SQL Server adapter.
         
     | 
| 
       1086 
982 
     | 
    
         | 
| 
       1087 
     | 
    
         
            -
                 
     | 
| 
      
 983 
     | 
    
         
            +
                *Larry Reid*
         
     | 
| 
       1088 
984 
     | 
    
         | 
| 
       1089 
     | 
    
         
            -
             
     | 
| 
       1090 
     | 
    
         
            -
                      ...
         
     | 
| 
       1091 
     | 
    
         
            -
                    )
         
     | 
| 
      
 985 
     | 
    
         
            +
            *   Store advisory locks on their own named connection.
         
     | 
| 
       1092 
986 
     | 
    
         | 
| 
       1093 
     | 
    
         
            -
                 
     | 
| 
       1094 
     | 
    
         
            -
                exception whereas `if_not_exists: true` does nothing.
         
     | 
| 
      
 987 
     | 
    
         
            +
                Previously advisory locks were taken out against a connection when a migration started. This works fine in single database applications but doesn't work well when migrations need to open new connections which results in the lock getting dropped.
         
     | 
| 
       1095 
988 
     | 
    
         | 
| 
       1096 
     | 
    
         
            -
                 
     | 
| 
      
 989 
     | 
    
         
            +
                In order to fix this we are storing the advisory lock on a new connection with the connection specification name `AdvisoryLockBase`. The caveat is that we need to maintain at least 2 connections to a database while migrations are running in order to do this.
         
     | 
| 
       1097 
990 
     | 
    
         | 
| 
       1098 
     | 
    
         
            -
            * 
     | 
| 
      
 991 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       1099 
992 
     | 
    
         | 
| 
       1100 
     | 
    
         
            -
             
     | 
| 
      
 993 
     | 
    
         
            +
            *   Allow schema cache path to be defined in the database configuration file.
         
     | 
| 
       1101 
994 
     | 
    
         | 
| 
       1102 
     | 
    
         
            -
             
     | 
| 
      
 995 
     | 
    
         
            +
                For example:
         
     | 
| 
       1103 
996 
     | 
    
         | 
| 
       1104 
     | 
    
         
            -
                 
     | 
| 
      
 997 
     | 
    
         
            +
                ```yaml
         
     | 
| 
      
 998 
     | 
    
         
            +
                development:
         
     | 
| 
      
 999 
     | 
    
         
            +
                  adapter: postgresql
         
     | 
| 
      
 1000 
     | 
    
         
            +
                  database: blog_development
         
     | 
| 
      
 1001 
     | 
    
         
            +
                  pool: 5
         
     | 
| 
      
 1002 
     | 
    
         
            +
                  schema_cache_path: tmp/schema/main.yml
         
     | 
| 
      
 1003 
     | 
    
         
            +
                ```
         
     | 
| 
       1105 
1004 
     | 
    
         | 
| 
       1106 
     | 
    
         
            -
            * 
     | 
| 
       1107 
     | 
    
         
            -
                if the attribute does not exist.
         
     | 
| 
      
 1005 
     | 
    
         
            +
                *Katrina Owen*
         
     | 
| 
       1108 
1006 
     | 
    
         | 
| 
       1109 
     | 
    
         
            -
             
     | 
| 
      
 1007 
     | 
    
         
            +
            *   Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
         
     | 
| 
       1110 
1008 
     | 
    
         | 
| 
       1111 
     | 
    
         
            -
             
     | 
| 
      
 1009 
     | 
    
         
            +
                `#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in 6.2.
         
     | 
| 
       1112 
1010 
     | 
    
         | 
| 
       1113 
     | 
    
         
            -
                 
     | 
| 
       1114 
     | 
    
         
            -
                User.connected_to(database: { writing: "postgres://foo" }) do
         
     | 
| 
       1115 
     | 
    
         
            -
                  User.create!(name: "Gannon")
         
     | 
| 
       1116 
     | 
    
         
            -
                end
         
     | 
| 
      
 1011 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       1117 
1012 
     | 
    
         | 
| 
       1118 
     | 
    
         
            -
             
     | 
| 
       1119 
     | 
    
         
            -
                User.connected_to(database: { reading: config }) do
         
     | 
| 
       1120 
     | 
    
         
            -
                  User.count
         
     | 
| 
       1121 
     | 
    
         
            -
                end
         
     | 
| 
       1122 
     | 
    
         
            -
                ````
         
     | 
| 
      
 1013 
     | 
    
         
            +
            *   Deprecate `#default_hash` and it's alias `#[]` on database configurations.
         
     | 
| 
       1123 
1014 
     | 
    
         | 
| 
       1124 
     | 
    
         
            -
                 
     | 
| 
      
 1015 
     | 
    
         
            +
                Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
         
     | 
| 
       1125 
1016 
     | 
    
         | 
| 
       1126 
     | 
    
         
            -
            * 
     | 
| 
      
 1017 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       1127 
1018 
     | 
    
         | 
| 
       1128 
     | 
    
         
            -
             
     | 
| 
      
 1019 
     | 
    
         
            +
            *   Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
         
     | 
| 
       1129 
1020 
     | 
    
         | 
| 
       1130 
     | 
    
         
            -
                 
     | 
| 
      
 1021 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       1131 
1022 
     | 
    
         | 
| 
       1132 
     | 
    
         
            -
             
     | 
| 
      
 1023 
     | 
    
         
            +
            *   Find orphans by looking for missing relations through chaining `where.missing`:
         
     | 
| 
       1133 
1024 
     | 
    
         | 
| 
       1134 
     | 
    
         
            -
             
     | 
| 
      
 1025 
     | 
    
         
            +
                Before:
         
     | 
| 
       1135 
1026 
     | 
    
         | 
| 
       1136 
     | 
    
         
            -
                 
     | 
| 
       1137 
     | 
    
         
            -
                 
     | 
| 
      
 1027 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 1028 
     | 
    
         
            +
                Post.left_joins(:author).where(authors: { id: nil })
         
     | 
| 
      
 1029 
     | 
    
         
            +
                ```
         
     | 
| 
       1138 
1030 
     | 
    
         | 
| 
       1139 
     | 
    
         
            -
                 
     | 
| 
      
 1031 
     | 
    
         
            +
                After:
         
     | 
| 
       1140 
1032 
     | 
    
         | 
| 
       1141 
     | 
    
         
            -
                 
     | 
| 
      
 1033 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 1034 
     | 
    
         
            +
                Post.where.missing(:author)
         
     | 
| 
      
 1035 
     | 
    
         
            +
                ```
         
     | 
| 
       1142 
1036 
     | 
    
         | 
| 
       1143 
     | 
    
         
            -
            * 
     | 
| 
      
 1037 
     | 
    
         
            +
                *Tom Rossi*
         
     | 
| 
       1144 
1038 
     | 
    
         | 
| 
       1145 
     | 
    
         
            -
             
     | 
| 
      
 1039 
     | 
    
         
            +
            *   Ensure `:reading` connections always raise if a write is attempted.
         
     | 
| 
       1146 
1040 
     | 
    
         | 
| 
       1147 
     | 
    
         
            -
                 
     | 
| 
      
 1041 
     | 
    
         
            +
                Now Rails will raise an `ActiveRecord::ReadOnlyError` if any connection on the reading handler attempts to make a write. If your reading role needs to write you should name the role something other than `:reading`.
         
     | 
| 
       1148 
1042 
     | 
    
         | 
| 
       1149 
     | 
    
         
            -
            * 
     | 
| 
      
 1043 
     | 
    
         
            +
                *Eileen M. Uchitelle*
         
     | 
| 
       1150 
1044 
     | 
    
         | 
| 
       1151 
     | 
    
         
            -
             
     | 
| 
      
 1045 
     | 
    
         
            +
            *   Deprecate `"primary"` as the `connection_specification_name` for `ActiveRecord::Base`.
         
     | 
| 
       1152 
1046 
     | 
    
         | 
| 
       1153 
     | 
    
         
            -
                 
     | 
| 
       1154 
     | 
    
         
            -
                class AnimalsModel < ApplicationRecord
         
     | 
| 
       1155 
     | 
    
         
            -
                  self.abstract_class = true
         
     | 
| 
      
 1047 
     | 
    
         
            +
                `"primary"` has been deprecated as the `connection_specification_name` for `ActiveRecord::Base` in favor of using `"ActiveRecord::Base"`. This change affects calls to `ActiveRecord::Base.connection_handler.retrieve_connection` and `ActiveRecord::Base.connection_handler.remove_connection`. If you're calling these methods with `"primary"`, please switch to `"ActiveRecord::Base"`.
         
     | 
| 
       1156 
1048 
     | 
    
         | 
| 
       1157 
     | 
    
         
            -
             
     | 
| 
       1158 
     | 
    
         
            -
                end
         
     | 
| 
      
 1049 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       1159 
1050 
     | 
    
         | 
| 
       1160 
     | 
    
         
            -
             
     | 
| 
       1161 
     | 
    
         
            -
             
     | 
| 
       1162 
     | 
    
         
            -
                end
         
     | 
| 
       1163 
     | 
    
         
            -
                ```
         
     | 
| 
      
 1051 
     | 
    
         
            +
            *   Add `ActiveRecord::Validations::NumericalityValidator` with
         
     | 
| 
      
 1052 
     | 
    
         
            +
                support for casting floats using a database columns' precision value.
         
     | 
| 
       1164 
1053 
     | 
    
         | 
| 
       1165 
     | 
    
         
            -
                 
     | 
| 
       1166 
     | 
    
         
            -
                a database that the model didn't connect to. Connecting to the database in this block is
         
     | 
| 
       1167 
     | 
    
         
            -
                useful when you have another defined connection, for example `slow_replica` that you don't
         
     | 
| 
       1168 
     | 
    
         
            -
                want to connect to by default but need in the console, or a specific code block.
         
     | 
| 
      
 1054 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       1169 
1055 
     | 
    
         | 
| 
       1170 
     | 
    
         
            -
             
     | 
| 
       1171 
     | 
    
         
            -
                ActiveRecord:: 
     | 
| 
       1172 
     | 
    
         
            -
             
     | 
| 
       1173 
     | 
    
         
            -
             
     | 
| 
       1174 
     | 
    
         
            -
                 
     | 
| 
       1175 
     | 
    
         
            -
                ```
         
     | 
| 
      
 1056 
     | 
    
         
            +
            *   Enforce fresh ETag header after a collection's contents change by adding
         
     | 
| 
      
 1057 
     | 
    
         
            +
                ActiveRecord::Relation#cache_key_with_version. This method will be used by
         
     | 
| 
      
 1058 
     | 
    
         
            +
                ActionController::ConditionalGet to ensure that when collection cache versioning
         
     | 
| 
      
 1059 
     | 
    
         
            +
                is enabled, requests using ConditionalGet don't return the same ETag header
         
     | 
| 
      
 1060 
     | 
    
         
            +
                after a collection is modified.
         
     | 
| 
       1176 
1061 
     | 
    
         | 
| 
       1177 
     | 
    
         
            -
                 
     | 
| 
       1178 
     | 
    
         
            -
                ActiveRecord::Base.connected_to(database: :slow_replica) do
         
     | 
| 
       1179 
     | 
    
         
            -
                  SlowReplicaModel.first # if the db config has a slow_replica configuration this will be used to do the lookup, otherwise this will throw an exception
         
     | 
| 
       1180 
     | 
    
         
            -
                end
         
     | 
| 
       1181 
     | 
    
         
            -
                ```
         
     | 
| 
      
 1062 
     | 
    
         
            +
                Fixes #38078.
         
     | 
| 
       1182 
1063 
     | 
    
         | 
| 
       1183 
     | 
    
         
            -
                * 
     | 
| 
      
 1064 
     | 
    
         
            +
                *Aaron Lipman*
         
     | 
| 
       1184 
1065 
     | 
    
         | 
| 
       1185 
     | 
    
         
            -
            *    
     | 
| 
      
 1066 
     | 
    
         
            +
            *   Skip test database when running `db:create` or `db:drop` in development
         
     | 
| 
      
 1067 
     | 
    
         
            +
                with `DATABASE_URL` set.
         
     | 
| 
       1186 
1068 
     | 
    
         | 
| 
       1187 
     | 
    
         
            -
                 
     | 
| 
       1188 
     | 
    
         
            -
                commit checks that only valid definition values are provided, those can
         
     | 
| 
       1189 
     | 
    
         
            -
                be a Hash, an array of Symbols or an array of Strings. Otherwise it
         
     | 
| 
       1190 
     | 
    
         
            -
                raises an `ArgumentError`.
         
     | 
| 
      
 1069 
     | 
    
         
            +
                *Brian Buchalter*
         
     | 
| 
       1191 
1070 
     | 
    
         | 
| 
       1192 
     | 
    
         
            -
             
     | 
| 
      
 1071 
     | 
    
         
            +
            *   Don't allow mutations on the database configurations hash.
         
     | 
| 
       1193 
1072 
     | 
    
         | 
| 
       1194 
     | 
    
         
            -
                 
     | 
| 
      
 1073 
     | 
    
         
            +
                Freeze the configurations hash to disallow directly changing it. If applications need to change the hash, for example to create databases for parallelization, they should use the `DatabaseConfig` object directly.
         
     | 
| 
       1195 
1074 
     | 
    
         | 
| 
       1196 
     | 
    
         
            -
             
     | 
| 
      
 1075 
     | 
    
         
            +
                Before:
         
     | 
| 
       1197 
1076 
     | 
    
         | 
| 
      
 1077 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 1078 
     | 
    
         
            +
                @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
         
     | 
| 
      
 1079 
     | 
    
         
            +
                @db_config.configuration_hash.merge!(idle_timeout: "0.02")
         
     | 
| 
       1198 
1080 
     | 
    
         
             
                ```
         
     | 
| 
       1199 
     | 
    
         
            -
                class Post < ActiveRecord::Base
         
     | 
| 
       1200 
     | 
    
         
            -
                  has_one :category
         
     | 
| 
       1201 
     | 
    
         
            -
                  belongs_to :author
         
     | 
| 
       1202 
     | 
    
         
            -
                  has_many :comments
         
     | 
| 
       1203 
     | 
    
         
            -
                end
         
     | 
| 
       1204 
1081 
     | 
    
         | 
| 
       1205 
     | 
    
         
            -
                 
     | 
| 
       1206 
     | 
    
         
            -
             
     | 
| 
       1207 
     | 
    
         
            -
                 
     | 
| 
       1208 
     | 
    
         
            -
                 
     | 
| 
      
 1082 
     | 
    
         
            +
                After:
         
     | 
| 
      
 1083 
     | 
    
         
            +
             
     | 
| 
      
 1084 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 1085 
     | 
    
         
            +
                @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
         
     | 
| 
      
 1086 
     | 
    
         
            +
                config = @db_config.configuration_hash.merge(idle_timeout: "0.02")
         
     | 
| 
      
 1087 
     | 
    
         
            +
                db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(@db_config.env_name, @db_config.spec_name, config)
         
     | 
| 
       1209 
1088 
     | 
    
         
             
                ```
         
     | 
| 
       1210 
1089 
     | 
    
         | 
| 
       1211 
     | 
    
         
            -
                * 
     | 
| 
      
 1090 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       1212 
1091 
     | 
    
         | 
| 
       1213 
     | 
    
         
            -
            *    
     | 
| 
       1214 
     | 
    
         
            -
                With this change you can create indexes while adding new
         
     | 
| 
       1215 
     | 
    
         
            -
                columns into the existing tables.
         
     | 
| 
      
 1092 
     | 
    
         
            +
            *   Remove `:connection_id` from the `sql.active_record` notification.
         
     | 
| 
       1216 
1093 
     | 
    
         | 
| 
       1217 
     | 
    
         
            -
                 
     | 
| 
      
 1094 
     | 
    
         
            +
                *Aaron Patterson*, *Rafael Mendonça França*
         
     | 
| 
       1218 
1095 
     | 
    
         | 
| 
       1219 
     | 
    
         
            -
             
     | 
| 
       1220 
     | 
    
         
            -
                      t.string :country_code, index: true
         
     | 
| 
       1221 
     | 
    
         
            -
                    end
         
     | 
| 
      
 1096 
     | 
    
         
            +
            *   The `:name` key will no longer be returned as part of `DatabaseConfig#configuration_hash`. Please use `DatabaseConfig#owner_name` instead.
         
     | 
| 
       1222 
1097 
     | 
    
         | 
| 
       1223 
     | 
    
         
            -
                * 
     | 
| 
      
 1098 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       1224 
1099 
     | 
    
         | 
| 
       1225 
     | 
    
         
            -
            *    
     | 
| 
      
 1100 
     | 
    
         
            +
            *   ActiveRecord's `belongs_to_required_by_default` flag can now be set per model.
         
     | 
| 
       1226 
1101 
     | 
    
         | 
| 
       1227 
     | 
    
         
            -
                 
     | 
| 
       1228 
     | 
    
         
            -
                 
     | 
| 
      
 1102 
     | 
    
         
            +
                You can now opt-out/opt-in specific models from having their associations required
         
     | 
| 
      
 1103 
     | 
    
         
            +
                by default.
         
     | 
| 
       1229 
1104 
     | 
    
         | 
| 
       1230 
     | 
    
         
            -
                 
     | 
| 
      
 1105 
     | 
    
         
            +
                This change is meant to ease the process of migrating all your models to have
         
     | 
| 
      
 1106 
     | 
    
         
            +
                their association required.
         
     | 
| 
       1231 
1107 
     | 
    
         | 
| 
       1232 
     | 
    
         
            -
            * 
     | 
| 
      
 1108 
     | 
    
         
            +
                *Edouard Chin*
         
     | 
| 
       1233 
1109 
     | 
    
         | 
| 
       1234 
     | 
    
         
            -
             
     | 
| 
      
 1110 
     | 
    
         
            +
            *   The `connection_config` method has been deprecated, please use `connection_db_config` instead which will return a `DatabaseConfigurations::DatabaseConfig` instead of a `Hash`.
         
     | 
| 
       1235 
1111 
     | 
    
         | 
| 
       1236 
     | 
    
         
            -
            * 
     | 
| 
      
 1112 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       1237 
1113 
     | 
    
         | 
| 
       1238 
     | 
    
         
            -
             
     | 
| 
      
 1114 
     | 
    
         
            +
            *   Retain explicit selections on the base model after applying `includes` and `joins`.
         
     | 
| 
       1239 
1115 
     | 
    
         | 
| 
       1240 
     | 
    
         
            -
             
     | 
| 
      
 1116 
     | 
    
         
            +
                Resolves #34889.
         
     | 
| 
       1241 
1117 
     | 
    
         | 
| 
       1242 
     | 
    
         
            -
                 
     | 
| 
      
 1118 
     | 
    
         
            +
                *Patrick Rebsch*
         
     | 
| 
       1243 
1119 
     | 
    
         | 
| 
       1244 
     | 
    
         
            -
             
     | 
| 
      
 1120 
     | 
    
         
            +
            *   The `database` kwarg is deprecated without replacement because it can't be used for sharding and creates an issue if it's used during a request. Applications that need to create new connections should use `connects_to` instead.
         
     | 
| 
       1245 
1121 
     | 
    
         | 
| 
       1246 
     | 
    
         
            -
            * 
     | 
| 
      
 1122 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *John Crepezzi*
         
     | 
| 
       1247 
1123 
     | 
    
         | 
| 
       1248 
     | 
    
         
            -
             
     | 
| 
      
 1124 
     | 
    
         
            +
            *   Allow attributes to be fetched from Arel node groupings.
         
     | 
| 
       1249 
1125 
     | 
    
         | 
| 
       1250 
     | 
    
         
            -
            * 
     | 
| 
      
 1126 
     | 
    
         
            +
                *Jeff Emminger*, *Gannon McGibbon*
         
     | 
| 
       1251 
1127 
     | 
    
         | 
| 
       1252 
     | 
    
         
            -
             
     | 
| 
       1253 
     | 
    
         
            -
                create_table :users do |t|
         
     | 
| 
       1254 
     | 
    
         
            -
                  t.string :email
         
     | 
| 
       1255 
     | 
    
         
            -
                end
         
     | 
| 
      
 1128 
     | 
    
         
            +
            *   A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgreSQL `options`.
         
     | 
| 
       1256 
1129 
     | 
    
         | 
| 
       1257 
     | 
    
         
            -
                 
     | 
| 
       1258 
     | 
    
         
            -
                ```
         
     | 
| 
      
 1130 
     | 
    
         
            +
                *Joshua Flanagan*
         
     | 
| 
       1259 
1131 
     | 
    
         | 
| 
       1260 
     | 
    
         
            -
             
     | 
| 
      
 1132 
     | 
    
         
            +
            *   Calling methods like `establish_connection` with a `Hash` which is invalid (eg: no `adapter`) will now raise an error the same way as connections defined in `config/database.yml`.
         
     | 
| 
       1261 
1133 
     | 
    
         | 
| 
       1262 
     | 
    
         
            -
            * 
     | 
| 
      
 1134 
     | 
    
         
            +
                *John Crepezzi*
         
     | 
| 
       1263 
1135 
     | 
    
         | 
| 
       1264 
     | 
    
         
            -
             
     | 
| 
      
 1136 
     | 
    
         
            +
            *   Specifying `implicit_order_column` now subsorts the records by primary key if available to ensure deterministic results.
         
     | 
| 
       1265 
1137 
     | 
    
         | 
| 
       1266 
     | 
    
         
            -
                * 
     | 
| 
      
 1138 
     | 
    
         
            +
                *Paweł Urbanek*
         
     | 
| 
       1267 
1139 
     | 
    
         | 
| 
       1268 
     | 
    
         
            -
            *    
     | 
| 
      
 1140 
     | 
    
         
            +
            *   `where(attr => [])` now loads an empty result without making a query.
         
     | 
| 
       1269 
1141 
     | 
    
         | 
| 
       1270 
     | 
    
         
            -
                * 
     | 
| 
      
 1142 
     | 
    
         
            +
                *John Hawthorn*
         
     | 
| 
       1271 
1143 
     | 
    
         | 
| 
       1272 
     | 
    
         
            -
            *    
     | 
| 
      
 1144 
     | 
    
         
            +
            *   Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
         
     | 
| 
       1273 
1145 
     | 
    
         | 
| 
       1274 
     | 
    
         
            -
                 
     | 
| 
       1275 
     | 
    
         
            -
                The previous default 3-Byte encoding character set `utf8` is not enough to support them.
         
     | 
| 
      
 1146 
     | 
    
         
            +
                *Hiroyuki Ishii*
         
     | 
| 
       1276 
1147 
     | 
    
         | 
| 
       1277 
     | 
    
         
            -
             
     | 
| 
      
 1148 
     | 
    
         
            +
            *   Add support for `belongs_to` to `has_many` inversing.
         
     | 
| 
       1278 
1149 
     | 
    
         | 
| 
       1279 
     | 
    
         
            -
            * 
     | 
| 
      
 1150 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       1280 
1151 
     | 
    
         | 
| 
       1281 
     | 
    
         
            -
             
     | 
| 
      
 1152 
     | 
    
         
            +
            *   Allow length configuration for `has_secure_token` method. The minimum length
         
     | 
| 
      
 1153 
     | 
    
         
            +
                is set at 24 characters.
         
     | 
| 
       1282 
1154 
     | 
    
         | 
| 
       1283 
     | 
    
         
            -
             
     | 
| 
       1284 
     | 
    
         
            -
                sensitive values of database columns when calling `#inspect`.
         
     | 
| 
       1285 
     | 
    
         
            -
                We also added `ActiveRecord::Base::filter_attributes`/`=` in order to
         
     | 
| 
       1286 
     | 
    
         
            -
                specify sensitive attributes to specific model.
         
     | 
| 
      
 1155 
     | 
    
         
            +
                Before:
         
     | 
| 
       1287 
1156 
     | 
    
         | 
| 
      
 1157 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 1158 
     | 
    
         
            +
                has_secure_token :auth_token
         
     | 
| 
       1288 
1159 
     | 
    
         
             
                ```
         
     | 
| 
       1289 
     | 
    
         
            -
             
     | 
| 
       1290 
     | 
    
         
            -
                 
     | 
| 
       1291 
     | 
    
         
            -
             
     | 
| 
       1292 
     | 
    
         
            -
                 
     | 
| 
      
 1160 
     | 
    
         
            +
             
     | 
| 
      
 1161 
     | 
    
         
            +
                After:
         
     | 
| 
      
 1162 
     | 
    
         
            +
             
     | 
| 
      
 1163 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 1164 
     | 
    
         
            +
                has_secure_token :default_token             # 24 characters
         
     | 
| 
      
 1165 
     | 
    
         
            +
                has_secure_token :auth_token, length: 36    # 36 characters
         
     | 
| 
      
 1166 
     | 
    
         
            +
                has_secure_token :invalid_token, length: 12 # => ActiveRecord::SecureToken::MinimumLengthError
         
     | 
| 
       1293 
1167 
     | 
    
         
             
                ```
         
     | 
| 
       1294 
1168 
     | 
    
         | 
| 
       1295 
     | 
    
         
            -
                * 
     | 
| 
      
 1169 
     | 
    
         
            +
                *Bernardo de Araujo*
         
     | 
| 
       1296 
1170 
     | 
    
         | 
| 
       1297 
     | 
    
         
            -
            *   Deprecate ` 
     | 
| 
       1298 
     | 
    
         
            -
                `indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
         
     | 
| 
       1299 
     | 
    
         
            -
                and `joins_per_query` methods in `DatabaseLimits`.
         
     | 
| 
      
 1171 
     | 
    
         
            +
            *   Deprecate `DatabaseConfigurations#to_h`. These connection hashes are still available via `ActiveRecord::Base.configurations.configs_for`.
         
     | 
| 
       1300 
1172 
     | 
    
         | 
| 
       1301 
     | 
    
         
            -
                * 
     | 
| 
      
 1173 
     | 
    
         
            +
                *Eileen Uchitelle*, *John Crepezzi*
         
     | 
| 
       1302 
1174 
     | 
    
         | 
| 
       1303 
     | 
    
         
            -
            *   ` 
     | 
| 
      
 1175 
     | 
    
         
            +
            *   Add `DatabaseConfig#configuration_hash` to return database configuration hashes with symbol keys, and use all symbol-key configuration hashes internally. Deprecate `DatabaseConfig#config` which returns a String-keyed `Hash` with the same values.
         
     | 
| 
       1304 
1176 
     | 
    
         | 
| 
       1305 
     | 
    
         
            -
                 
     | 
| 
       1306 
     | 
    
         
            -
                is an inflexible data model. In order to improve multiple-database
         
     | 
| 
       1307 
     | 
    
         
            -
                handling in Rails, we've changed this to return an object. Some methods
         
     | 
| 
       1308 
     | 
    
         
            -
                are provided to make the object behave hash-like in order to ease the
         
     | 
| 
       1309 
     | 
    
         
            -
                transition process. Since most applications don't manipulate the hash
         
     | 
| 
       1310 
     | 
    
         
            -
                we've decided to add backwards-compatible functionality that will throw
         
     | 
| 
       1311 
     | 
    
         
            -
                a deprecation warning if used, however calling `ActiveRecord::Base.configurations`
         
     | 
| 
       1312 
     | 
    
         
            -
                will use the new version internally and externally.
         
     | 
| 
      
 1177 
     | 
    
         
            +
                *John Crepezzi*, *Eileen Uchitelle*
         
     | 
| 
       1313 
1178 
     | 
    
         | 
| 
       1314 
     | 
    
         
            -
             
     | 
| 
      
 1179 
     | 
    
         
            +
            *   Allow column names to be passed to `remove_index` positionally along with other options.
         
     | 
| 
       1315 
1180 
     | 
    
         | 
| 
       1316 
     | 
    
         
            -
                 
     | 
| 
       1317 
     | 
    
         
            -
                development:
         
     | 
| 
       1318 
     | 
    
         
            -
                  adapter: sqlite3
         
     | 
| 
       1319 
     | 
    
         
            -
                  database: db/development.sqlite3
         
     | 
| 
       1320 
     | 
    
         
            -
                ```
         
     | 
| 
      
 1181 
     | 
    
         
            +
                Passing other options can be necessary to make `remove_index` correctly reversible.
         
     | 
| 
       1321 
1182 
     | 
    
         | 
| 
       1322 
     | 
    
         
            -
                 
     | 
| 
      
 1183 
     | 
    
         
            +
                Before:
         
     | 
| 
       1323 
1184 
     | 
    
         | 
| 
       1324 
     | 
    
         
            -
                 
     | 
| 
       1325 
     | 
    
         
            -
                 
     | 
| 
       1326 
     | 
    
         
            -
             
     | 
| 
      
 1185 
     | 
    
         
            +
                    add_index    :reports, :report_id               # => works
         
     | 
| 
      
 1186 
     | 
    
         
            +
                    add_index    :reports, :report_id, unique: true # => works
         
     | 
| 
      
 1187 
     | 
    
         
            +
                    remove_index :reports, :report_id               # => works
         
     | 
| 
      
 1188 
     | 
    
         
            +
                    remove_index :reports, :report_id, unique: true # => ArgumentError
         
     | 
| 
      
 1189 
     | 
    
         
            +
             
     | 
| 
      
 1190 
     | 
    
         
            +
                After:
         
     | 
| 
       1327 
1191 
     | 
    
         | 
| 
       1328 
     | 
    
         
            -
             
     | 
| 
      
 1192 
     | 
    
         
            +
                    remove_index :reports, :report_id, unique: true # => works
         
     | 
| 
       1329 
1193 
     | 
    
         | 
| 
       1330 
     | 
    
         
            -
                 
     | 
| 
       1331 
     | 
    
         
            -
                #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
         
     | 
| 
       1332 
     | 
    
         
            -
                  #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
         
     | 
| 
       1333 
     | 
    
         
            -
                    @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
         
     | 
| 
       1334 
     | 
    
         
            -
                  ]
         
     | 
| 
       1335 
     | 
    
         
            -
                ```
         
     | 
| 
      
 1194 
     | 
    
         
            +
                *Eugene Kenny*
         
     | 
| 
       1336 
1195 
     | 
    
         | 
| 
       1337 
     | 
    
         
            -
             
     | 
| 
       1338 
     | 
    
         
            -
                calling hash methods on the `configurations` hash directly, a new method `configs_for` has
         
     | 
| 
       1339 
     | 
    
         
            -
                been provided that allows you to select the correct configuration. `env_name` and
         
     | 
| 
       1340 
     | 
    
         
            -
                `spec_name` arguments are optional. For example, these return an array of
         
     | 
| 
       1341 
     | 
    
         
            -
                database config objects for the requested environment and a single database config object
         
     | 
| 
       1342 
     | 
    
         
            -
                will be returned for the requested environment and specification name respectively.
         
     | 
| 
      
 1196 
     | 
    
         
            +
            *   Allow bulk `ALTER` statements to drop and recreate indexes with the same name.
         
     | 
| 
       1343 
1197 
     | 
    
         | 
| 
       1344 
     | 
    
         
            -
                 
     | 
| 
       1345 
     | 
    
         
            -
                ActiveRecord::Base.configurations.configs_for(env_name: "development")
         
     | 
| 
       1346 
     | 
    
         
            -
                ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
         
     | 
| 
       1347 
     | 
    
         
            -
                ```
         
     | 
| 
      
 1198 
     | 
    
         
            +
                *Eugene Kenny*
         
     | 
| 
       1348 
1199 
     | 
    
         | 
| 
       1349 
     | 
    
         
            -
             
     | 
| 
      
 1200 
     | 
    
         
            +
            *   `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
         
     | 
| 
       1350 
1201 
     | 
    
         | 
| 
       1351 
     | 
    
         
            -
            * 
     | 
| 
      
 1202 
     | 
    
         
            +
                *Eugene Kenny*
         
     | 
| 
       1352 
1203 
     | 
    
         | 
| 
       1353 
     | 
    
         
            -
             
     | 
| 
       1354 
     | 
    
         
            -
                production:
         
     | 
| 
       1355 
     | 
    
         
            -
                  adapter: postgresql
         
     | 
| 
       1356 
     | 
    
         
            -
                  advisory_locks: false
         
     | 
| 
       1357 
     | 
    
         
            -
                ```
         
     | 
| 
      
 1204 
     | 
    
         
            +
            *   Call `while_preventing_writes` directly from `connected_to`.
         
     | 
| 
       1358 
1205 
     | 
    
         | 
| 
       1359 
     | 
    
         
            -
                 
     | 
| 
      
 1206 
     | 
    
         
            +
                In some cases application authors want to use the database switching middleware and make explicit calls with `connected_to`. It's possible for an app to turn off writes and not turn them back on by the time we call `connected_to(role: :writing)`.
         
     | 
| 
       1360 
1207 
     | 
    
         | 
| 
       1361 
     | 
    
         
            -
             
     | 
| 
      
 1208 
     | 
    
         
            +
                This change allows apps to fix this by assuming if a role is writing we want to allow writes, except in the case it's explicitly turned off.
         
     | 
| 
       1362 
1209 
     | 
    
         | 
| 
       1363 
     | 
    
         
            -
                * 
     | 
| 
      
 1210 
     | 
    
         
            +
                *Eileen M. Uchitelle*
         
     | 
| 
       1364 
1211 
     | 
    
         | 
| 
       1365 
     | 
    
         
            -
            *    
     | 
| 
      
 1212 
     | 
    
         
            +
            *   Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
         
     | 
| 
       1366 
1213 
     | 
    
         | 
| 
       1367 
     | 
    
         
            -
                 
     | 
| 
      
 1214 
     | 
    
         
            +
                *Kir Shatrov*
         
     | 
| 
       1368 
1215 
     | 
    
         | 
| 
       1369 
     | 
    
         
            -
             
     | 
| 
      
 1216 
     | 
    
         
            +
            *   Stop trying to read yaml file fixtures when loading Active Record fixtures.
         
     | 
| 
       1370 
1217 
     | 
    
         | 
| 
       1371 
     | 
    
         
            -
                * 
     | 
| 
      
 1218 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       1372 
1219 
     | 
    
         | 
| 
       1373 
     | 
    
         
            -
            *    
     | 
| 
       1374 
     | 
    
         
            -
                seed load in environments without Rails and custom DB configuration
         
     | 
| 
      
 1220 
     | 
    
         
            +
            *   Deprecate `.reorder(nil)` with `.first` / `.first!` taking non-deterministic result.
         
     | 
| 
       1375 
1221 
     | 
    
         | 
| 
       1376 
     | 
    
         
            -
                 
     | 
| 
      
 1222 
     | 
    
         
            +
                To continue taking non-deterministic result, use `.take` / `.take!` instead.
         
     | 
| 
       1377 
1223 
     | 
    
         | 
| 
       1378 
     | 
    
         
            -
            * 
     | 
| 
      
 1224 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       1379 
1225 
     | 
    
         | 
| 
       1380 
     | 
    
         
            -
             
     | 
| 
      
 1226 
     | 
    
         
            +
            *   Preserve user supplied joins order as much as possible.
         
     | 
| 
       1381 
1227 
     | 
    
         | 
| 
       1382 
     | 
    
         
            -
             
     | 
| 
      
 1228 
     | 
    
         
            +
                Fixes #36761, #34328, #24281, #12953.
         
     | 
| 
       1383 
1229 
     | 
    
         | 
| 
       1384 
1230 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       1385 
1231 
     | 
    
         | 
| 
       1386 
     | 
    
         
            -
            *    
     | 
| 
      
 1232 
     | 
    
         
            +
            *   Allow `matches_regex` and `does_not_match_regexp` on the MySQL Arel visitor.
         
     | 
| 
      
 1233 
     | 
    
         
            +
             
     | 
| 
      
 1234 
     | 
    
         
            +
                *James Pearson*
         
     | 
| 
       1387 
1235 
     | 
    
         | 
| 
       1388 
     | 
    
         
            -
             
     | 
| 
      
 1236 
     | 
    
         
            +
            *   Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section.
         
     | 
| 
       1389 
1237 
     | 
    
         | 
| 
       1390 
     | 
    
         
            -
                * 
     | 
| 
      
 1238 
     | 
    
         
            +
                *Tongfei Gao*
         
     | 
| 
      
 1239 
     | 
    
         
            +
             
     | 
| 
      
 1240 
     | 
    
         
            +
            *   Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
         
     | 
| 
       1391 
1241 
     | 
    
         | 
| 
       1392 
     | 
    
         
            -
            * 
     | 
| 
      
 1242 
     | 
    
         
            +
                *John Crepezzi*, *Eileen Uchitelle*
         
     | 
| 
       1393 
1243 
     | 
    
         | 
| 
       1394 
     | 
    
         
            -
             
     | 
| 
      
 1244 
     | 
    
         
            +
            *   Add a warning for enum elements with 'not_' prefix.
         
     | 
| 
       1395 
1245 
     | 
    
         | 
| 
       1396 
     | 
    
         
            -
             
     | 
| 
      
 1246 
     | 
    
         
            +
                    class Foo
         
     | 
| 
      
 1247 
     | 
    
         
            +
                      enum status: [:sent, :not_sent]
         
     | 
| 
      
 1248 
     | 
    
         
            +
                    end
         
     | 
| 
       1397 
1249 
     | 
    
         | 
| 
       1398 
     | 
    
         
            -
                 
     | 
| 
      
 1250 
     | 
    
         
            +
                *Edu Depetris*
         
     | 
| 
       1399 
1251 
     | 
    
         | 
| 
       1400 
     | 
    
         
            -
             
     | 
| 
      
 1252 
     | 
    
         
            +
            *   Make currency symbols optional for money column type in PostgreSQL.
         
     | 
| 
       1401 
1253 
     | 
    
         | 
| 
       1402 
     | 
    
         
            -
            * 
     | 
| 
      
 1254 
     | 
    
         
            +
                *Joel Schneider*
         
     | 
| 
       1403 
1255 
     | 
    
         | 
| 
       1404 
     | 
    
         
            -
             
     | 
| 
      
 1256 
     | 
    
         
            +
            *   Add support for beginless ranges, introduced in Ruby 2.7.
         
     | 
| 
       1405 
1257 
     | 
    
         | 
| 
       1406 
     | 
    
         
            -
            * 
     | 
| 
       1407 
     | 
    
         
            -
                use loaded association ids if present.
         
     | 
| 
      
 1258 
     | 
    
         
            +
                *Josh Goodall*
         
     | 
| 
       1408 
1259 
     | 
    
         | 
| 
       1409 
     | 
    
         
            -
             
     | 
| 
      
 1260 
     | 
    
         
            +
            *   Add `database_exists?` method to connection adapters to check if a database exists.
         
     | 
| 
       1410 
1261 
     | 
    
         | 
| 
       1411 
     | 
    
         
            -
            * 
     | 
| 
      
 1262 
     | 
    
         
            +
                *Guilherme Mansur*
         
     | 
| 
       1412 
1263 
     | 
    
         | 
| 
       1413 
     | 
    
         
            -
             
     | 
| 
      
 1264 
     | 
    
         
            +
            *   Loading the schema for a model that has no `table_name` raises a `TableNotSpecified` error.
         
     | 
| 
       1414 
1265 
     | 
    
         | 
| 
       1415 
     | 
    
         
            -
            * 
     | 
| 
      
 1266 
     | 
    
         
            +
                *Guilherme Mansur*, *Eugene Kenny*
         
     | 
| 
       1416 
1267 
     | 
    
         | 
| 
       1417 
     | 
    
         
            -
             
     | 
| 
      
 1268 
     | 
    
         
            +
            *   PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
         
     | 
| 
       1418 
1269 
     | 
    
         | 
| 
       1419 
     | 
    
         
            -
             
     | 
| 
      
 1270 
     | 
    
         
            +
                Fixes #36022.
         
     | 
| 
      
 1271 
     | 
    
         
            +
             
     | 
| 
      
 1272 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
      
 1273 
     | 
    
         
            +
             
     | 
| 
      
 1274 
     | 
    
         
            +
            *   Make ActiveRecord `ConnectionPool.connections` method thread-safe.
         
     | 
| 
       1420 
1275 
     | 
    
         | 
| 
       1421 
     | 
    
         
            -
                 
     | 
| 
      
 1276 
     | 
    
         
            +
                Fixes #36465.
         
     | 
| 
       1422 
1277 
     | 
    
         | 
| 
       1423 
     | 
    
         
            -
            * 
     | 
| 
      
 1278 
     | 
    
         
            +
                *Jeff Doering*
         
     | 
| 
       1424 
1279 
     | 
    
         | 
| 
       1425 
     | 
    
         
            -
             
     | 
| 
      
 1280 
     | 
    
         
            +
            *   Add support for multiple databases to `rails db:abort_if_pending_migrations`.
         
     | 
| 
       1426 
1281 
     | 
    
         | 
| 
       1427 
     | 
    
         
            -
            * 
     | 
| 
      
 1282 
     | 
    
         
            +
                *Mark Lee*
         
     | 
| 
       1428 
1283 
     | 
    
         | 
| 
       1429 
     | 
    
         
            -
             
     | 
| 
      
 1284 
     | 
    
         
            +
            *   Fix sqlite3 collation parsing when using decimal columns.
         
     | 
| 
       1430 
1285 
     | 
    
         | 
| 
       1431 
     | 
    
         
            -
            * 
     | 
| 
      
 1286 
     | 
    
         
            +
                *Martin R. Schuster*
         
     | 
| 
       1432 
1287 
     | 
    
         | 
| 
       1433 
     | 
    
         
            -
             
     | 
| 
      
 1288 
     | 
    
         
            +
            *   Fix invalid schema when primary key column has a comment.
         
     | 
| 
       1434 
1289 
     | 
    
         | 
| 
       1435 
     | 
    
         
            -
             
     | 
| 
      
 1290 
     | 
    
         
            +
                Fixes #29966.
         
     | 
| 
       1436 
1291 
     | 
    
         | 
| 
       1437 
     | 
    
         
            -
                * 
     | 
| 
      
 1292 
     | 
    
         
            +
                *Guilherme Goettems Schneider*
         
     | 
| 
       1438 
1293 
     | 
    
         | 
| 
       1439 
     | 
    
         
            -
            *    
     | 
| 
       1440 
     | 
    
         
            -
                `ActiveRecord::Base.find_or_create_by`/`!` by leaning on unique constraints in the database.
         
     | 
| 
      
 1294 
     | 
    
         
            +
            *   Fix table comment also being applied to the primary key column.
         
     | 
| 
       1441 
1295 
     | 
    
         | 
| 
       1442 
     | 
    
         
            -
                * 
     | 
| 
      
 1296 
     | 
    
         
            +
                *Guilherme Goettems Schneider*
         
     | 
| 
       1443 
1297 
     | 
    
         | 
| 
       1444 
     | 
    
         
            -
            *    
     | 
| 
      
 1298 
     | 
    
         
            +
            *   Allow generated `create_table` migrations to include or skip timestamps.
         
     | 
| 
       1445 
1299 
     | 
    
         | 
| 
       1446 
     | 
    
         
            -
                * 
     | 
| 
      
 1300 
     | 
    
         
            +
                *Michael Duchemin*
         
     | 
| 
       1447 
1301 
     | 
    
         | 
| 
       1448 
1302 
     | 
    
         | 
| 
       1449 
     | 
    
         
            -
            Please check [ 
     | 
| 
      
 1303 
     | 
    
         
            +
            Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activerecord/CHANGELOG.md) for previous changes.
         
     |