activerecord 5.2.4.3 → 6.0.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 +614 -588
 - data/MIT-LICENSE +3 -1
 - data/README.rdoc +4 -2
 - data/examples/performance.rb +1 -1
 - data/lib/active_record.rb +9 -2
 - data/lib/active_record/aggregations.rb +4 -2
 - data/lib/active_record/associations.rb +19 -14
 - data/lib/active_record/associations/association.rb +52 -19
 - data/lib/active_record/associations/association_scope.rb +4 -6
 - data/lib/active_record/associations/belongs_to_association.rb +36 -42
 - data/lib/active_record/associations/belongs_to_polymorphic_association.rb +0 -4
 - data/lib/active_record/associations/builder/association.rb +14 -18
 - data/lib/active_record/associations/builder/belongs_to.rb +19 -52
 - data/lib/active_record/associations/builder/collection_association.rb +3 -13
 - data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -38
 - data/lib/active_record/associations/builder/has_many.rb +2 -0
 - data/lib/active_record/associations/builder/has_one.rb +35 -1
 - data/lib/active_record/associations/builder/singular_association.rb +2 -0
 - data/lib/active_record/associations/collection_association.rb +6 -21
 - data/lib/active_record/associations/collection_proxy.rb +12 -15
 - data/lib/active_record/associations/foreign_association.rb +7 -0
 - data/lib/active_record/associations/has_many_association.rb +2 -10
 - data/lib/active_record/associations/has_many_through_association.rb +14 -14
 - data/lib/active_record/associations/has_one_association.rb +28 -30
 - data/lib/active_record/associations/has_one_through_association.rb +5 -5
 - data/lib/active_record/associations/join_dependency.rb +24 -28
 - data/lib/active_record/associations/join_dependency/join_association.rb +9 -10
 - data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
 - data/lib/active_record/associations/preloader.rb +40 -32
 - data/lib/active_record/associations/preloader/association.rb +38 -36
 - data/lib/active_record/associations/preloader/through_association.rb +48 -39
 - data/lib/active_record/associations/singular_association.rb +2 -16
 - data/lib/active_record/attribute_assignment.rb +7 -10
 - data/lib/active_record/attribute_methods.rb +28 -100
 - data/lib/active_record/attribute_methods/before_type_cast.rb +4 -1
 - data/lib/active_record/attribute_methods/dirty.rb +111 -40
 - data/lib/active_record/attribute_methods/primary_key.rb +15 -22
 - data/lib/active_record/attribute_methods/query.rb +2 -3
 - data/lib/active_record/attribute_methods/read.rb +15 -53
 - data/lib/active_record/attribute_methods/serialization.rb +1 -1
 - data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -1
 - data/lib/active_record/attribute_methods/write.rb +17 -24
 - data/lib/active_record/attributes.rb +13 -0
 - data/lib/active_record/autosave_association.rb +5 -9
 - data/lib/active_record/base.rb +2 -3
 - data/lib/active_record/callbacks.rb +5 -19
 - data/lib/active_record/connection_adapters/abstract/connection_pool.rb +94 -16
 - data/lib/active_record/connection_adapters/abstract/database_limits.rb +17 -4
 - data/lib/active_record/connection_adapters/abstract/database_statements.rb +95 -123
 - data/lib/active_record/connection_adapters/abstract/query_cache.rb +17 -8
 - data/lib/active_record/connection_adapters/abstract/quoting.rb +68 -17
 - data/lib/active_record/connection_adapters/abstract/schema_creation.rb +19 -12
 - data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +76 -48
 - data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -3
 - data/lib/active_record/connection_adapters/abstract/schema_statements.rb +132 -53
 - data/lib/active_record/connection_adapters/abstract/transaction.rb +96 -56
 - data/lib/active_record/connection_adapters/abstract_adapter.rb +180 -47
 - data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +128 -194
 - data/lib/active_record/connection_adapters/column.rb +17 -13
 - data/lib/active_record/connection_adapters/connection_specification.rb +52 -42
 - data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +6 -10
 - data/lib/active_record/connection_adapters/mysql/database_statements.rb +73 -13
 - data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
 - data/lib/active_record/connection_adapters/mysql/schema_creation.rb +3 -4
 - data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +40 -32
 - data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +14 -6
 - data/lib/active_record/connection_adapters/mysql/schema_statements.rb +129 -13
 - data/lib/active_record/connection_adapters/mysql/type_metadata.rb +6 -10
 - data/lib/active_record/connection_adapters/mysql2_adapter.rb +26 -9
 - data/lib/active_record/connection_adapters/postgresql/column.rb +17 -31
 - data/lib/active_record/connection_adapters/postgresql/database_statements.rb +20 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
 - data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
 - data/lib/active_record/connection_adapters/postgresql/oid/point.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/range.rb +1 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
 - data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +6 -3
 - data/lib/active_record/connection_adapters/postgresql/quoting.rb +44 -7
 - data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +12 -1
 - data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
 - data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +55 -53
 - data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +24 -27
 - data/lib/active_record/connection_adapters/postgresql_adapter.rb +160 -74
 - data/lib/active_record/connection_adapters/schema_cache.rb +37 -14
 - data/lib/active_record/connection_adapters/sql_type_metadata.rb +11 -8
 - data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
 - data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -6
 - data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +42 -11
 - data/lib/active_record/connection_adapters/sqlite3_adapter.rb +125 -141
 - data/lib/active_record/connection_handling.rb +149 -27
 - data/lib/active_record/core.rb +100 -60
 - data/lib/active_record/counter_cache.rb +4 -29
 - data/lib/active_record/database_configurations.rb +233 -0
 - data/lib/active_record/database_configurations/database_config.rb +37 -0
 - data/lib/active_record/database_configurations/hash_config.rb +50 -0
 - data/lib/active_record/database_configurations/url_config.rb +79 -0
 - data/lib/active_record/dynamic_matchers.rb +1 -1
 - data/lib/active_record/enum.rb +37 -7
 - data/lib/active_record/errors.rb +15 -7
 - data/lib/active_record/explain.rb +1 -1
 - data/lib/active_record/fixture_set/model_metadata.rb +33 -0
 - data/lib/active_record/fixture_set/render_context.rb +17 -0
 - data/lib/active_record/fixture_set/table_row.rb +153 -0
 - data/lib/active_record/fixture_set/table_rows.rb +47 -0
 - data/lib/active_record/fixtures.rb +145 -472
 - data/lib/active_record/gem_version.rb +4 -4
 - data/lib/active_record/inheritance.rb +13 -3
 - data/lib/active_record/insert_all.rb +179 -0
 - data/lib/active_record/integration.rb +68 -16
 - data/lib/active_record/internal_metadata.rb +10 -2
 - data/lib/active_record/locking/optimistic.rb +5 -6
 - data/lib/active_record/locking/pessimistic.rb +3 -3
 - data/lib/active_record/log_subscriber.rb +7 -26
 - data/lib/active_record/middleware/database_selector.rb +75 -0
 - data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
 - data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
 - data/lib/active_record/migration.rb +100 -81
 - data/lib/active_record/migration/command_recorder.rb +50 -6
 - data/lib/active_record/migration/compatibility.rb +76 -49
 - data/lib/active_record/model_schema.rb +30 -9
 - data/lib/active_record/nested_attributes.rb +2 -2
 - data/lib/active_record/no_touching.rb +7 -0
 - data/lib/active_record/persistence.rb +228 -24
 - data/lib/active_record/query_cache.rb +11 -4
 - data/lib/active_record/querying.rb +32 -20
 - data/lib/active_record/railtie.rb +80 -43
 - data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
 - data/lib/active_record/railties/controller_runtime.rb +30 -35
 - data/lib/active_record/railties/databases.rake +196 -46
 - data/lib/active_record/reflection.rb +32 -30
 - data/lib/active_record/relation.rb +310 -80
 - data/lib/active_record/relation/batches.rb +13 -10
 - data/lib/active_record/relation/calculations.rb +53 -47
 - data/lib/active_record/relation/delegation.rb +26 -43
 - data/lib/active_record/relation/finder_methods.rb +13 -26
 - data/lib/active_record/relation/merger.rb +11 -20
 - data/lib/active_record/relation/predicate_builder.rb +4 -6
 - data/lib/active_record/relation/predicate_builder/array_handler.rb +5 -4
 - data/lib/active_record/relation/predicate_builder/association_query_value.rb +1 -4
 - data/lib/active_record/relation/predicate_builder/base_handler.rb +1 -2
 - data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
 - data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -4
 - data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
 - data/lib/active_record/relation/query_attribute.rb +13 -8
 - data/lib/active_record/relation/query_methods.rb +189 -63
 - data/lib/active_record/relation/spawn_methods.rb +1 -1
 - data/lib/active_record/relation/where_clause.rb +14 -10
 - data/lib/active_record/relation/where_clause_factory.rb +1 -2
 - data/lib/active_record/result.rb +30 -11
 - data/lib/active_record/sanitization.rb +32 -40
 - data/lib/active_record/schema.rb +2 -11
 - data/lib/active_record/schema_dumper.rb +22 -7
 - data/lib/active_record/schema_migration.rb +5 -1
 - data/lib/active_record/scoping.rb +8 -8
 - data/lib/active_record/scoping/default.rb +4 -5
 - data/lib/active_record/scoping/named.rb +19 -15
 - data/lib/active_record/statement_cache.rb +30 -3
 - data/lib/active_record/store.rb +87 -8
 - data/lib/active_record/table_metadata.rb +10 -17
 - data/lib/active_record/tasks/database_tasks.rb +194 -25
 - data/lib/active_record/tasks/mysql_database_tasks.rb +5 -5
 - data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -7
 - data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -8
 - data/lib/active_record/test_databases.rb +23 -0
 - data/lib/active_record/test_fixtures.rb +224 -0
 - data/lib/active_record/timestamp.rb +39 -25
 - data/lib/active_record/touch_later.rb +4 -2
 - data/lib/active_record/transactions.rb +57 -66
 - data/lib/active_record/translation.rb +1 -1
 - data/lib/active_record/type.rb +3 -4
 - data/lib/active_record/type/adapter_specific_registry.rb +1 -8
 - data/lib/active_record/type_caster/connection.rb +15 -14
 - data/lib/active_record/type_caster/map.rb +1 -4
 - data/lib/active_record/validations.rb +1 -0
 - data/lib/active_record/validations/uniqueness.rb +15 -27
 - data/lib/arel.rb +51 -0
 - data/lib/arel/alias_predication.rb +9 -0
 - data/lib/arel/attributes.rb +22 -0
 - data/lib/arel/attributes/attribute.rb +37 -0
 - data/lib/arel/collectors/bind.rb +24 -0
 - data/lib/arel/collectors/composite.rb +31 -0
 - data/lib/arel/collectors/plain_string.rb +20 -0
 - data/lib/arel/collectors/sql_string.rb +20 -0
 - data/lib/arel/collectors/substitute_binds.rb +28 -0
 - data/lib/arel/crud.rb +42 -0
 - data/lib/arel/delete_manager.rb +18 -0
 - data/lib/arel/errors.rb +9 -0
 - data/lib/arel/expressions.rb +29 -0
 - data/lib/arel/factory_methods.rb +49 -0
 - data/lib/arel/insert_manager.rb +49 -0
 - data/lib/arel/math.rb +45 -0
 - data/lib/arel/nodes.rb +68 -0
 - data/lib/arel/nodes/and.rb +32 -0
 - data/lib/arel/nodes/ascending.rb +23 -0
 - data/lib/arel/nodes/binary.rb +52 -0
 - data/lib/arel/nodes/bind_param.rb +36 -0
 - data/lib/arel/nodes/case.rb +55 -0
 - data/lib/arel/nodes/casted.rb +50 -0
 - data/lib/arel/nodes/comment.rb +29 -0
 - data/lib/arel/nodes/count.rb +12 -0
 - data/lib/arel/nodes/delete_statement.rb +45 -0
 - data/lib/arel/nodes/descending.rb +23 -0
 - data/lib/arel/nodes/equality.rb +18 -0
 - data/lib/arel/nodes/extract.rb +24 -0
 - data/lib/arel/nodes/false.rb +16 -0
 - data/lib/arel/nodes/full_outer_join.rb +8 -0
 - data/lib/arel/nodes/function.rb +44 -0
 - data/lib/arel/nodes/grouping.rb +8 -0
 - data/lib/arel/nodes/in.rb +8 -0
 - data/lib/arel/nodes/infix_operation.rb +80 -0
 - data/lib/arel/nodes/inner_join.rb +8 -0
 - data/lib/arel/nodes/insert_statement.rb +37 -0
 - data/lib/arel/nodes/join_source.rb +20 -0
 - data/lib/arel/nodes/matches.rb +18 -0
 - data/lib/arel/nodes/named_function.rb +23 -0
 - data/lib/arel/nodes/node.rb +50 -0
 - data/lib/arel/nodes/node_expression.rb +13 -0
 - data/lib/arel/nodes/outer_join.rb +8 -0
 - data/lib/arel/nodes/over.rb +15 -0
 - data/lib/arel/nodes/regexp.rb +16 -0
 - data/lib/arel/nodes/right_outer_join.rb +8 -0
 - data/lib/arel/nodes/select_core.rb +67 -0
 - data/lib/arel/nodes/select_statement.rb +41 -0
 - data/lib/arel/nodes/sql_literal.rb +16 -0
 - data/lib/arel/nodes/string_join.rb +11 -0
 - data/lib/arel/nodes/table_alias.rb +27 -0
 - data/lib/arel/nodes/terminal.rb +16 -0
 - data/lib/arel/nodes/true.rb +16 -0
 - data/lib/arel/nodes/unary.rb +45 -0
 - data/lib/arel/nodes/unary_operation.rb +20 -0
 - data/lib/arel/nodes/unqualified_column.rb +22 -0
 - data/lib/arel/nodes/update_statement.rb +41 -0
 - data/lib/arel/nodes/values_list.rb +9 -0
 - data/lib/arel/nodes/window.rb +126 -0
 - data/lib/arel/nodes/with.rb +11 -0
 - data/lib/arel/order_predications.rb +13 -0
 - data/lib/arel/predications.rb +257 -0
 - data/lib/arel/select_manager.rb +271 -0
 - data/lib/arel/table.rb +110 -0
 - data/lib/arel/tree_manager.rb +72 -0
 - data/lib/arel/update_manager.rb +34 -0
 - data/lib/arel/visitors.rb +20 -0
 - data/lib/arel/visitors/depth_first.rb +204 -0
 - data/lib/arel/visitors/dot.rb +297 -0
 - data/lib/arel/visitors/ibm_db.rb +34 -0
 - data/lib/arel/visitors/informix.rb +62 -0
 - data/lib/arel/visitors/mssql.rb +157 -0
 - data/lib/arel/visitors/mysql.rb +83 -0
 - data/lib/arel/visitors/oracle.rb +159 -0
 - data/lib/arel/visitors/oracle12.rb +66 -0
 - data/lib/arel/visitors/postgresql.rb +110 -0
 - data/lib/arel/visitors/sqlite.rb +39 -0
 - data/lib/arel/visitors/to_sql.rb +889 -0
 - data/lib/arel/visitors/visitor.rb +46 -0
 - data/lib/arel/visitors/where_sql.rb +23 -0
 - data/lib/arel/window_predications.rb +9 -0
 - data/lib/rails/generators/active_record/migration.rb +14 -1
 - data/lib/rails/generators/active_record/migration/migration_generator.rb +2 -5
 - data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +1 -1
 - data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -2
 - data/lib/rails/generators/active_record/model/model_generator.rb +1 -0
 - data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
 - metadata +108 -26
 - data/lib/active_record/collection_cache_key.rb +0 -53
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: ed17e948626d108075b2951ac71abbac3075ef55b055abe64e2b352e91755fd9
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2c031642e021041f9fdf278888b580fd446879008a23f12d33c8b33aafbddc59
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 6b208a5cbee77c2a057649b762a92ec4ca5be3b8fbd1b2123caf485579abbc602bcb2aee455a503b74f33efa9ce364ab644dc8958b9e1edd94fee3397bf17cc8
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 751ecf72279d478887665f6a3efc5ad366b70284fb3f4ef6d2f3b072faf7c325be660116a7d3ac9427ac44dcf6f8c345e145921692d0465e24a70f1c2ca3b1bd
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,28 +1,33 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            ## Rails  
     | 
| 
      
 1 
     | 
    
         
            +
            ## Rails 6.0.0 (August 16, 2019) ##
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            *    
     | 
| 
      
 3 
     | 
    
         
            +
            *   Preserve user supplied joins order as much as possible.
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
      
 5 
     | 
    
         
            +
                Fixes #36761, #34328, #24281, #12953.
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
            *    
     | 
| 
      
 9 
     | 
    
         
            +
            *   Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
         
     | 
| 
       9 
10 
     | 
    
         | 
| 
      
 11 
     | 
    
         
            +
                *John Crepezzi*, *Eileen Uchitelle*
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
            *   Add a warning for enum elements with 'not_' prefix.
         
     | 
| 
       12 
14 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
                    class Foo
         
     | 
| 
      
 16 
     | 
    
         
            +
                      enum status: [:sent, :not_sent]
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
       14 
18 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                 
     | 
| 
       16 
     | 
    
         
            -
                associations, the callback for a `has_many` association was run while
         
     | 
| 
       17 
     | 
    
         
            -
                another instance of the same callback on the same association hadn't
         
     | 
| 
       18 
     | 
    
         
            -
                finished running. When control returned to the first instance of the
         
     | 
| 
       19 
     | 
    
         
            -
                callback, the instance variable had changed, and subsequent associated
         
     | 
| 
       20 
     | 
    
         
            -
                records weren't saved correctly. Specifically, the ID field for the
         
     | 
| 
       21 
     | 
    
         
            -
                `belongs_to` corresponding to the `has_many` was `nil`.
         
     | 
| 
      
 19 
     | 
    
         
            +
                *Edu Depetris*
         
     | 
| 
       22 
20 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 21 
     | 
    
         
            +
            *   Make currency symbols optional for money column type in PostgreSQL
         
     | 
| 
       24 
22 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
                * 
     | 
| 
      
 23 
     | 
    
         
            +
                *Joel Schneider*
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            ## Rails 6.0.0.rc2 (July 22, 2019) ##
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            *   Add database_exists? method to connection adapters to check if a database exists.
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                *Guilherme Mansur*
         
     | 
| 
       26 
31 
     | 
    
         | 
| 
       27 
32 
     | 
    
         
             
            *   PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
         
     | 
| 
       28 
33 
     | 
    
         | 
| 
         @@ -30,958 +35,979 @@ 
     | 
|
| 
       30 
35 
     | 
    
         | 
| 
       31 
36 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       32 
37 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
            *   Fix sqlite3 collation parsing when using decimal columns.
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                *Martin R. Schuster*
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
38 
     | 
    
         
             
            *   Make ActiveRecord `ConnectionPool.connections` method thread-safe.
         
     | 
| 
       38 
39 
     | 
    
         | 
| 
       39 
40 
     | 
    
         
             
                Fixes #36465.
         
     | 
| 
       40 
41 
     | 
    
         | 
| 
       41 
42 
     | 
    
         
             
                *Jeff Doering*
         
     | 
| 
       42 
43 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
            *    
     | 
| 
       44 
     | 
    
         
            -
                `before_add` and `after_add` callbacks for `has_many :through` associations.
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                Fixes #33249.
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
                *Ryan H. Kerr*
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
      
 44 
     | 
    
         
            +
            *   Fix sqlite3 collation parsing when using decimal columns.
         
     | 
| 
       50 
45 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
      
 46 
     | 
    
         
            +
                *Martin R. Schuster*
         
     | 
| 
       52 
47 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
            *   Fix  
     | 
| 
      
 48 
     | 
    
         
            +
            *   Fix invalid schema when primary key column has a comment.
         
     | 
| 
       54 
49 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
                Fixes # 
     | 
| 
      
 50 
     | 
    
         
            +
                Fixes #29966.
         
     | 
| 
       56 
51 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                * 
     | 
| 
      
 52 
     | 
    
         
            +
                *Guilherme Goettems Schneider*
         
     | 
| 
       58 
53 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
            *   Fix  
     | 
| 
      
 54 
     | 
    
         
            +
            *   Fix table comment also being applied to the primary key column.
         
     | 
| 
       60 
55 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
                * 
     | 
| 
      
 56 
     | 
    
         
            +
                *Guilherme Goettems Schneider*
         
     | 
| 
       62 
57 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
            *    
     | 
| 
      
 58 
     | 
    
         
            +
            *   Fix merging left_joins to maintain its own `join_type` context.
         
     | 
| 
       64 
59 
     | 
    
         | 
| 
       65 
     | 
    
         
            -
                Fixes # 
     | 
| 
      
 60 
     | 
    
         
            +
                Fixes #36103.
         
     | 
| 
       66 
61 
     | 
    
         | 
| 
       67 
62 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       68 
63 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
            *   Restore an ability that class level `update` without giving ids.
         
     | 
| 
       70 
64 
     | 
    
         | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
      
 65 
     | 
    
         
            +
            ## Rails 6.0.0.rc1 (April 24, 2019) ##
         
     | 
| 
       72 
66 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
      
 67 
     | 
    
         
            +
            *   Add `touch` option to `has_one` association.
         
     | 
| 
       74 
68 
     | 
    
         | 
| 
       75 
     | 
    
         
            -
            * 
     | 
| 
      
 69 
     | 
    
         
            +
                *Abhay Nikam*
         
     | 
| 
       76 
70 
     | 
    
         | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
      
 71 
     | 
    
         
            +
            *   Deprecate `where.not` working as NOR and will be changed to NAND in Rails 6.1.
         
     | 
| 
       78 
72 
     | 
    
         | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
      
 73 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 74 
     | 
    
         
            +
                all = [treasures(:diamond), treasures(:sapphire), cars(:honda), treasures(:sapphire)]
         
     | 
| 
      
 75 
     | 
    
         
            +
                assert_equal all, PriceEstimate.all.map(&:estimate_of)
         
     | 
| 
      
 76 
     | 
    
         
            +
                ```
         
     | 
| 
       80 
77 
     | 
    
         | 
| 
       81 
     | 
    
         
            -
                 
     | 
| 
      
 78 
     | 
    
         
            +
                In Rails 6.0:
         
     | 
| 
       82 
79 
     | 
    
         | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
      
 80 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 81 
     | 
    
         
            +
                sapphire = treasures(:sapphire)
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                nor = all.reject { |e|
         
     | 
| 
      
 84 
     | 
    
         
            +
                  e.estimate_of_type == sapphire.class.polymorphic_name
         
     | 
| 
      
 85 
     | 
    
         
            +
                }.reject { |e|
         
     | 
| 
      
 86 
     | 
    
         
            +
                  e.estimate_of_id == sapphire.id
         
     | 
| 
      
 87 
     | 
    
         
            +
                }
         
     | 
| 
      
 88 
     | 
    
         
            +
                assert_equal [cars(:honda)], nor
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                without_sapphire = PriceEstimate.where.not(
         
     | 
| 
      
 91 
     | 
    
         
            +
                  estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
         
     | 
| 
      
 92 
     | 
    
         
            +
                )
         
     | 
| 
      
 93 
     | 
    
         
            +
                assert_equal nor, without_sapphire.map(&:estimate_of)
         
     | 
| 
      
 94 
     | 
    
         
            +
                ```
         
     | 
| 
       84 
95 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
                 
     | 
| 
      
 96 
     | 
    
         
            +
                In Rails 6.1:
         
     | 
| 
       86 
97 
     | 
    
         | 
| 
      
 98 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 99 
     | 
    
         
            +
                sapphire = treasures(:sapphire)
         
     | 
| 
       87 
100 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
      
 101 
     | 
    
         
            +
                nand = all - [sapphire]
         
     | 
| 
      
 102 
     | 
    
         
            +
                assert_equal [treasures(:diamond), cars(:honda)], nand
         
     | 
| 
       89 
103 
     | 
    
         | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
      
 104 
     | 
    
         
            +
                without_sapphire = PriceEstimate.where.not(
         
     | 
| 
      
 105 
     | 
    
         
            +
                  estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
         
     | 
| 
      
 106 
     | 
    
         
            +
                )
         
     | 
| 
      
 107 
     | 
    
         
            +
                assert_equal nand, without_sapphire.map(&:estimate_of)
         
     | 
| 
      
 108 
     | 
    
         
            +
                ```
         
     | 
| 
       91 
109 
     | 
    
         | 
| 
      
 110 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       92 
111 
     | 
    
         | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
      
 112 
     | 
    
         
            +
            *   Fix dirty tracking after rollback.
         
     | 
| 
       94 
113 
     | 
    
         | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
      
 114 
     | 
    
         
            +
                Fixes #15018, #30167, #33868.
         
     | 
| 
       96 
115 
     | 
    
         | 
| 
       97 
116 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       98 
117 
     | 
    
         | 
| 
       99 
     | 
    
         
            -
            *    
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
       101 
     | 
    
         
            -
                 
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
            *   Allow spaces in postgres table names.
         
     | 
| 
      
 118 
     | 
    
         
            +
            *   Add `ActiveRecord::Relation#cache_version` to support recyclable cache keys via
         
     | 
| 
      
 119 
     | 
    
         
            +
                the versioned entries in `ActiveSupport::Cache`. This also means that
         
     | 
| 
      
 120 
     | 
    
         
            +
                `ActiveRecord::Relation#cache_key` will now return a stable key that does not
         
     | 
| 
      
 121 
     | 
    
         
            +
                include the max timestamp or count any more.
         
     | 
| 
       104 
122 
     | 
    
         | 
| 
       105 
     | 
    
         
            -
                 
     | 
| 
       106 
     | 
    
         
            -
                 
     | 
| 
      
 123 
     | 
    
         
            +
                NOTE: This feature is turned off by default, and `cache_key` will still return
         
     | 
| 
      
 124 
     | 
    
         
            +
                cache keys with timestamps until you set `ActiveRecord::Base.collection_cache_versioning = true`.
         
     | 
| 
      
 125 
     | 
    
         
            +
                That's the setting for all new apps on Rails 6.0+
         
     | 
| 
       107 
126 
     | 
    
         | 
| 
       108 
     | 
    
         
            -
                * 
     | 
| 
      
 127 
     | 
    
         
            +
                *Lachlan Sylvester*
         
     | 
| 
       109 
128 
     | 
    
         | 
| 
       110 
     | 
    
         
            -
            *    
     | 
| 
      
 129 
     | 
    
         
            +
            *   Fix dirty tracking for `touch` to track saved changes.
         
     | 
| 
       111 
130 
     | 
    
         | 
| 
       112 
     | 
    
         
            -
                 
     | 
| 
       113 
     | 
    
         
            -
                was passing for SQLite and MySQL, but failed for PostgreSQL:
         
     | 
| 
      
 131 
     | 
    
         
            +
                Fixes #33429.
         
     | 
| 
       114 
132 
     | 
    
         | 
| 
       115 
     | 
    
         
            -
                 
     | 
| 
       116 
     | 
    
         
            -
                class DeveloperName < ActiveRecord::Type::String
         
     | 
| 
       117 
     | 
    
         
            -
                  def deserialize(value)
         
     | 
| 
       118 
     | 
    
         
            -
                    "Developer: #{value}"
         
     | 
| 
       119 
     | 
    
         
            -
                  end
         
     | 
| 
       120 
     | 
    
         
            -
                end
         
     | 
| 
      
 133 
     | 
    
         
            +
                *Ryuta Kamzono*
         
     | 
| 
       121 
134 
     | 
    
         | 
| 
       122 
     | 
    
         
            -
             
     | 
| 
       123 
     | 
    
         
            -
             
     | 
| 
      
 135 
     | 
    
         
            +
            *   `change_column_comment` and `change_table_comment` are invertible only if
         
     | 
| 
      
 136 
     | 
    
         
            +
                `to` and `from` options are specified.
         
     | 
| 
       124 
137 
     | 
    
         | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
      
 138 
     | 
    
         
            +
                *Yoshiyuki Kinjo*
         
     | 
| 
       126 
139 
     | 
    
         | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
                end
         
     | 
| 
      
 140 
     | 
    
         
            +
            *   Don't call commit/rollback callbacks when a record isn't saved.
         
     | 
| 
       129 
141 
     | 
    
         | 
| 
       130 
     | 
    
         
            -
                 
     | 
| 
       131 
     | 
    
         
            -
                developer.update_column :name, "name"
         
     | 
| 
      
 142 
     | 
    
         
            +
                Fixes #29747.
         
     | 
| 
       132 
143 
     | 
    
         | 
| 
       133 
     | 
    
         
            -
                 
     | 
| 
       134 
     | 
    
         
            -
                puts loaded_developer.name # should be "Developer: name" but it's just "name"
         
     | 
| 
       135 
     | 
    
         
            -
                ```
         
     | 
| 
      
 144 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       136 
145 
     | 
    
         | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
      
 146 
     | 
    
         
            +
            *   Fix circular `autosave: true` causes invalid records to be saved.
         
     | 
| 
       138 
147 
     | 
    
         | 
| 
       139 
     | 
    
         
            -
             
     | 
| 
      
 148 
     | 
    
         
            +
                Prior to the fix, when there was a circular series of `autosave: true`
         
     | 
| 
      
 149 
     | 
    
         
            +
                associations, the callback for a `has_many` association was run while
         
     | 
| 
      
 150 
     | 
    
         
            +
                another instance of the same callback on the same association hadn't
         
     | 
| 
      
 151 
     | 
    
         
            +
                finished running. When control returned to the first instance of the
         
     | 
| 
      
 152 
     | 
    
         
            +
                callback, the instance variable had changed, and subsequent associated
         
     | 
| 
      
 153 
     | 
    
         
            +
                records weren't saved correctly. Specifically, the ID field for the
         
     | 
| 
      
 154 
     | 
    
         
            +
                `belongs_to` corresponding to the `has_many` was `nil`.
         
     | 
| 
       140 
155 
     | 
    
         | 
| 
       141 
     | 
    
         
            -
                 
     | 
| 
      
 156 
     | 
    
         
            +
                Fixes #28080.
         
     | 
| 
       142 
157 
     | 
    
         | 
| 
       143 
     | 
    
         
            -
            * 
     | 
| 
       144 
     | 
    
         
            -
                if the attribute does not exist.
         
     | 
| 
      
 158 
     | 
    
         
            +
                *Larry Reid*
         
     | 
| 
       145 
159 
     | 
    
         | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
      
 160 
     | 
    
         
            +
            *   Raise `ArgumentError` for invalid `:limit` and `:precision` like as other options.
         
     | 
| 
       147 
161 
     | 
    
         | 
| 
       148 
     | 
    
         
            -
             
     | 
| 
      
 162 
     | 
    
         
            +
                Before:
         
     | 
| 
       149 
163 
     | 
    
         | 
| 
       150 
     | 
    
         
            -
                 
     | 
| 
      
 164 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 165 
     | 
    
         
            +
                add_column :items, :attr1, :binary,   size: 10      # => ArgumentError
         
     | 
| 
      
 166 
     | 
    
         
            +
                add_column :items, :attr2, :decimal,  scale: 10     # => ArgumentError
         
     | 
| 
      
 167 
     | 
    
         
            +
                add_column :items, :attr3, :integer,  limit: 10     # => ActiveRecordError
         
     | 
| 
      
 168 
     | 
    
         
            +
                add_column :items, :attr4, :datetime, precision: 10 # => ActiveRecordError
         
     | 
| 
      
 169 
     | 
    
         
            +
                ```
         
     | 
| 
       151 
170 
     | 
    
         | 
| 
       152 
     | 
    
         
            -
             
     | 
| 
      
 171 
     | 
    
         
            +
                After:
         
     | 
| 
       153 
172 
     | 
    
         | 
| 
       154 
     | 
    
         
            -
                 
     | 
| 
      
 173 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 174 
     | 
    
         
            +
                add_column :items, :attr1, :binary,   size: 10      # => ArgumentError
         
     | 
| 
      
 175 
     | 
    
         
            +
                add_column :items, :attr2, :decimal,  scale: 10     # => ArgumentError
         
     | 
| 
      
 176 
     | 
    
         
            +
                add_column :items, :attr3, :integer,  limit: 10     # => ArgumentError
         
     | 
| 
      
 177 
     | 
    
         
            +
                add_column :items, :attr4, :datetime, precision: 10 # => ArgumentError
         
     | 
| 
      
 178 
     | 
    
         
            +
                ```
         
     | 
| 
       155 
179 
     | 
    
         | 
| 
       156 
     | 
    
         
            -
            * 
     | 
| 
      
 180 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       157 
181 
     | 
    
         | 
| 
       158 
     | 
    
         
            -
             
     | 
| 
      
 182 
     | 
    
         
            +
            *   Association loading isn't to be affected by scoping consistently
         
     | 
| 
      
 183 
     | 
    
         
            +
                whether preloaded / eager loaded or not, with the exception of `unscoped`.
         
     | 
| 
       159 
184 
     | 
    
         | 
| 
       160 
     | 
    
         
            -
                 
     | 
| 
      
 185 
     | 
    
         
            +
                Before:
         
     | 
| 
       161 
186 
     | 
    
         | 
| 
       162 
     | 
    
         
            -
             
     | 
| 
      
 187 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 188 
     | 
    
         
            +
                Post.where("1=0").scoping do
         
     | 
| 
      
 189 
     | 
    
         
            +
                  Comment.find(1).post                   # => nil
         
     | 
| 
      
 190 
     | 
    
         
            +
                  Comment.preload(:post).find(1).post    # => #<Post id: 1, ...>
         
     | 
| 
      
 191 
     | 
    
         
            +
                  Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
         
     | 
| 
      
 192 
     | 
    
         
            +
                end
         
     | 
| 
      
 193 
     | 
    
         
            +
                ```
         
     | 
| 
       163 
194 
     | 
    
         | 
| 
       164 
     | 
    
         
            -
                 
     | 
| 
      
 195 
     | 
    
         
            +
                After:
         
     | 
| 
       165 
196 
     | 
    
         | 
| 
       166 
     | 
    
         
            -
             
     | 
| 
      
 197 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 198 
     | 
    
         
            +
                Post.where("1=0").scoping do
         
     | 
| 
      
 199 
     | 
    
         
            +
                  Comment.find(1).post                   # => #<Post id: 1, ...>
         
     | 
| 
      
 200 
     | 
    
         
            +
                  Comment.preload(:post).find(1).post    # => #<Post id: 1, ...>
         
     | 
| 
      
 201 
     | 
    
         
            +
                  Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
         
     | 
| 
      
 202 
     | 
    
         
            +
                end
         
     | 
| 
      
 203 
     | 
    
         
            +
                ```
         
     | 
| 
       167 
204 
     | 
    
         | 
| 
       168 
     | 
    
         
            -
                 
     | 
| 
      
 205 
     | 
    
         
            +
                Fixes #34638, #35398.
         
     | 
| 
       169 
206 
     | 
    
         | 
| 
       170 
     | 
    
         
            -
            * 
     | 
| 
      
 207 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       171 
208 
     | 
    
         | 
| 
       172 
     | 
    
         
            -
             
     | 
| 
      
 209 
     | 
    
         
            +
            *   Add `rails db:prepare` to migrate or setup a database.
         
     | 
| 
       173 
210 
     | 
    
         | 
| 
       174 
     | 
    
         
            -
             
     | 
| 
      
 211 
     | 
    
         
            +
                Runs `db:migrate` if the database exists or `db:setup` if it doesn't.
         
     | 
| 
       175 
212 
     | 
    
         | 
| 
       176 
     | 
    
         
            -
                * 
     | 
| 
      
 213 
     | 
    
         
            +
                *Roberto Miranda*
         
     | 
| 
       177 
214 
     | 
    
         | 
| 
       178 
     | 
    
         
            -
            *    
     | 
| 
      
 215 
     | 
    
         
            +
            *   Add `after_save_commit` callback as shortcut for `after_commit :hook, on: [ :create, :update ]`.
         
     | 
| 
       179 
216 
     | 
    
         | 
| 
       180 
     | 
    
         
            -
                * 
     | 
| 
      
 217 
     | 
    
         
            +
                *DHH*
         
     | 
| 
       181 
218 
     | 
    
         | 
| 
       182 
     | 
    
         
            -
            *    
     | 
| 
      
 219 
     | 
    
         
            +
            *   Assign all attributes before calling `build` to ensure the child record is visible in
         
     | 
| 
      
 220 
     | 
    
         
            +
                `before_add` and `after_add` callbacks for `has_many :through` associations.
         
     | 
| 
       183 
221 
     | 
    
         | 
| 
       184 
     | 
    
         
            -
                 
     | 
| 
      
 222 
     | 
    
         
            +
                Fixes #33249.
         
     | 
| 
       185 
223 
     | 
    
         | 
| 
       186 
     | 
    
         
            -
            * 
     | 
| 
      
 224 
     | 
    
         
            +
                *Ryan H. Kerr*
         
     | 
| 
       187 
225 
     | 
    
         | 
| 
       188 
     | 
    
         
            -
             
     | 
| 
      
 226 
     | 
    
         
            +
            *   Add `ActiveRecord::Relation#extract_associated` for extracting associated records from a relation.
         
     | 
| 
       189 
227 
     | 
    
         | 
| 
       190 
     | 
    
         
            -
             
     | 
| 
      
 228 
     | 
    
         
            +
                ```
         
     | 
| 
      
 229 
     | 
    
         
            +
                account.memberships.extract_associated(:user)
         
     | 
| 
      
 230 
     | 
    
         
            +
                # => Returns collection of User records
         
     | 
| 
      
 231 
     | 
    
         
            +
                ```
         
     | 
| 
       191 
232 
     | 
    
         | 
| 
       192 
     | 
    
         
            -
                * 
     | 
| 
      
 233 
     | 
    
         
            +
                *DHH*
         
     | 
| 
       193 
234 
     | 
    
         | 
| 
      
 235 
     | 
    
         
            +
            *   Add `ActiveRecord::Relation#annotate` for adding SQL comments to its queries.
         
     | 
| 
       194 
236 
     | 
    
         | 
| 
       195 
     | 
    
         
            -
             
     | 
| 
      
 237 
     | 
    
         
            +
                For example:
         
     | 
| 
       196 
238 
     | 
    
         | 
| 
       197 
     | 
    
         
            -
             
     | 
| 
      
 239 
     | 
    
         
            +
                ```
         
     | 
| 
      
 240 
     | 
    
         
            +
                Post.where(id: 123).annotate("this is a comment").to_sql
         
     | 
| 
      
 241 
     | 
    
         
            +
                # SELECT "posts".* FROM "posts" WHERE "posts"."id" = 123 /* this is a comment */
         
     | 
| 
      
 242 
     | 
    
         
            +
                ```
         
     | 
| 
       198 
243 
     | 
    
         | 
| 
      
 244 
     | 
    
         
            +
                This can be useful in instrumentation or other analysis of issued queries.
         
     | 
| 
       199 
245 
     | 
    
         | 
| 
       200 
     | 
    
         
            -
             
     | 
| 
      
 246 
     | 
    
         
            +
                *Matt Yoho*
         
     | 
| 
       201 
247 
     | 
    
         | 
| 
       202 
     | 
    
         
            -
            *    
     | 
| 
      
 248 
     | 
    
         
            +
            *   Support Optimizer Hints.
         
     | 
| 
       203 
249 
     | 
    
         | 
| 
       204 
     | 
    
         
            -
                 
     | 
| 
      
 250 
     | 
    
         
            +
                In most databases, a way to control the optimizer is by using optimizer hints,
         
     | 
| 
      
 251 
     | 
    
         
            +
                which can be specified within individual statements.
         
     | 
| 
       205 
252 
     | 
    
         | 
| 
       206 
     | 
    
         
            -
                 
     | 
| 
      
 253 
     | 
    
         
            +
                Example (for MySQL):
         
     | 
| 
       207 
254 
     | 
    
         | 
| 
       208 
     | 
    
         
            -
             
     | 
| 
      
 255 
     | 
    
         
            +
                    Topic.optimizer_hints("MAX_EXECUTION_TIME(50000)", "NO_INDEX_MERGE(topics)")
         
     | 
| 
      
 256 
     | 
    
         
            +
                    # SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`
         
     | 
| 
       209 
257 
     | 
    
         | 
| 
       210 
     | 
    
         
            -
                 
     | 
| 
      
 258 
     | 
    
         
            +
                Example (for PostgreSQL with pg_hint_plan):
         
     | 
| 
       211 
259 
     | 
    
         | 
| 
       212 
     | 
    
         
            -
             
     | 
| 
      
 260 
     | 
    
         
            +
                    Topic.optimizer_hints("SeqScan(topics)", "Parallel(topics 8)")
         
     | 
| 
      
 261 
     | 
    
         
            +
                    # SELECT /*+ SeqScan(topics) Parallel(topics 8) */ "topics".* FROM "topics"
         
     | 
| 
       213 
262 
     | 
    
         | 
| 
       214 
     | 
    
         
            -
                 
     | 
| 
      
 263 
     | 
    
         
            +
                See also:
         
     | 
| 
       215 
264 
     | 
    
         | 
| 
       216 
     | 
    
         
            -
            * 
     | 
| 
      
 265 
     | 
    
         
            +
                * https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html
         
     | 
| 
      
 266 
     | 
    
         
            +
                * https://pghintplan.osdn.jp/pg_hint_plan.html
         
     | 
| 
      
 267 
     | 
    
         
            +
                * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/influencing-the-optimizer.html
         
     | 
| 
      
 268 
     | 
    
         
            +
                * https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-2017
         
     | 
| 
      
 269 
     | 
    
         
            +
                * https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.admin.perf.doc/doc/c0070117.html
         
     | 
| 
       217 
270 
     | 
    
         | 
| 
       218 
271 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       219 
272 
     | 
    
         | 
| 
       220 
     | 
    
         
            -
            *   Fix  
     | 
| 
      
 273 
     | 
    
         
            +
            *   Fix query attribute method on user-defined attribute to be aware of typecasted value.
         
     | 
| 
       221 
274 
     | 
    
         | 
| 
       222 
     | 
    
         
            -
                 
     | 
| 
      
 275 
     | 
    
         
            +
                For example, the following code no longer return false as casted non-empty string:
         
     | 
| 
       223 
276 
     | 
    
         | 
| 
       224 
     | 
    
         
            -
                 
     | 
| 
      
 277 
     | 
    
         
            +
                ```
         
     | 
| 
      
 278 
     | 
    
         
            +
                class Post < ActiveRecord::Base
         
     | 
| 
      
 279 
     | 
    
         
            +
                  attribute :user_defined_text, :text
         
     | 
| 
      
 280 
     | 
    
         
            +
                end
         
     | 
| 
       225 
281 
     | 
    
         | 
| 
       226 
     | 
    
         
            -
             
     | 
| 
      
 282 
     | 
    
         
            +
                Post.new(user_defined_text: "false").user_defined_text? # => true
         
     | 
| 
      
 283 
     | 
    
         
            +
                ```
         
     | 
| 
       227 
284 
     | 
    
         | 
| 
       228 
     | 
    
         
            -
                * 
     | 
| 
      
 285 
     | 
    
         
            +
                *Yuji Kamijima*
         
     | 
| 
       229 
286 
     | 
    
         | 
| 
       230 
     | 
    
         
            -
            *    
     | 
| 
      
 287 
     | 
    
         
            +
            *   Quote empty ranges like other empty enumerables.
         
     | 
| 
       231 
288 
     | 
    
         | 
| 
       232 
     | 
    
         
            -
                 
     | 
| 
      
 289 
     | 
    
         
            +
                *Patrick Rebsch*
         
     | 
| 
       233 
290 
     | 
    
         | 
| 
       234 
     | 
    
         
            -
             
     | 
| 
      
 291 
     | 
    
         
            +
            *   Add `insert_all`/`insert_all!`/`upsert_all` methods to `ActiveRecord::Persistence`,
         
     | 
| 
      
 292 
     | 
    
         
            +
                allowing bulk inserts akin to the bulk updates provided by `update_all` and
         
     | 
| 
      
 293 
     | 
    
         
            +
                bulk deletes by `delete_all`.
         
     | 
| 
       235 
294 
     | 
    
         | 
| 
       236 
     | 
    
         
            -
             
     | 
| 
      
 295 
     | 
    
         
            +
                Supports skipping or upserting duplicates through the `ON CONFLICT` syntax
         
     | 
| 
      
 296 
     | 
    
         
            +
                for PostgreSQL (9.5+) and SQLite (3.24+) and `ON DUPLICATE KEY UPDATE` syntax
         
     | 
| 
      
 297 
     | 
    
         
            +
                for MySQL.
         
     | 
| 
       237 
298 
     | 
    
         | 
| 
       238 
     | 
    
         
            -
                 
     | 
| 
      
 299 
     | 
    
         
            +
                *Bob Lail*
         
     | 
| 
       239 
300 
     | 
    
         | 
| 
       240 
     | 
    
         
            -
             
     | 
| 
      
 301 
     | 
    
         
            +
            *   Add `rails db:seed:replant` that truncates tables of each database
         
     | 
| 
      
 302 
     | 
    
         
            +
                for current environment and loads the seeds.
         
     | 
| 
       241 
303 
     | 
    
         | 
| 
       242 
     | 
    
         
            -
            * 
     | 
| 
      
 304 
     | 
    
         
            +
                *bogdanvlviv*, *DHH*
         
     | 
| 
       243 
305 
     | 
    
         | 
| 
       244 
     | 
    
         
            -
             
     | 
| 
      
 306 
     | 
    
         
            +
            *   Add `ActiveRecord::Base.connection.truncate` for SQLite3 adapter.
         
     | 
| 
       245 
307 
     | 
    
         | 
| 
       246 
     | 
    
         
            -
                * 
     | 
| 
      
 308 
     | 
    
         
            +
                *bogdanvlviv*
         
     | 
| 
       247 
309 
     | 
    
         | 
| 
       248 
     | 
    
         
            -
            *    
     | 
| 
      
 310 
     | 
    
         
            +
            *   Deprecate mismatched collation comparison for uniqueness validator.
         
     | 
| 
       249 
311 
     | 
    
         | 
| 
       250 
     | 
    
         
            -
                 
     | 
| 
      
 312 
     | 
    
         
            +
                Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1.
         
     | 
| 
      
 313 
     | 
    
         
            +
                To continue case sensitive comparison on the case insensitive column,
         
     | 
| 
      
 314 
     | 
    
         
            +
                pass `case_sensitive: true` option explicitly to the uniqueness validator.
         
     | 
| 
       251 
315 
     | 
    
         | 
| 
       252 
     | 
    
         
            -
            * 
     | 
| 
       253 
     | 
    
         
            -
                wrongly persists through record.
         
     | 
| 
      
 316 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       254 
317 
     | 
    
         | 
| 
       255 
     | 
    
         
            -
             
     | 
| 
      
 318 
     | 
    
         
            +
            *   Add `reselect` method. This is a short-hand for `unscope(:select).select(fields)`.
         
     | 
| 
       256 
319 
     | 
    
         | 
| 
       257 
     | 
    
         
            -
                 
     | 
| 
      
 320 
     | 
    
         
            +
                Fixes #27340.
         
     | 
| 
       258 
321 
     | 
    
         | 
| 
       259 
     | 
    
         
            -
            * 
     | 
| 
       260 
     | 
    
         
            -
                query cache.
         
     | 
| 
      
 322 
     | 
    
         
            +
                *Willian Gustavo Veiga*
         
     | 
| 
       261 
323 
     | 
    
         | 
| 
       262 
     | 
    
         
            -
             
     | 
| 
      
 324 
     | 
    
         
            +
            *   Add negative scopes for all enum values.
         
     | 
| 
       263 
325 
     | 
    
         | 
| 
      
 326 
     | 
    
         
            +
                Example:
         
     | 
| 
       264 
327 
     | 
    
         | 
| 
       265 
     | 
    
         
            -
             
     | 
| 
      
 328 
     | 
    
         
            +
                    class Post < ActiveRecord::Base
         
     | 
| 
      
 329 
     | 
    
         
            +
                      enum status: %i[ drafted active trashed ]
         
     | 
| 
      
 330 
     | 
    
         
            +
                    end
         
     | 
| 
       266 
331 
     | 
    
         | 
| 
       267 
     | 
    
         
            -
             
     | 
| 
      
 332 
     | 
    
         
            +
                    Post.not_drafted # => where.not(status: :drafted)
         
     | 
| 
      
 333 
     | 
    
         
            +
                    Post.not_active  # => where.not(status: :active)
         
     | 
| 
      
 334 
     | 
    
         
            +
                    Post.not_trashed # => where.not(status: :trashed)
         
     | 
| 
       268 
335 
     | 
    
         | 
| 
       269 
     | 
    
         
            -
                * 
     | 
| 
      
 336 
     | 
    
         
            +
                *DHH*
         
     | 
| 
       270 
337 
     | 
    
         | 
| 
       271 
     | 
    
         
            -
            *    
     | 
| 
      
 338 
     | 
    
         
            +
            *   Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
         
     | 
| 
       272 
339 
     | 
    
         | 
| 
       273 
     | 
    
         
            -
                 
     | 
| 
       274 
     | 
    
         
            -
                have a specified precision then on assignment the value is rounded to
         
     | 
| 
       275 
     | 
    
         
            -
                that precision. This behavior is now applied to time columns as well.
         
     | 
| 
      
 340 
     | 
    
         
            +
                Fixes #35214.
         
     | 
| 
       276 
341 
     | 
    
         | 
| 
       277 
     | 
    
         
            -
                 
     | 
| 
      
 342 
     | 
    
         
            +
                *Juani Villarejo*
         
     | 
| 
       278 
343 
     | 
    
         | 
| 
       279 
     | 
    
         
            -
                *Andrew White*
         
     | 
| 
       280 
344 
     | 
    
         | 
| 
       281 
     | 
    
         
            -
             
     | 
| 
      
 345 
     | 
    
         
            +
            ## Rails 6.0.0.beta3 (March 11, 2019) ##
         
     | 
| 
       282 
346 
     | 
    
         | 
| 
       283 
     | 
    
         
            -
             
     | 
| 
       284 
     | 
    
         
            -
                because until #24542 the quoting for time columns didn't remove the date
         
     | 
| 
       285 
     | 
    
         
            -
                component. To ensure that values are consistent we now normalize the
         
     | 
| 
       286 
     | 
    
         
            -
                date component to 2001-01-01 on reading and writing.
         
     | 
| 
      
 347 
     | 
    
         
            +
            *   No changes.
         
     | 
| 
       287 
348 
     | 
    
         | 
| 
       288 
     | 
    
         
            -
                *Andrew White*
         
     | 
| 
       289 
349 
     | 
    
         | 
| 
       290 
     | 
    
         
            -
             
     | 
| 
      
 350 
     | 
    
         
            +
            ## Rails 6.0.0.beta2 (February 25, 2019) ##
         
     | 
| 
       291 
351 
     | 
    
         | 
| 
       292 
     | 
    
         
            -
             
     | 
| 
       293 
     | 
    
         
            -
                was removed however it only removed it when it was 2001-01-01. Now the
         
     | 
| 
       294 
     | 
    
         
            -
                date component is removed irrespective of what the date is.
         
     | 
| 
      
 352 
     | 
    
         
            +
            *   Fix prepared statements caching to be enabled even when query caching is enabled.
         
     | 
| 
       295 
353 
     | 
    
         | 
| 
       296 
     | 
    
         
            -
                * 
     | 
| 
      
 354 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       297 
355 
     | 
    
         | 
| 
       298 
     | 
    
         
            -
            *    
     | 
| 
       299 
     | 
    
         
            -
                the parent class was getting deleted when the child was not.
         
     | 
| 
      
 356 
     | 
    
         
            +
            *   Ensure `update_all` series cares about optimistic locking.
         
     | 
| 
       300 
357 
     | 
    
         | 
| 
       301 
     | 
    
         
            -
                 
     | 
| 
      
 358 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       302 
359 
     | 
    
         | 
| 
       303 
     | 
    
         
            -
             
     | 
| 
      
 360 
     | 
    
         
            +
            *   Don't allow `where` with non numeric string matches to 0 values.
         
     | 
| 
       304 
361 
     | 
    
         | 
| 
       305 
     | 
    
         
            -
            * 
     | 
| 
      
 362 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       306 
363 
     | 
    
         | 
| 
       307 
     | 
    
         
            -
             
     | 
| 
      
 364 
     | 
    
         
            +
            *   Introduce `ActiveRecord::Relation#destroy_by` and `ActiveRecord::Relation#delete_by`.
         
     | 
| 
       308 
365 
     | 
    
         | 
| 
       309 
     | 
    
         
            -
             
     | 
| 
      
 366 
     | 
    
         
            +
                `destroy_by` allows relation to find all the records matching the condition and perform
         
     | 
| 
      
 367 
     | 
    
         
            +
                `destroy_all` on the matched records.
         
     | 
| 
       310 
368 
     | 
    
         | 
| 
       311 
     | 
    
         
            -
                 
     | 
| 
      
 369 
     | 
    
         
            +
                Example:
         
     | 
| 
       312 
370 
     | 
    
         | 
| 
       313 
     | 
    
         
            -
             
     | 
| 
       314 
     | 
    
         
            -
             
     | 
| 
       315 
     | 
    
         
            -
                even if `ORDER BY` columns include other table's primary key.
         
     | 
| 
      
 371 
     | 
    
         
            +
                    Person.destroy_by(name: 'David')
         
     | 
| 
      
 372 
     | 
    
         
            +
                    Person.destroy_by(name: 'David', rating: 4)
         
     | 
| 
       316 
373 
     | 
    
         | 
| 
       317 
     | 
    
         
            -
             
     | 
| 
      
 374 
     | 
    
         
            +
                    david = Person.find_by(name: 'David')
         
     | 
| 
      
 375 
     | 
    
         
            +
                    david.posts.destroy_by(id: [1, 2, 3])
         
     | 
| 
       318 
376 
     | 
    
         | 
| 
       319 
     | 
    
         
            -
                 
     | 
| 
      
 377 
     | 
    
         
            +
                `delete_by` allows relation to find all the records matching the condition and perform
         
     | 
| 
      
 378 
     | 
    
         
            +
                `delete_all` on the matched records.
         
     | 
| 
       320 
379 
     | 
    
         | 
| 
       321 
     | 
    
         
            -
             
     | 
| 
      
 380 
     | 
    
         
            +
                Example:
         
     | 
| 
       322 
381 
     | 
    
         | 
| 
       323 
     | 
    
         
            -
             
     | 
| 
      
 382 
     | 
    
         
            +
                    Person.delete_by(name: 'David')
         
     | 
| 
      
 383 
     | 
    
         
            +
                    Person.delete_by(name: 'David', rating: 4)
         
     | 
| 
       324 
384 
     | 
    
         | 
| 
       325 
     | 
    
         
            -
             
     | 
| 
      
 385 
     | 
    
         
            +
                    david = Person.find_by(name: 'David')
         
     | 
| 
      
 386 
     | 
    
         
            +
                    david.posts.delete_by(id: [1, 2, 3])
         
     | 
| 
       326 
387 
     | 
    
         | 
| 
       327 
     | 
    
         
            -
            * 
     | 
| 
      
 388 
     | 
    
         
            +
                *Abhay Nikam*
         
     | 
| 
       328 
389 
     | 
    
         | 
| 
       329 
     | 
    
         
            -
             
     | 
| 
      
 390 
     | 
    
         
            +
            *   Don't allow `where` with invalid value matches to nil values.
         
     | 
| 
       330 
391 
     | 
    
         | 
| 
       331 
     | 
    
         
            -
             
     | 
| 
       332 
     | 
    
         
            -
                Using a `Relation` for performing queries is the prefered API.
         
     | 
| 
      
 392 
     | 
    
         
            +
                Fixes #33624.
         
     | 
| 
       333 
393 
     | 
    
         | 
| 
       334 
394 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       335 
395 
     | 
    
         | 
| 
       336 
     | 
    
         
            -
            *    
     | 
| 
       337 
     | 
    
         
            -
             
     | 
| 
       338 
     | 
    
         
            -
                ```
         
     | 
| 
       339 
     | 
    
         
            -
                david_balance = customers(:david).balance
         
     | 
| 
       340 
     | 
    
         
            -
                Customer.where(balance: [david_balance]).to_sql
         
     | 
| 
      
 396 
     | 
    
         
            +
            *   SQLite3: Implement `add_foreign_key` and `remove_foreign_key`.
         
     | 
| 
       341 
397 
     | 
    
         | 
| 
       342 
     | 
    
         
            -
                 
     | 
| 
       343 
     | 
    
         
            -
                # After : WHERE `customers`.`balance` = 50
         
     | 
| 
       344 
     | 
    
         
            -
                ```
         
     | 
| 
      
 398 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       345 
399 
     | 
    
         | 
| 
       346 
     | 
    
         
            -
             
     | 
| 
      
 400 
     | 
    
         
            +
            *   Deprecate using class level querying methods if the receiver scope
         
     | 
| 
      
 401 
     | 
    
         
            +
                regarded as leaked. Use `klass.unscoped` to avoid the leaking scope.
         
     | 
| 
       347 
402 
     | 
    
         | 
| 
       348 
     | 
    
         
            -
                * 
     | 
| 
      
 403 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       349 
404 
     | 
    
         | 
| 
       350 
     | 
    
         
            -
            *    
     | 
| 
      
 405 
     | 
    
         
            +
            *   Allow applications to automatically switch connections.
         
     | 
| 
       351 
406 
     | 
    
         | 
| 
       352 
     | 
    
         
            -
                 
     | 
| 
      
 407 
     | 
    
         
            +
                Adds a middleware and configuration options that can be used in your
         
     | 
| 
      
 408 
     | 
    
         
            +
                application to automatically switch between the writing and reading
         
     | 
| 
      
 409 
     | 
    
         
            +
                database connections.
         
     | 
| 
       353 
410 
     | 
    
         | 
| 
       354 
     | 
    
         
            -
                 
     | 
| 
      
 411 
     | 
    
         
            +
                `GET` and `HEAD` requests will read from the replica unless there was
         
     | 
| 
      
 412 
     | 
    
         
            +
                a write in the last 2 seconds, otherwise they will read from the primary.
         
     | 
| 
      
 413 
     | 
    
         
            +
                Non-get requests will always write to the primary. The middleware accepts
         
     | 
| 
      
 414 
     | 
    
         
            +
                an argument for a Resolver class and an Operations class where you are able
         
     | 
| 
      
 415 
     | 
    
         
            +
                to change how the auto-switcher works to be most beneficial for your
         
     | 
| 
      
 416 
     | 
    
         
            +
                application.
         
     | 
| 
       355 
417 
     | 
    
         | 
| 
       356 
     | 
    
         
            -
             
     | 
| 
      
 418 
     | 
    
         
            +
                To use the middleware in your application you can use the following
         
     | 
| 
      
 419 
     | 
    
         
            +
                configuration options:
         
     | 
| 
       357 
420 
     | 
    
         | 
| 
       358 
     | 
    
         
            -
                 
     | 
| 
      
 421 
     | 
    
         
            +
                ```
         
     | 
| 
      
 422 
     | 
    
         
            +
                config.active_record.database_selector = { delay: 2.seconds }
         
     | 
| 
      
 423 
     | 
    
         
            +
                config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
         
     | 
| 
      
 424 
     | 
    
         
            +
                config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
         
     | 
| 
      
 425 
     | 
    
         
            +
                ```
         
     | 
| 
       359 
426 
     | 
    
         | 
| 
       360 
     | 
    
         
            -
                 
     | 
| 
      
 427 
     | 
    
         
            +
                To change the database selection strategy, pass a custom class to the
         
     | 
| 
      
 428 
     | 
    
         
            +
                configuration options:
         
     | 
| 
       361 
429 
     | 
    
         | 
| 
       362 
     | 
    
         
            -
             
     | 
| 
      
 430 
     | 
    
         
            +
                ```
         
     | 
| 
      
 431 
     | 
    
         
            +
                config.active_record.database_selector = { delay: 10.seconds }
         
     | 
| 
      
 432 
     | 
    
         
            +
                config.active_record.database_resolver = MyResolver
         
     | 
| 
      
 433 
     | 
    
         
            +
                config.active_record.database_resolver_context = MyResolver::MyCookies
         
     | 
| 
      
 434 
     | 
    
         
            +
                ```
         
     | 
| 
       363 
435 
     | 
    
         | 
| 
       364 
     | 
    
         
            -
                * 
     | 
| 
      
 436 
     | 
    
         
            +
                *Eileen M. Uchitelle*
         
     | 
| 
       365 
437 
     | 
    
         | 
| 
       366 
     | 
    
         
            -
            *    
     | 
| 
      
 438 
     | 
    
         
            +
            *   MySQL: Support `:size` option to change text and blob size.
         
     | 
| 
       367 
439 
     | 
    
         | 
| 
       368 
     | 
    
         
            -
                * 
     | 
| 
      
 440 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       369 
441 
     | 
    
         | 
| 
       370 
     | 
    
         
            -
            *    
     | 
| 
      
 442 
     | 
    
         
            +
            *   Make `t.timestamps` with precision by default.
         
     | 
| 
       371 
443 
     | 
    
         | 
| 
       372 
444 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       373 
445 
     | 
    
         | 
| 
       374 
     | 
    
         
            -
            *   Take into account association conditions when deleting through records.
         
     | 
| 
       375 
446 
     | 
    
         | 
| 
       376 
     | 
    
         
            -
             
     | 
| 
      
 447 
     | 
    
         
            +
            ## Rails 6.0.0.beta1 (January 18, 2019) ##
         
     | 
| 
       377 
448 
     | 
    
         | 
| 
       378 
     | 
    
         
            -
             
     | 
| 
      
 449 
     | 
    
         
            +
            *   Remove deprecated `#set_state` from the transaction object.
         
     | 
| 
       379 
450 
     | 
    
         | 
| 
       380 
     | 
    
         
            -
            * 
     | 
| 
      
 451 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       381 
452 
     | 
    
         | 
| 
       382 
     | 
    
         
            -
             
     | 
| 
      
 453 
     | 
    
         
            +
            *   Remove deprecated `#supports_statement_cache?` from the database adapters.
         
     | 
| 
       383 
454 
     | 
    
         | 
| 
       384 
     | 
    
         
            -
             
     | 
| 
       385 
     | 
    
         
            -
                      belongs_to :author
         
     | 
| 
       386 
     | 
    
         
            -
                      has_many :books, through: :author
         
     | 
| 
       387 
     | 
    
         
            -
                      has_many :subscriptions, through: :books
         
     | 
| 
       388 
     | 
    
         
            -
                    end
         
     | 
| 
      
 455 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       389 
456 
     | 
    
         | 
| 
       390 
     | 
    
         
            -
             
     | 
| 
       391 
     | 
    
         
            -
                      has_one :post
         
     | 
| 
       392 
     | 
    
         
            -
                      has_many :books
         
     | 
| 
       393 
     | 
    
         
            -
                      has_many :subscriptions, through: :books
         
     | 
| 
       394 
     | 
    
         
            -
                    end
         
     | 
| 
      
 457 
     | 
    
         
            +
            *   Remove deprecated `#insert_fixtures` from the database adapters.
         
     | 
| 
       395 
458 
     | 
    
         | 
| 
       396 
     | 
    
         
            -
             
     | 
| 
       397 
     | 
    
         
            -
                      belongs_to :author
         
     | 
| 
       398 
     | 
    
         
            -
                      has_many :subscriptions
         
     | 
| 
       399 
     | 
    
         
            -
                    end
         
     | 
| 
      
 459 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       400 
460 
     | 
    
         | 
| 
       401 
     | 
    
         
            -
             
     | 
| 
       402 
     | 
    
         
            -
                      belongs_to :book
         
     | 
| 
       403 
     | 
    
         
            -
                    end
         
     | 
| 
      
 461 
     | 
    
         
            +
            *   Remove deprecated `ActiveRecord::ConnectionAdapters::SQLite3Adapter#valid_alter_table_type?`.
         
     | 
| 
       404 
462 
     | 
    
         | 
| 
       405 
     | 
    
         
            -
                 
     | 
| 
      
 463 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       406 
464 
     | 
    
         | 
| 
       407 
     | 
    
         
            -
             
     | 
| 
      
 465 
     | 
    
         
            +
            *   Do not allow passing the column name to `sum` when a block is passed.
         
     | 
| 
       408 
466 
     | 
    
         | 
| 
       409 
     | 
    
         
            -
                 
     | 
| 
      
 467 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       410 
468 
     | 
    
         | 
| 
       411 
     | 
    
         
            -
             
     | 
| 
       412 
     | 
    
         
            -
                just like it would if `post` were persisted.
         
     | 
| 
      
 469 
     | 
    
         
            +
            *   Do not allow passing the column name to `count` when a block is passed.
         
     | 
| 
       413 
470 
     | 
    
         | 
| 
       414 
     | 
    
         
            -
                 
     | 
| 
      
 471 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       415 
472 
     | 
    
         | 
| 
       416 
     | 
    
         
            -
             
     | 
| 
      
 473 
     | 
    
         
            +
            *   Remove delegation of missing methods in a relation to arel.
         
     | 
| 
       417 
474 
     | 
    
         | 
| 
       418 
     | 
    
         
            -
            * 
     | 
| 
       419 
     | 
    
         
            -
                The `first(n)` finder now respects the `limit()`, making it consistent
         
     | 
| 
       420 
     | 
    
         
            -
                with `relation.to_a.first(n)`, and also with the behavior of `last(n)`.
         
     | 
| 
      
 475 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       421 
476 
     | 
    
         | 
| 
       422 
     | 
    
         
            -
             
     | 
| 
      
 477 
     | 
    
         
            +
            *   Remove delegation of missing methods in a relation to private methods of the class.
         
     | 
| 
       423 
478 
     | 
    
         | 
| 
       424 
     | 
    
         
            -
                * 
     | 
| 
      
 479 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       425 
480 
     | 
    
         | 
| 
       426 
     | 
    
         
            -
            *    
     | 
| 
       427 
     | 
    
         
            -
                SQL queries for association counting.
         
     | 
| 
      
 481 
     | 
    
         
            +
            *   Deprecate `config.activerecord.sqlite3.represent_boolean_as_integer`.
         
     | 
| 
       428 
482 
     | 
    
         | 
| 
       429 
     | 
    
         
            -
                * 
     | 
| 
      
 483 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       430 
484 
     | 
    
         | 
| 
       431 
     | 
    
         
            -
            *    
     | 
| 
      
 485 
     | 
    
         
            +
            *   Change `SQLite3Adapter` to always represent boolean values as integers.
         
     | 
| 
       432 
486 
     | 
    
         | 
| 
       433 
     | 
    
         
            -
                * 
     | 
| 
      
 487 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       434 
488 
     | 
    
         | 
| 
       435 
     | 
    
         
            -
            *    
     | 
| 
      
 489 
     | 
    
         
            +
            *   Remove ability to specify a timestamp name for `#cache_key`.
         
     | 
| 
       436 
490 
     | 
    
         | 
| 
       437 
     | 
    
         
            -
                * 
     | 
| 
      
 491 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       438 
492 
     | 
    
         | 
| 
       439 
     | 
    
         
            -
            *    
     | 
| 
      
 493 
     | 
    
         
            +
            *   Remove deprecated `ActiveRecord::Migrator.migrations_path=`.
         
     | 
| 
       440 
494 
     | 
    
         | 
| 
       441 
     | 
    
         
            -
                * 
     | 
| 
      
 495 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       442 
496 
     | 
    
         | 
| 
       443 
     | 
    
         
            -
            *    
     | 
| 
       444 
     | 
    
         
            -
                information.
         
     | 
| 
      
 497 
     | 
    
         
            +
            *   Remove deprecated `expand_hash_conditions_for_aggregates`.
         
     | 
| 
       445 
498 
     | 
    
         | 
| 
       446 
     | 
    
         
            -
                * 
     | 
| 
      
 499 
     | 
    
         
            +
                *Rafael Mendonça França*
         
     | 
| 
       447 
500 
     | 
    
         | 
| 
       448 
     | 
    
         
            -
            *    
     | 
| 
      
 501 
     | 
    
         
            +
            *   Set polymorphic type column to NULL on `dependent: :nullify` strategy.
         
     | 
| 
       449 
502 
     | 
    
         | 
| 
       450 
     | 
    
         
            -
                 
     | 
| 
       451 
     | 
    
         
            -
                of database queries in the log to facilitate N+1 query resolution
         
     | 
| 
       452 
     | 
    
         
            -
                and other debugging.
         
     | 
| 
      
 503 
     | 
    
         
            +
                On polymorphic associations both the foreign key and the foreign type columns will be set to NULL.
         
     | 
| 
       453 
504 
     | 
    
         | 
| 
       454 
     | 
    
         
            -
                 
     | 
| 
       455 
     | 
    
         
            -
                recommended for use in the production environment since it relies
         
     | 
| 
       456 
     | 
    
         
            -
                on Ruby's `Kernel#caller_locations` which is fairly slow.
         
     | 
| 
      
 505 
     | 
    
         
            +
                *Laerti Papa*
         
     | 
| 
       457 
506 
     | 
    
         | 
| 
       458 
     | 
    
         
            -
             
     | 
| 
      
 507 
     | 
    
         
            +
            *   Allow permitted instance of `ActionController::Parameters` as argument of `ActiveRecord::Relation#exists?`.
         
     | 
| 
       459 
508 
     | 
    
         | 
| 
       460 
     | 
    
         
            -
            * 
     | 
| 
      
 509 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       461 
510 
     | 
    
         | 
| 
       462 
     | 
    
         
            -
             
     | 
| 
       463 
     | 
    
         
            -
                # create_table :posts do |t|
         
     | 
| 
       464 
     | 
    
         
            -
                #   t.integer :comments_count, default: 0
         
     | 
| 
       465 
     | 
    
         
            -
                #   t.integer :lock_version
         
     | 
| 
       466 
     | 
    
         
            -
                #   t.timestamps
         
     | 
| 
       467 
     | 
    
         
            -
                # end
         
     | 
| 
       468 
     | 
    
         
            -
                class Post < ApplicationRecord
         
     | 
| 
       469 
     | 
    
         
            -
                end
         
     | 
| 
      
 511 
     | 
    
         
            +
            *   Add support for endless ranges introduces in Ruby 2.6.
         
     | 
| 
       470 
512 
     | 
    
         | 
| 
       471 
     | 
    
         
            -
                 
     | 
| 
       472 
     | 
    
         
            -
                #   t.belongs_to :post
         
     | 
| 
       473 
     | 
    
         
            -
                # end
         
     | 
| 
       474 
     | 
    
         
            -
                class Comment < ApplicationRecord
         
     | 
| 
       475 
     | 
    
         
            -
                  belongs_to :post, touch: true, counter_cache: true
         
     | 
| 
       476 
     | 
    
         
            -
                end
         
     | 
| 
       477 
     | 
    
         
            -
                ```
         
     | 
| 
      
 513 
     | 
    
         
            +
                *Greg Navis*
         
     | 
| 
       478 
514 
     | 
    
         | 
| 
       479 
     | 
    
         
            -
             
     | 
| 
       480 
     | 
    
         
            -
                ```
         
     | 
| 
       481 
     | 
    
         
            -
                post = Post.create!
         
     | 
| 
       482 
     | 
    
         
            -
                # => begin transaction
         
     | 
| 
       483 
     | 
    
         
            -
                     INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
         
     | 
| 
       484 
     | 
    
         
            -
                     VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
         
     | 
| 
       485 
     | 
    
         
            -
                     commit transaction
         
     | 
| 
      
 515 
     | 
    
         
            +
            *   Deprecate passing `migrations_paths` to `connection.assume_migrated_upto_version`.
         
     | 
| 
       486 
516 
     | 
    
         | 
| 
       487 
     | 
    
         
            -
                 
     | 
| 
       488 
     | 
    
         
            -
                # => begin transaction
         
     | 
| 
       489 
     | 
    
         
            -
                     INSERT INTO "comments" ("post_id") VALUES (1)
         
     | 
| 
      
 517 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       490 
518 
     | 
    
         | 
| 
       491 
     | 
    
         
            -
             
     | 
| 
       492 
     | 
    
         
            -
                     "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
         
     | 
| 
      
 519 
     | 
    
         
            +
            *   MySQL: `ROW_FORMAT=DYNAMIC` create table option by default.
         
     | 
| 
       493 
520 
     | 
    
         | 
| 
       494 
     | 
    
         
            -
             
     | 
| 
       495 
     | 
    
         
            -
             
     | 
| 
       496 
     | 
    
         
            -
             
     | 
| 
       497 
     | 
    
         
            -
                # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
         
     | 
| 
      
 521 
     | 
    
         
            +
                Since MySQL 5.7.9, the `innodb_default_row_format` option defines the default row
         
     | 
| 
      
 522 
     | 
    
         
            +
                format for InnoDB tables. The default setting is `DYNAMIC`.
         
     | 
| 
      
 523 
     | 
    
         
            +
                The row format is required for indexing on `varchar(255)` with `utf8mb4` columns.
         
     | 
| 
       498 
524 
     | 
    
         | 
| 
       499 
     | 
    
         
            -
                 
     | 
| 
       500 
     | 
    
         
            -
                # => begin transaction
         
     | 
| 
       501 
     | 
    
         
            -
                     DELETE FROM "comments" WHERE "comments"."id" = 1
         
     | 
| 
      
 525 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       502 
526 
     | 
    
         | 
| 
       503 
     | 
    
         
            -
             
     | 
| 
       504 
     | 
    
         
            -
                     "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
         
     | 
| 
      
 527 
     | 
    
         
            +
            *   Fix join table column quoting with SQLite.
         
     | 
| 
       505 
528 
     | 
    
         | 
| 
       506 
     | 
    
         
            -
             
     | 
| 
       507 
     | 
    
         
            -
                     "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
         
     | 
| 
       508 
     | 
    
         
            -
                     rollback transaction
         
     | 
| 
       509 
     | 
    
         
            -
                # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
         
     | 
| 
       510 
     | 
    
         
            -
                ```
         
     | 
| 
      
 529 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       511 
530 
     | 
    
         | 
| 
       512 
     | 
    
         
            -
             
     | 
| 
       513 
     | 
    
         
            -
                ```
         
     | 
| 
       514 
     | 
    
         
            -
                post = Post.create!
         
     | 
| 
       515 
     | 
    
         
            -
                # => begin transaction
         
     | 
| 
       516 
     | 
    
         
            -
                     INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
         
     | 
| 
       517 
     | 
    
         
            -
                     VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
         
     | 
| 
       518 
     | 
    
         
            -
                     commit transaction
         
     | 
| 
      
 531 
     | 
    
         
            +
            *   Allow disabling scopes generated by `ActiveRecord.enum`.
         
     | 
| 
       519 
532 
     | 
    
         | 
| 
       520 
     | 
    
         
            -
                 
     | 
| 
       521 
     | 
    
         
            -
                # => begin transaction
         
     | 
| 
       522 
     | 
    
         
            -
                     INSERT INTO "comments" ("post_id") VALUES (1)
         
     | 
| 
      
 533 
     | 
    
         
            +
                *Alfred Dominic*
         
     | 
| 
       523 
534 
     | 
    
         | 
| 
       524 
     | 
    
         
            -
             
     | 
| 
       525 
     | 
    
         
            -
                     "lock_version" = COALESCE("lock_version", 0) + 1,
         
     | 
| 
       526 
     | 
    
         
            -
                     "updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
         
     | 
| 
       527 
     | 
    
         
            -
                     commit transaction
         
     | 
| 
      
 535 
     | 
    
         
            +
            *   Ensure that `delete_all` on collection proxy returns affected count.
         
     | 
| 
       528 
536 
     | 
    
         | 
| 
       529 
     | 
    
         
            -
                 
     | 
| 
       530 
     | 
    
         
            -
                # => begin transaction
         
     | 
| 
       531 
     | 
    
         
            -
                     DELETE FROM "comments" WHERE "comments"."id" = 1
         
     | 
| 
      
 537 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       532 
538 
     | 
    
         | 
| 
       533 
     | 
    
         
            -
             
     | 
| 
       534 
     | 
    
         
            -
                     "lock_version" = COALESCE("lock_version", 0) + 1,
         
     | 
| 
       535 
     | 
    
         
            -
                     "updated_at" = '2017-12-11 21:39:02.685520' WHERE "posts"."id" = 1
         
     | 
| 
       536 
     | 
    
         
            -
                     commit transaction
         
     | 
| 
       537 
     | 
    
         
            -
                ```
         
     | 
| 
      
 539 
     | 
    
         
            +
            *   Reset scope after delete on collection association to clear stale offsets of removed records.
         
     | 
| 
       538 
540 
     | 
    
         | 
| 
       539 
     | 
    
         
            -
                 
     | 
| 
      
 541 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       540 
542 
     | 
    
         | 
| 
       541 
     | 
    
         
            -
             
     | 
| 
      
 543 
     | 
    
         
            +
            *   Add the ability to prevent writes to a database for the duration of a block.
         
     | 
| 
       542 
544 
     | 
    
         | 
| 
       543 
     | 
    
         
            -
             
     | 
| 
      
 545 
     | 
    
         
            +
                Allows the application to prevent writes to a database. This can be useful when
         
     | 
| 
      
 546 
     | 
    
         
            +
                you're building out multiple databases and want to make sure you're not sending
         
     | 
| 
      
 547 
     | 
    
         
            +
                writes when you want a read.
         
     | 
| 
       544 
548 
     | 
    
         | 
| 
       545 
     | 
    
         
            -
                 
     | 
| 
      
 549 
     | 
    
         
            +
                If `while_preventing_writes` is called and the query is considered a write
         
     | 
| 
      
 550 
     | 
    
         
            +
                query the database will raise an exception regardless of whether the database
         
     | 
| 
      
 551 
     | 
    
         
            +
                user is able to write.
         
     | 
| 
       546 
552 
     | 
    
         | 
| 
       547 
     | 
    
         
            -
             
     | 
| 
      
 553 
     | 
    
         
            +
                This is not meant to be a catch-all for write queries but rather a way to enforce
         
     | 
| 
      
 554 
     | 
    
         
            +
                read-only queries without opening a second connection. One purpose of this is to
         
     | 
| 
      
 555 
     | 
    
         
            +
                catch accidental writes, not all writes.
         
     | 
| 
       548 
556 
     | 
    
         | 
| 
       549 
     | 
    
         
            -
                * 
     | 
| 
      
 557 
     | 
    
         
            +
                *Eileen M. Uchitelle*
         
     | 
| 
       550 
558 
     | 
    
         | 
| 
       551 
     | 
    
         
            -
            *    
     | 
| 
      
 559 
     | 
    
         
            +
            *   Allow aliased attributes to be used in `#update_columns` and `#update`.
         
     | 
| 
       552 
560 
     | 
    
         | 
| 
       553 
     | 
    
         
            -
                 
     | 
| 
      
 561 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       554 
562 
     | 
    
         | 
| 
       555 
     | 
    
         
            -
             
     | 
| 
      
 563 
     | 
    
         
            +
            *   Allow spaces in postgres table names.
         
     | 
| 
       556 
564 
     | 
    
         | 
| 
       557 
     | 
    
         
            -
             
     | 
| 
       558 
     | 
    
         
            -
                when canceling statement due to user request.
         
     | 
| 
      
 565 
     | 
    
         
            +
                Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres adapter.
         
     | 
| 
       559 
566 
     | 
    
         | 
| 
       560 
     | 
    
         
            -
                * 
     | 
| 
      
 567 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       561 
568 
     | 
    
         | 
| 
       562 
     | 
    
         
            -
            *    
     | 
| 
       563 
     | 
    
         
            -
                migrating up, e.g. populating a new column.
         
     | 
| 
      
 569 
     | 
    
         
            +
            *   Cached `columns_hash` fields should be excluded from `ResultSet#column_types`.
         
     | 
| 
       564 
570 
     | 
    
         | 
| 
       565 
     | 
    
         
            -
                 
     | 
| 
      
 571 
     | 
    
         
            +
                PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test
         
     | 
| 
      
 572 
     | 
    
         
            +
                was passing for SQLite and MySQL, but failed for PostgreSQL:
         
     | 
| 
       566 
573 
     | 
    
         | 
| 
       567 
     | 
    
         
            -
             
     | 
| 
       568 
     | 
    
         
            -
                 
     | 
| 
      
 574 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 575 
     | 
    
         
            +
                class DeveloperName < ActiveRecord::Type::String
         
     | 
| 
      
 576 
     | 
    
         
            +
                  def deserialize(value)
         
     | 
| 
      
 577 
     | 
    
         
            +
                    "Developer: #{value}"
         
     | 
| 
      
 578 
     | 
    
         
            +
                  end
         
     | 
| 
      
 579 
     | 
    
         
            +
                end
         
     | 
| 
       569 
580 
     | 
    
         | 
| 
       570 
     | 
    
         
            -
                 
     | 
| 
       571 
     | 
    
         
            -
             
     | 
| 
       572 
     | 
    
         
            -
                Article.order("LENGTH(title)")
         
     | 
| 
       573 
     | 
    
         
            -
                ```
         
     | 
| 
      
 581 
     | 
    
         
            +
                class AttributedDeveloper < ActiveRecord::Base
         
     | 
| 
      
 582 
     | 
    
         
            +
                  self.table_name = "developers"
         
     | 
| 
       574 
583 
     | 
    
         | 
| 
       575 
     | 
    
         
            -
             
     | 
| 
       576 
     | 
    
         
            -
                ```
         
     | 
| 
       577 
     | 
    
         
            -
                Article.order(Arel.sql("LENGTH(title)"))
         
     | 
| 
       578 
     | 
    
         
            -
                ```
         
     | 
| 
      
 584 
     | 
    
         
            +
                  attribute :name, DeveloperName.new
         
     | 
| 
       579 
585 
     | 
    
         | 
| 
       580 
     | 
    
         
            -
             
     | 
| 
       581 
     | 
    
         
            -
                 
     | 
| 
       582 
     | 
    
         
            -
                mistaken belief that only column names will be accepted.
         
     | 
| 
      
 586 
     | 
    
         
            +
                  self.ignored_columns += ["name"]
         
     | 
| 
      
 587 
     | 
    
         
            +
                end
         
     | 
| 
       583 
588 
     | 
    
         | 
| 
       584 
     | 
    
         
            -
                 
     | 
| 
       585 
     | 
    
         
            -
                 
     | 
| 
       586 
     | 
    
         
            -
                can opt in to the future behavior by setting `allow_unsafe_raw_sql`
         
     | 
| 
       587 
     | 
    
         
            -
                to `:disabled`.
         
     | 
| 
      
 589 
     | 
    
         
            +
                developer = AttributedDeveloper.create
         
     | 
| 
      
 590 
     | 
    
         
            +
                developer.update_column :name, "name"
         
     | 
| 
       588 
591 
     | 
    
         | 
| 
       589 
     | 
    
         
            -
                 
     | 
| 
       590 
     | 
    
         
            -
                 
     | 
| 
       591 
     | 
    
         
            -
                ```
         
     | 
| 
       592 
     | 
    
         
            -
                Article.order("title DESC")
         
     | 
| 
      
 592 
     | 
    
         
            +
                loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
         
     | 
| 
      
 593 
     | 
    
         
            +
                puts loaded_developer.name # should be "Developer: name" but it's just "name"
         
     | 
| 
       593 
594 
     | 
    
         
             
                ```
         
     | 
| 
       594 
595 
     | 
    
         | 
| 
       595 
     | 
    
         
            -
                * 
     | 
| 
       596 
     | 
    
         
            -
             
     | 
| 
       597 
     | 
    
         
            -
            *   `update_all` will now pass its values to `Type#cast` before passing them to
         
     | 
| 
       598 
     | 
    
         
            -
                `Type#serialize`. This means that `update_all(foo: 'true')` will properly
         
     | 
| 
       599 
     | 
    
         
            -
                persist a boolean.
         
     | 
| 
       600 
     | 
    
         
            -
             
     | 
| 
       601 
     | 
    
         
            -
                *Sean Griffin*
         
     | 
| 
       602 
     | 
    
         
            -
             
     | 
| 
       603 
     | 
    
         
            -
            *   Add new error class `StatementTimeout` which will be raised
         
     | 
| 
       604 
     | 
    
         
            -
                when statement timeout exceeded.
         
     | 
| 
       605 
     | 
    
         
            -
             
     | 
| 
       606 
     | 
    
         
            -
                *Ryuta Kamizono*
         
     | 
| 
       607 
     | 
    
         
            -
             
     | 
| 
       608 
     | 
    
         
            -
            *   Fix `bin/rails db:migrate` with specified `VERSION`.
         
     | 
| 
       609 
     | 
    
         
            -
                `bin/rails db:migrate` with empty VERSION behaves as without `VERSION`.
         
     | 
| 
       610 
     | 
    
         
            -
                Check a format of `VERSION`: Allow a migration version number
         
     | 
| 
       611 
     | 
    
         
            -
                or name of a migration file. Raise error if format of `VERSION` is invalid.
         
     | 
| 
       612 
     | 
    
         
            -
                Raise error if target migration doesn't exist.
         
     | 
| 
       613 
     | 
    
         
            -
             
     | 
| 
       614 
     | 
    
         
            -
                *bogdanvlviv*
         
     | 
| 
      
 596 
     | 
    
         
            +
                *Dmitry Tsepelev*
         
     | 
| 
       615 
597 
     | 
    
         | 
| 
       616 
     | 
    
         
            -
            *    
     | 
| 
       617 
     | 
    
         
            -
                `db/schema.rb` when using the sqlite adapter.
         
     | 
| 
      
 598 
     | 
    
         
            +
            *   Make the implicit order column configurable.
         
     | 
| 
       618 
599 
     | 
    
         | 
| 
       619 
     | 
    
         
            -
                 
     | 
| 
      
 600 
     | 
    
         
            +
                When calling ordered finder methods such as `first` or `last` without an
         
     | 
| 
      
 601 
     | 
    
         
            +
                explicit order clause, ActiveRecord sorts records by primary key. This can
         
     | 
| 
      
 602 
     | 
    
         
            +
                result in unpredictable and surprising behaviour when the primary key is
         
     | 
| 
      
 603 
     | 
    
         
            +
                not an auto-incrementing integer, for example when it's a UUID. This change
         
     | 
| 
      
 604 
     | 
    
         
            +
                makes it possible to override the column used for implicit ordering such
         
     | 
| 
      
 605 
     | 
    
         
            +
                that `first` and `last` will return more predictable results.
         
     | 
| 
       620 
606 
     | 
    
         | 
| 
       621 
     | 
    
         
            -
                 
     | 
| 
      
 607 
     | 
    
         
            +
                Example:
         
     | 
| 
       622 
608 
     | 
    
         | 
| 
       623 
     | 
    
         
            -
             
     | 
| 
      
 609 
     | 
    
         
            +
                    class Project < ActiveRecord::Base
         
     | 
| 
      
 610 
     | 
    
         
            +
                      self.implicit_order_column = "created_at"
         
     | 
| 
      
 611 
     | 
    
         
            +
                    end
         
     | 
| 
       624 
612 
     | 
    
         | 
| 
       625 
     | 
    
         
            -
                * 
     | 
| 
      
 613 
     | 
    
         
            +
                *Tekin Suleyman*
         
     | 
| 
       626 
614 
     | 
    
         | 
| 
       627 
     | 
    
         
            -
            *    
     | 
| 
      
 615 
     | 
    
         
            +
            *   Bump minimum PostgreSQL version to 9.3.
         
     | 
| 
       628 
616 
     | 
    
         | 
| 
       629 
     | 
    
         
            -
                * 
     | 
| 
      
 617 
     | 
    
         
            +
                *Yasuo Honda*
         
     | 
| 
       630 
618 
     | 
    
         | 
| 
       631 
     | 
    
         
            -
            *    
     | 
| 
      
 619 
     | 
    
         
            +
            *   Values of enum are frozen, raising an error when attempting to modify them.
         
     | 
| 
       632 
620 
     | 
    
         | 
| 
       633 
     | 
    
         
            -
                * 
     | 
| 
      
 621 
     | 
    
         
            +
                *Emmanuel Byrd*
         
     | 
| 
       634 
622 
     | 
    
         | 
| 
       635 
     | 
    
         
            -
            *    
     | 
| 
      
 623 
     | 
    
         
            +
            *   Move `ActiveRecord::StatementInvalid` SQL to error property and include binds as separate error property.
         
     | 
| 
       636 
624 
     | 
    
         | 
| 
       637 
     | 
    
         
            -
                 
     | 
| 
      
 625 
     | 
    
         
            +
                `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception_class` now requires `binds` to be passed as the last argument.
         
     | 
| 
       638 
626 
     | 
    
         | 
| 
       639 
     | 
    
         
            -
             
     | 
| 
      
 627 
     | 
    
         
            +
                `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception` now requires `message`, `sql`, and `binds` to be passed as keyword arguments.
         
     | 
| 
       640 
628 
     | 
    
         | 
| 
       641 
     | 
    
         
            -
                 
     | 
| 
      
 629 
     | 
    
         
            +
                Subclasses of `ActiveRecord::StatementInvalid` must now provide `sql:` and `binds:` arguments to `super`.
         
     | 
| 
       642 
630 
     | 
    
         | 
| 
       643 
     | 
    
         
            -
             
     | 
| 
      
 631 
     | 
    
         
            +
                Example:
         
     | 
| 
       644 
632 
     | 
    
         | 
| 
       645 
     | 
    
         
            -
                 
     | 
| 
      
 633 
     | 
    
         
            +
                ```
         
     | 
| 
      
 634 
     | 
    
         
            +
                class MySubclassedError < ActiveRecord::StatementInvalid
         
     | 
| 
      
 635 
     | 
    
         
            +
                  def initialize(message, sql:, binds:)
         
     | 
| 
      
 636 
     | 
    
         
            +
                    super(message, sql: sql, binds: binds)
         
     | 
| 
      
 637 
     | 
    
         
            +
                  end
         
     | 
| 
      
 638 
     | 
    
         
            +
                end
         
     | 
| 
      
 639 
     | 
    
         
            +
                ```
         
     | 
| 
       646 
640 
     | 
    
         | 
| 
       647 
     | 
    
         
            -
            * 
     | 
| 
      
 641 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       648 
642 
     | 
    
         | 
| 
       649 
     | 
    
         
            -
             
     | 
| 
      
 643 
     | 
    
         
            +
            *   Add an `:if_not_exists` option to `create_table`.
         
     | 
| 
       650 
644 
     | 
    
         | 
| 
       651 
     | 
    
         
            -
             
     | 
| 
      
 645 
     | 
    
         
            +
                Example:
         
     | 
| 
       652 
646 
     | 
    
         | 
| 
       653 
     | 
    
         
            -
             
     | 
| 
      
 647 
     | 
    
         
            +
                    create_table :posts, if_not_exists: true do |t|
         
     | 
| 
      
 648 
     | 
    
         
            +
                      t.string :title
         
     | 
| 
      
 649 
     | 
    
         
            +
                    end
         
     | 
| 
       654 
650 
     | 
    
         | 
| 
       655 
     | 
    
         
            -
             
     | 
| 
      
 651 
     | 
    
         
            +
                That would execute:
         
     | 
| 
       656 
652 
     | 
    
         | 
| 
       657 
     | 
    
         
            -
             
     | 
| 
      
 653 
     | 
    
         
            +
                    CREATE TABLE IF NOT EXISTS posts (
         
     | 
| 
      
 654 
     | 
    
         
            +
                      ...
         
     | 
| 
      
 655 
     | 
    
         
            +
                    )
         
     | 
| 
       658 
656 
     | 
    
         | 
| 
       659 
     | 
    
         
            -
             
     | 
| 
      
 657 
     | 
    
         
            +
                If the table already exists, `if_not_exists: false` (the default) raises an
         
     | 
| 
      
 658 
     | 
    
         
            +
                exception whereas `if_not_exists: true` does nothing.
         
     | 
| 
       660 
659 
     | 
    
         | 
| 
       661 
     | 
    
         
            -
                * 
     | 
| 
      
 660 
     | 
    
         
            +
                *fatkodima*, *Stefan Kanev*
         
     | 
| 
       662 
661 
     | 
    
         | 
| 
       663 
     | 
    
         
            -
            *    
     | 
| 
      
 662 
     | 
    
         
            +
            *   Defining an Enum as a Hash with blank key, or as an Array with a blank value, now raises an `ArgumentError`.
         
     | 
| 
       664 
663 
     | 
    
         | 
| 
       665 
     | 
    
         
            -
                * 
     | 
| 
      
 664 
     | 
    
         
            +
                *Christophe Maximin*
         
     | 
| 
       666 
665 
     | 
    
         | 
| 
       667 
     | 
    
         
            -
            *    
     | 
| 
      
 666 
     | 
    
         
            +
            *   Adds support for multiple databases to `rails db:schema:cache:dump` and `rails db:schema:cache:clear`.
         
     | 
| 
       668 
667 
     | 
    
         | 
| 
       669 
     | 
    
         
            -
                * 
     | 
| 
      
 668 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       670 
669 
     | 
    
         | 
| 
       671 
     | 
    
         
            -
            *    
     | 
| 
      
 670 
     | 
    
         
            +
            *   `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
         
     | 
| 
      
 671 
     | 
    
         
            +
                if the attribute does not exist.
         
     | 
| 
       672 
672 
     | 
    
         | 
| 
       673 
     | 
    
         
            -
                * 
     | 
| 
      
 673 
     | 
    
         
            +
                *Sean Griffin*
         
     | 
| 
       674 
674 
     | 
    
         | 
| 
       675 
     | 
    
         
            -
            *    
     | 
| 
       676 
     | 
    
         
            -
                ar_internal_metadata's data for a test database.
         
     | 
| 
      
 675 
     | 
    
         
            +
            *   Add support for hash and URL configs in database hash of `ActiveRecord::Base.connected_to`.
         
     | 
| 
       677 
676 
     | 
    
         | 
| 
       678 
     | 
    
         
            -
                 
     | 
| 
       679 
     | 
    
         
            -
                 
     | 
| 
       680 
     | 
    
         
            -
             
     | 
| 
       681 
     | 
    
         
            -
                 
     | 
| 
       682 
     | 
    
         
            -
                key|value|created_at|updated_at
         
     | 
| 
       683 
     | 
    
         
            -
                environment|development|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
         
     | 
| 
       684 
     | 
    
         
            -
                ```
         
     | 
| 
      
 677 
     | 
    
         
            +
                ````
         
     | 
| 
      
 678 
     | 
    
         
            +
                User.connected_to(database: { writing: "postgres://foo" }) do
         
     | 
| 
      
 679 
     | 
    
         
            +
                  User.create!(name: "Gannon")
         
     | 
| 
      
 680 
     | 
    
         
            +
                end
         
     | 
| 
       685 
681 
     | 
    
         | 
| 
       686 
     | 
    
         
            -
                 
     | 
| 
       687 
     | 
    
         
            -
                 
     | 
| 
       688 
     | 
    
         
            -
             
     | 
| 
       689 
     | 
    
         
            -
                 
     | 
| 
       690 
     | 
    
         
            -
                 
     | 
| 
       691 
     | 
    
         
            -
                environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
         
     | 
| 
       692 
     | 
    
         
            -
                ```
         
     | 
| 
      
 682 
     | 
    
         
            +
                config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
         
     | 
| 
      
 683 
     | 
    
         
            +
                User.connected_to(database: { reading: config }) do
         
     | 
| 
      
 684 
     | 
    
         
            +
                  User.count
         
     | 
| 
      
 685 
     | 
    
         
            +
                end
         
     | 
| 
      
 686 
     | 
    
         
            +
                ````
         
     | 
| 
       693 
687 
     | 
    
         | 
| 
       694 
     | 
    
         
            -
                 
     | 
| 
      
 688 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       695 
689 
     | 
    
         | 
| 
       696 
     | 
    
         
            -
             
     | 
| 
      
 690 
     | 
    
         
            +
            *   Support default expression for MySQL.
         
     | 
| 
       697 
691 
     | 
    
         | 
| 
       698 
     | 
    
         
            -
             
     | 
| 
      
 692 
     | 
    
         
            +
                MySQL 8.0.13 and higher supports default value to be a function or expression.
         
     | 
| 
       699 
693 
     | 
    
         | 
| 
       700 
     | 
    
         
            -
                 
     | 
| 
      
 694 
     | 
    
         
            +
                https://dev.mysql.com/doc/refman/8.0/en/create-table.html
         
     | 
| 
       701 
695 
     | 
    
         | 
| 
       702 
696 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       703 
697 
     | 
    
         | 
| 
       704 
     | 
    
         
            -
            *    
     | 
| 
       705 
     | 
    
         
            -
             
     | 
| 
       706 
     | 
    
         
            -
                Fixes #30894.
         
     | 
| 
       707 
     | 
    
         
            -
             
     | 
| 
       708 
     | 
    
         
            -
                *Ryuta Kamizono*
         
     | 
| 
      
 698 
     | 
    
         
            +
            *   Support expression indexes for MySQL.
         
     | 
| 
       709 
699 
     | 
    
         | 
| 
       710 
     | 
    
         
            -
             
     | 
| 
      
 700 
     | 
    
         
            +
                MySQL 8.0.13 and higher supports functional key parts that index
         
     | 
| 
      
 701 
     | 
    
         
            +
                expression values rather than column or column prefix values.
         
     | 
| 
       711 
702 
     | 
    
         | 
| 
       712 
     | 
    
         
            -
                 
     | 
| 
      
 703 
     | 
    
         
            +
                https://dev.mysql.com/doc/refman/8.0/en/create-index.html
         
     | 
| 
       713 
704 
     | 
    
         | 
| 
       714 
705 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       715 
706 
     | 
    
         | 
| 
       716 
     | 
    
         
            -
            *    
     | 
| 
       717 
     | 
    
         
            -
             
     | 
| 
       718 
     | 
    
         
            -
                PostgreSQL 9.1+ introduced range types, and Rails added support for using
         
     | 
| 
       719 
     | 
    
         
            -
                this datatype in Active Record. However, the serialization of
         
     | 
| 
       720 
     | 
    
         
            -
                `PostgreSQL::OID::Range` was incomplete, because it did not properly
         
     | 
| 
       721 
     | 
    
         
            -
                cast the bounds that make up the range. This led to subseconds being
         
     | 
| 
       722 
     | 
    
         
            -
                dropped in SQL commands:
         
     | 
| 
      
 707 
     | 
    
         
            +
            *   Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
         
     | 
| 
       723 
708 
     | 
    
         | 
| 
       724 
     | 
    
         
            -
                 
     | 
| 
      
 709 
     | 
    
         
            +
                Fixes #33056.
         
     | 
| 
       725 
710 
     | 
    
         | 
| 
       726 
     | 
    
         
            -
             
     | 
| 
       727 
     | 
    
         
            -
                    # => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
         
     | 
| 
      
 711 
     | 
    
         
            +
                *Federico Martinez*
         
     | 
| 
       728 
712 
     | 
    
         | 
| 
       729 
     | 
    
         
            -
             
     | 
| 
      
 713 
     | 
    
         
            +
            *   Add basic API for connection switching to support multiple databases.
         
     | 
| 
       730 
714 
     | 
    
         | 
| 
       731 
     | 
    
         
            -
             
     | 
| 
       732 
     | 
    
         
            -
                    # => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
         
     | 
| 
      
 715 
     | 
    
         
            +
                1) Adds a `connects_to` method for models to connect to multiple databases. Example:
         
     | 
| 
       733 
716 
     | 
    
         | 
| 
       734 
     | 
    
         
            -
                 
     | 
| 
      
 717 
     | 
    
         
            +
                ```
         
     | 
| 
      
 718 
     | 
    
         
            +
                class AnimalsModel < ApplicationRecord
         
     | 
| 
      
 719 
     | 
    
         
            +
                  self.abstract_class = true
         
     | 
| 
       735 
720 
     | 
    
         | 
| 
       736 
     | 
    
         
            -
             
     | 
| 
       737 
     | 
    
         
            -
                 
     | 
| 
      
 721 
     | 
    
         
            +
                  connects_to database: { writing: :animals_primary, reading: :animals_replica }
         
     | 
| 
      
 722 
     | 
    
         
            +
                end
         
     | 
| 
       738 
723 
     | 
    
         | 
| 
       739 
     | 
    
         
            -
                 
     | 
| 
      
 724 
     | 
    
         
            +
                class Dog < AnimalsModel
         
     | 
| 
      
 725 
     | 
    
         
            +
                  # connected to both the animals_primary db for writing and the animals_replica for reading
         
     | 
| 
      
 726 
     | 
    
         
            +
                end
         
     | 
| 
      
 727 
     | 
    
         
            +
                ```
         
     | 
| 
       740 
728 
     | 
    
         | 
| 
       741 
     | 
    
         
            -
             
     | 
| 
      
 729 
     | 
    
         
            +
                2) Adds a `connected_to` block method for switching connection roles or connecting to
         
     | 
| 
      
 730 
     | 
    
         
            +
                a database that the model didn't connect to. Connecting to the database in this block is
         
     | 
| 
      
 731 
     | 
    
         
            +
                useful when you have another defined connection, for example `slow_replica` that you don't
         
     | 
| 
      
 732 
     | 
    
         
            +
                want to connect to by default but need in the console, or a specific code block.
         
     | 
| 
       742 
733 
     | 
    
         | 
| 
       743 
     | 
    
         
            -
                 
     | 
| 
      
 734 
     | 
    
         
            +
                ```
         
     | 
| 
      
 735 
     | 
    
         
            +
                ActiveRecord::Base.connected_to(role: :reading) do
         
     | 
| 
      
 736 
     | 
    
         
            +
                  Dog.first # finds dog from replica connected to AnimalsBase
         
     | 
| 
      
 737 
     | 
    
         
            +
                  Book.first # doesn't have a reading connection, will raise an error
         
     | 
| 
      
 738 
     | 
    
         
            +
                end
         
     | 
| 
      
 739 
     | 
    
         
            +
                ```
         
     | 
| 
       744 
740 
     | 
    
         | 
| 
       745 
     | 
    
         
            -
                 
     | 
| 
      
 741 
     | 
    
         
            +
                ```
         
     | 
| 
      
 742 
     | 
    
         
            +
                ActiveRecord::Base.connected_to(database: :slow_replica) do
         
     | 
| 
      
 743 
     | 
    
         
            +
                  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
         
     | 
| 
      
 744 
     | 
    
         
            +
                end
         
     | 
| 
      
 745 
     | 
    
         
            +
                ```
         
     | 
| 
       746 
746 
     | 
    
         | 
| 
       747 
     | 
    
         
            -
            * 
     | 
| 
       748 
     | 
    
         
            -
                more descriptive.
         
     | 
| 
      
 747 
     | 
    
         
            +
                *Eileen M. Uchitelle*
         
     | 
| 
       749 
748 
     | 
    
         | 
| 
       750 
     | 
    
         
            -
             
     | 
| 
      
 749 
     | 
    
         
            +
            *   Enum raises on invalid definition values
         
     | 
| 
       751 
750 
     | 
    
         | 
| 
       752 
     | 
    
         
            -
                 
     | 
| 
      
 751 
     | 
    
         
            +
                When defining a Hash enum it can be easy to use `[]` instead of `{}`. This
         
     | 
| 
      
 752 
     | 
    
         
            +
                commit checks that only valid definition values are provided, those can
         
     | 
| 
      
 753 
     | 
    
         
            +
                be a Hash, an array of Symbols or an array of Strings. Otherwise it
         
     | 
| 
      
 754 
     | 
    
         
            +
                raises an `ArgumentError`.
         
     | 
| 
       753 
755 
     | 
    
         | 
| 
       754 
     | 
    
         
            -
             
     | 
| 
       755 
     | 
    
         
            -
                when lock wait timeout exceeded.
         
     | 
| 
      
 756 
     | 
    
         
            +
                Fixes #33961
         
     | 
| 
       756 
757 
     | 
    
         | 
| 
       757 
     | 
    
         
            -
                * 
     | 
| 
      
 758 
     | 
    
         
            +
                *Alberto Almagro*
         
     | 
| 
       758 
759 
     | 
    
         | 
| 
       759 
     | 
    
         
            -
            *    
     | 
| 
      
 760 
     | 
    
         
            +
            *   Reloading associations now clears the Query Cache like `Persistence#reload` does.
         
     | 
| 
       760 
761 
     | 
    
         | 
| 
       761 
     | 
    
         
            -
                 
     | 
| 
      
 762 
     | 
    
         
            +
                ```
         
     | 
| 
      
 763 
     | 
    
         
            +
                class Post < ActiveRecord::Base
         
     | 
| 
      
 764 
     | 
    
         
            +
                  has_one :category
         
     | 
| 
      
 765 
     | 
    
         
            +
                  belongs_to :author
         
     | 
| 
      
 766 
     | 
    
         
            +
                  has_many :comments
         
     | 
| 
      
 767 
     | 
    
         
            +
                end
         
     | 
| 
       762 
768 
     | 
    
         | 
| 
       763 
     | 
    
         
            -
             
     | 
| 
      
 769 
     | 
    
         
            +
                # Each of the following will now clear the query cache.
         
     | 
| 
      
 770 
     | 
    
         
            +
                post.reload_category
         
     | 
| 
      
 771 
     | 
    
         
            +
                post.reload_author
         
     | 
| 
      
 772 
     | 
    
         
            +
                post.comments.reload
         
     | 
| 
      
 773 
     | 
    
         
            +
                ```
         
     | 
| 
       764 
774 
     | 
    
         | 
| 
       765 
     | 
    
         
            -
                * 
     | 
| 
      
 775 
     | 
    
         
            +
                *Christophe Maximin*
         
     | 
| 
       766 
776 
     | 
    
         | 
| 
       767 
     | 
    
         
            -
            *    
     | 
| 
      
 777 
     | 
    
         
            +
            *   Added `index` option for `change_table` migration helpers.
         
     | 
| 
      
 778 
     | 
    
         
            +
                With this change you can create indexes while adding new
         
     | 
| 
      
 779 
     | 
    
         
            +
                columns into the existing tables.
         
     | 
| 
       768 
780 
     | 
    
         | 
| 
       769 
     | 
    
         
            -
                 
     | 
| 
      
 781 
     | 
    
         
            +
                Example:
         
     | 
| 
       770 
782 
     | 
    
         | 
| 
       771 
     | 
    
         
            -
             
     | 
| 
      
 783 
     | 
    
         
            +
                    change_table(:languages) do |t|
         
     | 
| 
      
 784 
     | 
    
         
            +
                      t.string :country_code, index: true
         
     | 
| 
      
 785 
     | 
    
         
            +
                    end
         
     | 
| 
       772 
786 
     | 
    
         | 
| 
       773 
     | 
    
         
            -
            * 
     | 
| 
      
 787 
     | 
    
         
            +
                *Mehmet Emin İNAÇ*
         
     | 
| 
       774 
788 
     | 
    
         | 
| 
       775 
     | 
    
         
            -
             
     | 
| 
      
 789 
     | 
    
         
            +
            *   Fix `transaction` reverting for migrations.
         
     | 
| 
       776 
790 
     | 
    
         | 
| 
       777 
     | 
    
         
            -
             
     | 
| 
      
 791 
     | 
    
         
            +
                Before: Commands inside a `transaction` in a reverted migration ran uninverted.
         
     | 
| 
      
 792 
     | 
    
         
            +
                Now: This change fixes that by reverting commands inside `transaction` block.
         
     | 
| 
       778 
793 
     | 
    
         | 
| 
       779 
     | 
    
         
            -
                * 
     | 
| 
      
 794 
     | 
    
         
            +
                *fatkodima*, *David Verhasselt*
         
     | 
| 
       780 
795 
     | 
    
         | 
| 
       781 
     | 
    
         
            -
            *    
     | 
| 
       782 
     | 
    
         
            -
                `references` only, as `references` can be implicitly called by `where`.
         
     | 
| 
      
 796 
     | 
    
         
            +
            *   Raise an error instead of scanning the filesystem root when `fixture_path` is blank.
         
     | 
| 
       783 
797 
     | 
    
         | 
| 
       784 
     | 
    
         
            -
                 
     | 
| 
      
 798 
     | 
    
         
            +
                *Gannon McGibbon*, *Max Albrecht*
         
     | 
| 
       785 
799 
     | 
    
         | 
| 
       786 
     | 
    
         
            -
             
     | 
| 
      
 800 
     | 
    
         
            +
            *   Allow `ActiveRecord::Base.configurations=` to be set with a symbolized hash.
         
     | 
| 
       787 
801 
     | 
    
         | 
| 
       788 
     | 
    
         
            -
            * 
     | 
| 
       789 
     | 
    
         
            -
                need to generate it, it can be created with `rails g application_record`.
         
     | 
| 
      
 802 
     | 
    
         
            +
                *Gannon McGibbon*
         
     | 
| 
       790 
803 
     | 
    
         | 
| 
       791 
     | 
    
         
            -
             
     | 
| 
      
 804 
     | 
    
         
            +
            *   Don't update counter cache unless the record is actually saved.
         
     | 
| 
       792 
805 
     | 
    
         | 
| 
       793 
     | 
    
         
            -
             
     | 
| 
      
 806 
     | 
    
         
            +
                Fixes #31493, #33113, #33117.
         
     | 
| 
       794 
807 
     | 
    
         | 
| 
       795 
808 
     | 
    
         
             
                *Ryuta Kamizono*
         
     | 
| 
       796 
809 
     | 
    
         | 
| 
       797 
     | 
    
         
            -
            *    
     | 
| 
       798 
     | 
    
         
            -
                `destroyed_by_association` will now be set to the reflection, matching the
         
     | 
| 
       799 
     | 
    
         
            -
                behaviour of `has_many` associations.
         
     | 
| 
      
 810 
     | 
    
         
            +
            *   Deprecate `ActiveRecord::Result#to_hash` in favor of `ActiveRecord::Result#to_a`.
         
     | 
| 
       800 
811 
     | 
    
         | 
| 
       801 
     | 
    
         
            -
                * 
     | 
| 
      
 812 
     | 
    
         
            +
                *Gannon McGibbon*, *Kevin Cheng*
         
     | 
| 
       802 
813 
     | 
    
         | 
| 
       803 
     | 
    
         
            -
            *    
     | 
| 
       804 
     | 
    
         
            -
             
     | 
| 
       805 
     | 
    
         
            -
                When the `where` is called on a relation after a `or`, unscoping the column of that later `where` removed
         
     | 
| 
       806 
     | 
    
         
            -
                bind values used by the `or` instead. (possibly other cases too)
         
     | 
| 
      
 814 
     | 
    
         
            +
            *   SQLite3 adapter supports expression indexes.
         
     | 
| 
       807 
815 
     | 
    
         | 
| 
       808 
816 
     | 
    
         
             
                ```
         
     | 
| 
       809 
     | 
    
         
            -
                 
     | 
| 
       810 
     | 
    
         
            -
             
     | 
| 
       811 
     | 
    
         
            -
                 
     | 
| 
       812 
     | 
    
         
            -
             
     | 
| 
       813 
     | 
    
         
            -
                 
     | 
| 
      
 817 
     | 
    
         
            +
                create_table :users do |t|
         
     | 
| 
      
 818 
     | 
    
         
            +
                  t.string :email
         
     | 
| 
      
 819 
     | 
    
         
            +
                end
         
     | 
| 
      
 820 
     | 
    
         
            +
             
     | 
| 
      
 821 
     | 
    
         
            +
                add_index :users, 'lower(email)', name: 'index_users_on_email', unique: true
         
     | 
| 
       814 
822 
     | 
    
         
             
                ```
         
     | 
| 
       815 
823 
     | 
    
         | 
| 
       816 
     | 
    
         
            -
                * 
     | 
| 
      
 824 
     | 
    
         
            +
                *Gray Kemmey*
         
     | 
| 
       817 
825 
     | 
    
         | 
| 
       818 
     | 
    
         
            -
            *    
     | 
| 
       819 
     | 
    
         
            -
                post-type-cast value for rendering in single-field form inputs.
         
     | 
| 
      
 826 
     | 
    
         
            +
            *   Allow subclasses to redefine autosave callbacks for associated records.
         
     | 
| 
       820 
827 
     | 
    
         | 
| 
       821 
     | 
    
         
            -
                 
     | 
| 
      
 828 
     | 
    
         
            +
                Fixes #33305.
         
     | 
| 
       822 
829 
     | 
    
         | 
| 
       823 
     | 
    
         
            -
            * 
     | 
| 
       824 
     | 
    
         
            -
                `current_scope`, with the exception of `unscoped`.
         
     | 
| 
      
 830 
     | 
    
         
            +
                *Andrey Subbota*
         
     | 
| 
       825 
831 
     | 
    
         | 
| 
       826 
     | 
    
         
            -
             
     | 
| 
      
 832 
     | 
    
         
            +
            *   Bump minimum MySQL version to 5.5.8.
         
     | 
| 
       827 
833 
     | 
    
         | 
| 
       828 
     | 
    
         
            -
                * 
     | 
| 
      
 834 
     | 
    
         
            +
                *Yasuo Honda*
         
     | 
| 
       829 
835 
     | 
    
         | 
| 
       830 
     | 
    
         
            -
            *    
     | 
| 
      
 836 
     | 
    
         
            +
            *   Use MySQL utf8mb4 character set by default.
         
     | 
| 
       831 
837 
     | 
    
         | 
| 
       832 
     | 
    
         
            -
                 
     | 
| 
       833 
     | 
    
         
            -
                 
     | 
| 
      
 838 
     | 
    
         
            +
                `utf8mb4` character set with 4-Byte encoding supports supplementary characters including emoji.
         
     | 
| 
      
 839 
     | 
    
         
            +
                The previous default 3-Byte encoding character set `utf8` is not enough to support them.
         
     | 
| 
       834 
840 
     | 
    
         | 
| 
       835 
     | 
    
         
            -
                 
     | 
| 
       836 
     | 
    
         
            -
                for SQLite databases, so it's implemented behind a configuration flag
         
     | 
| 
       837 
     | 
    
         
            -
                whose default false value is deprecated.
         
     | 
| 
      
 841 
     | 
    
         
            +
                *Yasuo Honda*
         
     | 
| 
       838 
842 
     | 
    
         | 
| 
       839 
     | 
    
         
            -
             
     | 
| 
      
 843 
     | 
    
         
            +
            *   Fix duplicated record creation when using nested attributes with `create_with`.
         
     | 
| 
       840 
844 
     | 
    
         | 
| 
       841 
     | 
    
         
            -
            * 
     | 
| 
       842 
     | 
    
         
            -
                `in_batches`).
         
     | 
| 
      
 845 
     | 
    
         
            +
                *Darwin Wu*
         
     | 
| 
       843 
846 
     | 
    
         | 
| 
       844 
     | 
    
         
            -
             
     | 
| 
       845 
     | 
    
         
            -
                 
     | 
| 
      
 847 
     | 
    
         
            +
            *   Configuration item `config.filter_parameters` could also filter out
         
     | 
| 
      
 848 
     | 
    
         
            +
                sensitive values of database columns when calling `#inspect`.
         
     | 
| 
      
 849 
     | 
    
         
            +
                We also added `ActiveRecord::Base::filter_attributes`/`=` in order to
         
     | 
| 
      
 850 
     | 
    
         
            +
                specify sensitive attributes to specific model.
         
     | 
| 
       846 
851 
     | 
    
         | 
| 
       847 
     | 
    
         
            -
                 
     | 
| 
      
 852 
     | 
    
         
            +
                ```
         
     | 
| 
      
 853 
     | 
    
         
            +
                Rails.application.config.filter_parameters += [:credit_card_number, /phone/]
         
     | 
| 
      
 854 
     | 
    
         
            +
                Account.last.inspect # => #<Account id: 123, name: "DHH", credit_card_number: [FILTERED], telephone_number: [FILTERED] ...>
         
     | 
| 
      
 855 
     | 
    
         
            +
                SecureAccount.filter_attributes += [:name]
         
     | 
| 
      
 856 
     | 
    
         
            +
                SecureAccount.last.inspect # => #<SecureAccount id: 42, name: [FILTERED], credit_card_number: [FILTERED] ...>
         
     | 
| 
      
 857 
     | 
    
         
            +
                ```
         
     | 
| 
       848 
858 
     | 
    
         | 
| 
       849 
     | 
    
         
            -
            * 
     | 
| 
       850 
     | 
    
         
            -
                `ActiveRecord::StatementInvalid` exceptions.
         
     | 
| 
      
 859 
     | 
    
         
            +
                *Zhang Kang*, *Yoshiyuki Kinjo*
         
     | 
| 
       851 
860 
     | 
    
         | 
| 
       852 
     | 
    
         
            -
             
     | 
| 
      
 861 
     | 
    
         
            +
            *   Deprecate `column_name_length`, `table_name_length`, `columns_per_table`,
         
     | 
| 
      
 862 
     | 
    
         
            +
                `indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
         
     | 
| 
      
 863 
     | 
    
         
            +
                and `joins_per_query` methods in `DatabaseLimits`.
         
     | 
| 
       853 
864 
     | 
    
         | 
| 
       854 
     | 
    
         
            -
            * 
     | 
| 
      
 865 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       855 
866 
     | 
    
         | 
| 
       856 
     | 
    
         
            -
             
     | 
| 
      
 867 
     | 
    
         
            +
            *   `ActiveRecord::Base.configurations` now returns an object.
         
     | 
| 
       857 
868 
     | 
    
         | 
| 
       858 
     | 
    
         
            -
                 
     | 
| 
      
 869 
     | 
    
         
            +
                `ActiveRecord::Base.configurations` used to return a hash, but this
         
     | 
| 
      
 870 
     | 
    
         
            +
                is an inflexible data model. In order to improve multiple-database
         
     | 
| 
      
 871 
     | 
    
         
            +
                handling in Rails, we've changed this to return an object. Some methods
         
     | 
| 
      
 872 
     | 
    
         
            +
                are provided to make the object behave hash-like in order to ease the
         
     | 
| 
      
 873 
     | 
    
         
            +
                transition process. Since most applications don't manipulate the hash
         
     | 
| 
      
 874 
     | 
    
         
            +
                we've decided to add backwards-compatible functionality that will throw
         
     | 
| 
      
 875 
     | 
    
         
            +
                a deprecation warning if used, however calling `ActiveRecord::Base.configurations`
         
     | 
| 
      
 876 
     | 
    
         
            +
                will use the new version internally and externally.
         
     | 
| 
       859 
877 
     | 
    
         | 
| 
       860 
     | 
    
         
            -
             
     | 
| 
      
 878 
     | 
    
         
            +
                For example, the following `database.yml`:
         
     | 
| 
       861 
879 
     | 
    
         | 
| 
       862 
     | 
    
         
            -
                 
     | 
| 
       863 
     | 
    
         
            -
                 
     | 
| 
      
 880 
     | 
    
         
            +
                ```
         
     | 
| 
      
 881 
     | 
    
         
            +
                development:
         
     | 
| 
      
 882 
     | 
    
         
            +
                  adapter: sqlite3
         
     | 
| 
      
 883 
     | 
    
         
            +
                  database: db/development.sqlite3
         
     | 
| 
      
 884 
     | 
    
         
            +
                ```
         
     | 
| 
       864 
885 
     | 
    
         | 
| 
       865 
     | 
    
         
            -
                 
     | 
| 
       866 
     | 
    
         
            -
                parent transaction is rolledback. This will correctly mark records from the inner transaction as not persisted.
         
     | 
| 
      
 886 
     | 
    
         
            +
                Used to become a hash:
         
     | 
| 
       867 
887 
     | 
    
         | 
| 
       868 
     | 
    
         
            -
                 
     | 
| 
      
 888 
     | 
    
         
            +
                ```
         
     | 
| 
      
 889 
     | 
    
         
            +
                { "development" => { "adapter" => "sqlite3", "database" => "db/development.sqlite3" } }
         
     | 
| 
      
 890 
     | 
    
         
            +
                ```
         
     | 
| 
      
 891 
     | 
    
         
            +
             
     | 
| 
      
 892 
     | 
    
         
            +
                Is now converted into the following object:
         
     | 
| 
       869 
893 
     | 
    
         | 
| 
       870 
     | 
    
         
            -
             
     | 
| 
      
 894 
     | 
    
         
            +
                ```
         
     | 
| 
      
 895 
     | 
    
         
            +
                #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
         
     | 
| 
      
 896 
     | 
    
         
            +
                  #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
         
     | 
| 
      
 897 
     | 
    
         
            +
                    @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
         
     | 
| 
      
 898 
     | 
    
         
            +
                  ]
         
     | 
| 
      
 899 
     | 
    
         
            +
                ```
         
     | 
| 
       871 
900 
     | 
    
         | 
| 
       872 
     | 
    
         
            -
                 
     | 
| 
       873 
     | 
    
         
            -
                 
     | 
| 
       874 
     | 
    
         
            -
                 
     | 
| 
      
 901 
     | 
    
         
            +
                Iterating over the database configurations has also changed. Instead of
         
     | 
| 
      
 902 
     | 
    
         
            +
                calling hash methods on the `configurations` hash directly, a new method `configs_for` has
         
     | 
| 
      
 903 
     | 
    
         
            +
                been provided that allows you to select the correct configuration. `env_name` and
         
     | 
| 
      
 904 
     | 
    
         
            +
                `spec_name` arguments are optional. For example, these return an array of
         
     | 
| 
      
 905 
     | 
    
         
            +
                database config objects for the requested environment and a single database config object
         
     | 
| 
      
 906 
     | 
    
         
            +
                will be returned for the requested environment and specification name respectively.
         
     | 
| 
       875 
907 
     | 
    
         | 
| 
       876 
     | 
    
         
            -
                 
     | 
| 
      
 908 
     | 
    
         
            +
                ```
         
     | 
| 
      
 909 
     | 
    
         
            +
                ActiveRecord::Base.configurations.configs_for(env_name: "development")
         
     | 
| 
      
 910 
     | 
    
         
            +
                ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
         
     | 
| 
      
 911 
     | 
    
         
            +
                ```
         
     | 
| 
       877 
912 
     | 
    
         | 
| 
       878 
     | 
    
         
            -
            * 
     | 
| 
      
 913 
     | 
    
         
            +
                *Eileen M. Uchitelle*, *Aaron Patterson*
         
     | 
| 
       879 
914 
     | 
    
         | 
| 
       880 
     | 
    
         
            -
             
     | 
| 
      
 915 
     | 
    
         
            +
            *   Add database configuration to disable advisory locks.
         
     | 
| 
       881 
916 
     | 
    
         | 
| 
       882 
     | 
    
         
            -
             
     | 
| 
       883 
     | 
    
         
            -
                 
     | 
| 
      
 917 
     | 
    
         
            +
                ```
         
     | 
| 
      
 918 
     | 
    
         
            +
                production:
         
     | 
| 
      
 919 
     | 
    
         
            +
                  adapter: postgresql
         
     | 
| 
      
 920 
     | 
    
         
            +
                  advisory_locks: false
         
     | 
| 
      
 921 
     | 
    
         
            +
                ```
         
     | 
| 
       884 
922 
     | 
    
         | 
| 
       885 
     | 
    
         
            -
                * 
     | 
| 
      
 923 
     | 
    
         
            +
                *Guo Xiang*
         
     | 
| 
       886 
924 
     | 
    
         | 
| 
       887 
     | 
    
         
            -
            *    
     | 
| 
       888 
     | 
    
         
            -
                if the child records were deleted before the parent was saved, they would
         
     | 
| 
       889 
     | 
    
         
            -
                still be persisted. Now, if child records are deleted before the parent is saved
         
     | 
| 
       890 
     | 
    
         
            -
                on a `has_many :through` association, the child records will not be persisted.
         
     | 
| 
      
 925 
     | 
    
         
            +
            *   SQLite3 adapter `alter_table` method restores foreign keys.
         
     | 
| 
       891 
926 
     | 
    
         | 
| 
       892 
     | 
    
         
            -
                * 
     | 
| 
      
 927 
     | 
    
         
            +
                *Yasuo Honda*
         
     | 
| 
       893 
928 
     | 
    
         | 
| 
       894 
     | 
    
         
            -
            *    
     | 
| 
       895 
     | 
    
         
            -
                the merged relation into LEFT OUTER JOIN.
         
     | 
| 
      
 929 
     | 
    
         
            +
            *   Allow `:to_table` option to `invert_remove_foreign_key`.
         
     | 
| 
       896 
930 
     | 
    
         | 
| 
       897 
931 
     | 
    
         
             
                Example:
         
     | 
| 
       898 
932 
     | 
    
         | 
| 
       899 
     | 
    
         
            -
             
     | 
| 
       900 
     | 
    
         
            -
                Author.joins(:posts).merge(Post.joins(:comments))
         
     | 
| 
       901 
     | 
    
         
            -
                # Before the change:
         
     | 
| 
       902 
     | 
    
         
            -
                #=> SELECT ... FROM authors INNER JOIN posts ON ... LEFT OUTER JOIN comments ON...
         
     | 
| 
      
 933 
     | 
    
         
            +
                   remove_foreign_key :accounts, to_table: :owners
         
     | 
| 
       903 
934 
     | 
    
         | 
| 
       904 
     | 
    
         
            -
                 
     | 
| 
       905 
     | 
    
         
            -
                #=> SELECT ... FROM authors INNER JOIN posts ON ... INNER JOIN comments ON...
         
     | 
| 
       906 
     | 
    
         
            -
                ```
         
     | 
| 
      
 935 
     | 
    
         
            +
                *Nikolay Epifanov*, *Rich Chen*
         
     | 
| 
       907 
936 
     | 
    
         | 
| 
       908 
     | 
    
         
            -
             
     | 
| 
      
 937 
     | 
    
         
            +
            *   Add environment & load_config dependency to `bin/rake db:seed` to enable
         
     | 
| 
      
 938 
     | 
    
         
            +
                seed load in environments without Rails and custom DB configuration
         
     | 
| 
       909 
939 
     | 
    
         | 
| 
       910 
     | 
    
         
            -
            * 
     | 
| 
       911 
     | 
    
         
            -
                `locking_column`, without default value, is null in the database.
         
     | 
| 
      
 940 
     | 
    
         
            +
                *Tobias Bielohlawek*
         
     | 
| 
       912 
941 
     | 
    
         | 
| 
       913 
     | 
    
         
            -
             
     | 
| 
      
 942 
     | 
    
         
            +
            *   Fix default value for mysql time types with specified precision.
         
     | 
| 
      
 943 
     | 
    
         
            +
             
     | 
| 
      
 944 
     | 
    
         
            +
                *Nikolay Kondratyev*
         
     | 
| 
       914 
945 
     | 
    
         | 
| 
       915 
     | 
    
         
            -
            *   Fix  
     | 
| 
       916 
     | 
    
         
            -
                `locking_column` is null in the database.
         
     | 
| 
      
 946 
     | 
    
         
            +
            *   Fix `touch` option to behave consistently with `Persistence#touch` method.
         
     | 
| 
       917 
947 
     | 
    
         | 
| 
       918 
     | 
    
         
            -
                * 
     | 
| 
      
 948 
     | 
    
         
            +
                *Ryuta Kamizono*
         
     | 
| 
       919 
949 
     | 
    
         | 
| 
       920 
     | 
    
         
            -
            *    
     | 
| 
      
 950 
     | 
    
         
            +
            *   Migrations raise when duplicate column definition.
         
     | 
| 
       921 
951 
     | 
    
         | 
| 
       922 
     | 
    
         
            -
                 
     | 
| 
      
 952 
     | 
    
         
            +
                Fixes #33024.
         
     | 
| 
       923 
953 
     | 
    
         | 
| 
       924 
     | 
    
         
            -
            * 
     | 
| 
      
 954 
     | 
    
         
            +
                *Federico Martinez*
         
     | 
| 
       925 
955 
     | 
    
         | 
| 
       926 
     | 
    
         
            -
             
     | 
| 
      
 956 
     | 
    
         
            +
            *   Bump minimum SQLite version to 3.8
         
     | 
| 
       927 
957 
     | 
    
         | 
| 
       928 
     | 
    
         
            -
            * 
     | 
| 
      
 958 
     | 
    
         
            +
                *Yasuo Honda*
         
     | 
| 
       929 
959 
     | 
    
         | 
| 
       930 
     | 
    
         
            -
             
     | 
| 
      
 960 
     | 
    
         
            +
            *   Fix parent record should not get saved with duplicate children records.
         
     | 
| 
       931 
961 
     | 
    
         | 
| 
       932 
     | 
    
         
            -
             
     | 
| 
      
 962 
     | 
    
         
            +
                Fixes #32940.
         
     | 
| 
       933 
963 
     | 
    
         | 
| 
       934 
     | 
    
         
            -
                 
     | 
| 
      
 964 
     | 
    
         
            +
                *Santosh Wadghule*
         
     | 
| 
       935 
965 
     | 
    
         | 
| 
       936 
     | 
    
         
            -
             
     | 
| 
      
 966 
     | 
    
         
            +
            *   Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
         
     | 
| 
       937 
967 
     | 
    
         | 
| 
       938 
     | 
    
         
            -
            * 
     | 
| 
       939 
     | 
    
         
            -
                in `ActiveSupport::Cache`. This also means that `ActiveRecord::Base#cache_key` will now return a stable key
         
     | 
| 
       940 
     | 
    
         
            -
                that does not include a timestamp any more.
         
     | 
| 
      
 968 
     | 
    
         
            +
                *Brian Durand*
         
     | 
| 
       941 
969 
     | 
    
         | 
| 
       942 
     | 
    
         
            -
             
     | 
| 
       943 
     | 
    
         
            -
                 
     | 
| 
      
 970 
     | 
    
         
            +
            *   Ensure `Associations::CollectionAssociation#size` and `Associations::CollectionAssociation#empty?`
         
     | 
| 
      
 971 
     | 
    
         
            +
                use loaded association ids if present.
         
     | 
| 
       944 
972 
     | 
    
         | 
| 
       945 
     | 
    
         
            -
                * 
     | 
| 
      
 973 
     | 
    
         
            +
                *Graham Turner*
         
     | 
| 
       946 
974 
     | 
    
         | 
| 
       947 
     | 
    
         
            -
            *    
     | 
| 
      
 975 
     | 
    
         
            +
            *   Add support to preload associations of polymorphic associations when not all the records have the requested associations.
         
     | 
| 
       948 
976 
     | 
    
         | 
| 
       949 
     | 
    
         
            -
                * 
     | 
| 
      
 977 
     | 
    
         
            +
                *Dana Sherson*
         
     | 
| 
       950 
978 
     | 
    
         | 
| 
       951 
     | 
    
         
            -
            *   Add  
     | 
| 
      
 979 
     | 
    
         
            +
            *   Add `touch_all` method to `ActiveRecord::Relation`.
         
     | 
| 
       952 
980 
     | 
    
         | 
| 
       953 
     | 
    
         
            -
                 
     | 
| 
      
 981 
     | 
    
         
            +
                Example:
         
     | 
| 
       954 
982 
     | 
    
         | 
| 
       955 
     | 
    
         
            -
             
     | 
| 
      
 983 
     | 
    
         
            +
                    Person.where(name: "David").touch_all(time: Time.new(2020, 5, 16, 0, 0, 0))
         
     | 
| 
       956 
984 
     | 
    
         | 
| 
       957 
     | 
    
         
            -
            * 
     | 
| 
      
 985 
     | 
    
         
            +
                *fatkodima*, *duggiefresh*
         
     | 
| 
       958 
986 
     | 
    
         | 
| 
       959 
     | 
    
         
            -
             
     | 
| 
      
 987 
     | 
    
         
            +
            *   Add `ActiveRecord::Base.base_class?` predicate.
         
     | 
| 
       960 
988 
     | 
    
         | 
| 
       961 
     | 
    
         
            -
            * 
     | 
| 
       962 
     | 
    
         
            -
                when the current migration does not exist.
         
     | 
| 
      
 989 
     | 
    
         
            +
                *Bogdan Gusiev*
         
     | 
| 
       963 
990 
     | 
    
         | 
| 
       964 
     | 
    
         
            -
             
     | 
| 
      
 991 
     | 
    
         
            +
            *   Add custom prefix/suffix options to `ActiveRecord::Store.store_accessor`.
         
     | 
| 
       965 
992 
     | 
    
         | 
| 
       966 
     | 
    
         
            -
            * 
     | 
| 
      
 993 
     | 
    
         
            +
                *Tan Huynh*, *Yukio Mizuta*
         
     | 
| 
       967 
994 
     | 
    
         | 
| 
       968 
     | 
    
         
            -
             
     | 
| 
      
 995 
     | 
    
         
            +
            *   Rails 6 requires Ruby 2.5.0 or newer.
         
     | 
| 
       969 
996 
     | 
    
         | 
| 
       970 
     | 
    
         
            -
            * 
     | 
| 
      
 997 
     | 
    
         
            +
                *Jeremy Daer*, *Kasper Timm Hansen*
         
     | 
| 
       971 
998 
     | 
    
         | 
| 
       972 
     | 
    
         
            -
             
     | 
| 
       973 
     | 
    
         
            -
                See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
         
     | 
| 
      
 999 
     | 
    
         
            +
            *   Deprecate `update_attributes`/`!` in favor of `update`/`!`.
         
     | 
| 
       974 
1000 
     | 
    
         | 
| 
       975 
     | 
    
         
            -
                * 
     | 
| 
      
 1001 
     | 
    
         
            +
                *Eddie Lebow*
         
     | 
| 
       976 
1002 
     | 
    
         | 
| 
       977 
     | 
    
         
            -
            *    
     | 
| 
      
 1003 
     | 
    
         
            +
            *   Add `ActiveRecord::Base.create_or_find_by`/`!` to deal with the SELECT/INSERT race condition in
         
     | 
| 
      
 1004 
     | 
    
         
            +
                `ActiveRecord::Base.find_or_create_by`/`!` by leaning on unique constraints in the database.
         
     | 
| 
       978 
1005 
     | 
    
         | 
| 
       979 
     | 
    
         
            -
                * 
     | 
| 
      
 1006 
     | 
    
         
            +
                *DHH*
         
     | 
| 
       980 
1007 
     | 
    
         | 
| 
       981 
     | 
    
         
            -
            *    
     | 
| 
       982 
     | 
    
         
            -
                Previously this method always returned an empty array.
         
     | 
| 
      
 1008 
     | 
    
         
            +
            *   Add `Relation#pick` as short-hand for single-value plucks.
         
     | 
| 
       983 
1009 
     | 
    
         | 
| 
       984 
     | 
    
         
            -
                * 
     | 
| 
      
 1010 
     | 
    
         
            +
                *DHH*
         
     | 
| 
       985 
1011 
     | 
    
         | 
| 
       986 
1012 
     | 
    
         | 
| 
       987 
     | 
    
         
            -
            Please check [5- 
     | 
| 
      
 1013 
     | 
    
         
            +
            Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activerecord/CHANGELOG.md) for previous changes.
         
     |