activerecord 5.2.8.1 → 6.1.6.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1255 -596
- data/MIT-LICENSE +3 -1
- data/README.rdoc +7 -5
- data/examples/performance.rb +1 -1
- data/lib/active_record/aggregations.rb +9 -8
- data/lib/active_record/association_relation.rb +30 -10
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +100 -41
- data/lib/active_record/associations/association_scope.rb +23 -21
- data/lib/active_record/associations/belongs_to_association.rb +55 -48
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +7 -6
- data/lib/active_record/associations/builder/association.rb +45 -22
- data/lib/active_record/associations/builder/belongs_to.rb +29 -59
- data/lib/active_record/associations/builder/collection_association.rb +8 -17
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -41
- data/lib/active_record/associations/builder/has_many.rb +8 -2
- data/lib/active_record/associations/builder/has_one.rb +33 -2
- data/lib/active_record/associations/builder/singular_association.rb +3 -1
- data/lib/active_record/associations/collection_association.rb +44 -34
- data/lib/active_record/associations/collection_proxy.rb +25 -21
- data/lib/active_record/associations/foreign_association.rb +20 -0
- data/lib/active_record/associations/has_many_association.rb +26 -13
- data/lib/active_record/associations/has_many_through_association.rb +24 -18
- data/lib/active_record/associations/has_one_association.rb +43 -31
- data/lib/active_record/associations/has_one_through_association.rb +5 -5
- data/lib/active_record/associations/join_dependency/join_association.rb +44 -22
- data/lib/active_record/associations/join_dependency/join_part.rb +5 -5
- data/lib/active_record/associations/join_dependency.rb +91 -60
- data/lib/active_record/associations/preloader/association.rb +69 -43
- data/lib/active_record/associations/preloader/through_association.rb +49 -40
- data/lib/active_record/associations/preloader.rb +47 -34
- data/lib/active_record/associations/singular_association.rb +3 -17
- data/lib/active_record/associations/through_association.rb +1 -1
- data/lib/active_record/associations.rb +137 -25
- data/lib/active_record/attribute_assignment.rb +17 -19
- data/lib/active_record/attribute_methods/before_type_cast.rb +13 -7
- data/lib/active_record/attribute_methods/dirty.rb +101 -40
- data/lib/active_record/attribute_methods/primary_key.rb +20 -25
- data/lib/active_record/attribute_methods/query.rb +4 -8
- data/lib/active_record/attribute_methods/read.rb +14 -56
- data/lib/active_record/attribute_methods/serialization.rb +12 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -15
- data/lib/active_record/attribute_methods/write.rb +18 -34
- data/lib/active_record/attribute_methods.rb +81 -143
- data/lib/active_record/attributes.rb +46 -9
- data/lib/active_record/autosave_association.rb +57 -42
- data/lib/active_record/base.rb +4 -17
- data/lib/active_record/callbacks.rb +158 -43
- data/lib/active_record/coders/yaml_column.rb +1 -2
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +272 -130
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -36
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +167 -146
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +18 -14
- data/lib/active_record/connection_adapters/abstract/quoting.rb +98 -47
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -110
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +211 -90
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +2 -4
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +385 -144
- data/lib/active_record/connection_adapters/abstract/transaction.rb +167 -69
- data/lib/active_record/connection_adapters/abstract_adapter.rb +229 -99
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +243 -275
- data/lib/active_record/connection_adapters/column.rb +30 -12
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +88 -32
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/quoting.rb +59 -7
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +34 -10
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +48 -32
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +18 -7
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +142 -19
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +14 -9
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +53 -18
- data/lib/active_record/connection_adapters/pool_config.rb +73 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +37 -28
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +40 -54
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +3 -4
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +3 -4
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +25 -7
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.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 +15 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +47 -10
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +19 -4
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +120 -100
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +31 -26
- data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +224 -120
- data/lib/active_record/connection_adapters/schema_cache.rb +159 -21
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +17 -6
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +146 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -7
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +77 -13
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +174 -186
- data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
- data/lib/active_record/connection_adapters.rb +52 -0
- data/lib/active_record/connection_handling.rb +293 -33
- data/lib/active_record/core.rb +333 -98
- data/lib/active_record/counter_cache.rb +8 -30
- data/lib/active_record/database_configurations/connection_url_resolver.rb +99 -0
- data/lib/active_record/database_configurations/database_config.rb +80 -0
- data/lib/active_record/database_configurations/hash_config.rb +96 -0
- data/lib/active_record/database_configurations/url_config.rb +53 -0
- data/lib/active_record/database_configurations.rb +273 -0
- data/lib/active_record/delegated_type.rb +209 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/dynamic_matchers.rb +3 -4
- data/lib/active_record/enum.rb +108 -36
- data/lib/active_record/errors.rb +62 -19
- data/lib/active_record/explain.rb +10 -6
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +10 -17
- data/lib/active_record/fixture_set/model_metadata.rb +32 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +200 -481
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +53 -24
- data/lib/active_record/insert_all.rb +212 -0
- data/lib/active_record/integration.rb +67 -17
- data/lib/active_record/internal_metadata.rb +28 -9
- data/lib/active_record/legacy_yaml_adapter.rb +7 -3
- data/lib/active_record/locking/optimistic.rb +37 -23
- data/lib/active_record/locking/pessimistic.rb +9 -5
- data/lib/active_record/log_subscriber.rb +35 -35
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +77 -0
- data/lib/active_record/migration/command_recorder.rb +96 -44
- data/lib/active_record/migration/compatibility.rb +145 -64
- data/lib/active_record/migration/join_table.rb +0 -1
- data/lib/active_record/migration.rb +206 -157
- data/lib/active_record/model_schema.rb +148 -22
- data/lib/active_record/nested_attributes.rb +4 -7
- data/lib/active_record/no_touching.rb +8 -1
- data/lib/active_record/null_relation.rb +0 -1
- data/lib/active_record/persistence.rb +267 -59
- data/lib/active_record/query_cache.rb +21 -4
- data/lib/active_record/querying.rb +40 -23
- data/lib/active_record/railtie.rb +116 -59
- data/lib/active_record/railties/console_sandbox.rb +2 -4
- data/lib/active_record/railties/controller_runtime.rb +30 -35
- data/lib/active_record/railties/databases.rake +411 -80
- data/lib/active_record/readonly_attributes.rb +4 -0
- data/lib/active_record/reflection.rb +109 -93
- data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
- data/lib/active_record/relation/batches.rb +44 -35
- data/lib/active_record/relation/calculations.rb +157 -90
- data/lib/active_record/relation/delegation.rb +35 -50
- data/lib/active_record/relation/finder_methods.rb +64 -39
- data/lib/active_record/relation/from_clause.rb +5 -1
- data/lib/active_record/relation/merger.rb +32 -40
- data/lib/active_record/relation/predicate_builder/array_handler.rb +13 -13
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +5 -9
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +11 -10
- data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +62 -45
- data/lib/active_record/relation/query_attribute.rb +13 -8
- data/lib/active_record/relation/query_methods.rb +476 -187
- data/lib/active_record/relation/record_fetch_warning.rb +3 -3
- data/lib/active_record/relation/spawn_methods.rb +9 -9
- data/lib/active_record/relation/where_clause.rb +115 -62
- data/lib/active_record/relation.rb +379 -115
- data/lib/active_record/result.rb +64 -38
- data/lib/active_record/runtime_registry.rb +2 -2
- data/lib/active_record/sanitization.rb +22 -41
- data/lib/active_record/schema.rb +2 -11
- data/lib/active_record/schema_dumper.rb +54 -9
- data/lib/active_record/schema_migration.rb +7 -9
- data/lib/active_record/scoping/default.rb +4 -8
- data/lib/active_record/scoping/named.rb +17 -24
- data/lib/active_record/scoping.rb +8 -9
- data/lib/active_record/secure_token.rb +16 -8
- data/lib/active_record/serialization.rb +5 -3
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +49 -6
- data/lib/active_record/store.rb +88 -9
- data/lib/active_record/suppressor.rb +2 -2
- data/lib/active_record/table_metadata.rb +42 -43
- data/lib/active_record/tasks/database_tasks.rb +277 -81
- data/lib/active_record/tasks/mysql_database_tasks.rb +37 -39
- data/lib/active_record/tasks/postgresql_database_tasks.rb +27 -32
- data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -17
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +287 -0
- data/lib/active_record/timestamp.rb +43 -32
- data/lib/active_record/touch_later.rb +23 -22
- data/lib/active_record/transactions.rb +62 -118
- data/lib/active_record/translation.rb +1 -1
- data/lib/active_record/type/adapter_specific_registry.rb +3 -13
- data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
- data/lib/active_record/type/serialized.rb +6 -3
- data/lib/active_record/type/time.rb +10 -0
- data/lib/active_record/type/type_map.rb +0 -1
- data/lib/active_record/type/unsigned_integer.rb +0 -1
- data/lib/active_record/type.rb +10 -5
- data/lib/active_record/type_caster/connection.rb +15 -15
- data/lib/active_record/type_caster/map.rb +8 -8
- data/lib/active_record/validations/associated.rb +1 -2
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/uniqueness.rb +38 -30
- data/lib/active_record/validations.rb +4 -3
- data/lib/active_record.rb +13 -12
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +41 -0
- data/lib/arel/collectors/bind.rb +29 -0
- data/lib/arel/collectors/composite.rb +39 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +126 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +15 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +76 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +51 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +19 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +31 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +70 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +250 -0
- data/lib/arel/select_manager.rb +270 -0
- data/lib/arel/table.rb +118 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/dot.rb +308 -0
- data/lib/arel/visitors/mysql.rb +93 -0
- data/lib/arel/visitors/postgresql.rb +120 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +899 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +54 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -5
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +3 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +7 -5
- data/lib/rails/generators/active_record/migration.rb +19 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
- metadata +116 -30
- data/lib/active_record/attribute_decorators.rb +0 -90
- data/lib/active_record/collection_cache_key.rb +0 -53
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -287
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -33
- data/lib/active_record/define_callbacks.rb +0 -22
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -19
- data/lib/active_record/relation/where_clause_factory.rb +0 -34
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 6.1.6.1 (July 12, 2022) ##
|
2
2
|
|
3
3
|
* Change ActiveRecord::Coders::YAMLColumn default to safe_load
|
4
4
|
|
@@ -26,1059 +26,1718 @@
|
|
26
26
|
[CVE-2022-32224]
|
27
27
|
|
28
28
|
|
29
|
-
## Rails 5.
|
29
|
+
## Rails 6.1.5.1 (April 26, 2022) ##
|
30
30
|
|
31
31
|
* No changes.
|
32
32
|
|
33
33
|
|
34
|
-
## Rails
|
34
|
+
## Rails 6.1.5 (March 09, 2022) ##
|
35
35
|
|
36
|
-
*
|
36
|
+
* Fix `ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` for Ruby 2.6.
|
37
37
|
|
38
|
+
Ruby 2.6 and 2.7 have slightly different implementations of the `String#-@` method.
|
39
|
+
In Ruby 2.6, the receiver of the `String#-@` method is modified under certain circumstances.
|
40
|
+
This was later identified as a bug (https://bugs.ruby-lang.org/issues/15926) and only
|
41
|
+
fixed in Ruby 2.7.
|
38
42
|
|
39
|
-
|
43
|
+
Before the changes in this commit, the
|
44
|
+
`ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` method, which internally
|
45
|
+
calls the `String#-@` method, could also modify an input string argument in Ruby 2.6 --
|
46
|
+
changing a tainted, unfrozen string into a tainted, frozen string.
|
40
47
|
|
41
|
-
|
48
|
+
Fixes #43056
|
42
49
|
|
50
|
+
*Eric O'Hanlon*
|
43
51
|
|
44
|
-
|
52
|
+
* Fix migration compatibility to create SQLite references/belongs_to column as integer when
|
53
|
+
migration version is 6.0.
|
45
54
|
|
46
|
-
|
55
|
+
`reference`/`belongs_to` in migrations with version 6.0 were creating columns as
|
56
|
+
bigint instead of integer for the SQLite Adapter.
|
47
57
|
|
58
|
+
*Marcelo Lauxen*
|
48
59
|
|
49
|
-
|
60
|
+
* Fix dbconsole for 3-tier config.
|
50
61
|
|
51
|
-
*
|
62
|
+
*Eileen M. Uchitelle*
|
52
63
|
|
64
|
+
* Better handle SQL queries with invalid encoding.
|
53
65
|
|
54
|
-
|
66
|
+
```ruby
|
67
|
+
Post.create(name: "broken \xC8 UTF-8")
|
68
|
+
```
|
55
69
|
|
56
|
-
|
70
|
+
Would cause all adapters to fail in a non controlled way in the code
|
71
|
+
responsible to detect write queries.
|
57
72
|
|
73
|
+
The query is now properly passed to the database connection, which might or might
|
74
|
+
not be able to handle it, but will either succeed or failed in a more correct way.
|
58
75
|
|
59
|
-
|
76
|
+
*Jean Boussier*
|
60
77
|
|
61
|
-
*
|
78
|
+
* Ignore persisted in-memory records when merging target lists.
|
62
79
|
|
80
|
+
*Kevin Sjöberg*
|
63
81
|
|
64
|
-
|
82
|
+
* Fix regression bug that caused ignoring additional conditions for preloading
|
83
|
+
`has_many` through relations.
|
65
84
|
|
66
|
-
|
85
|
+
Fixes #43132
|
67
86
|
|
87
|
+
*Alexander Pauly*
|
68
88
|
|
69
|
-
|
89
|
+
* Fix `ActiveRecord::InternalMetadata` to not be broken by
|
90
|
+
`config.active_record.record_timestamps = false`
|
70
91
|
|
71
|
-
|
92
|
+
Since the model always create the timestamp columns, it has to set them, otherwise it breaks
|
93
|
+
various DB management tasks.
|
72
94
|
|
95
|
+
Fixes #42983
|
73
96
|
|
74
|
-
|
97
|
+
*Jean Boussier*
|
75
98
|
|
76
|
-
* Fix
|
99
|
+
* Fix duplicate active record objects on `inverse_of`.
|
77
100
|
|
78
|
-
|
79
|
-
for validating the money format in the PostgreSQL adapter. This patch
|
80
|
-
fixes the regexp.
|
101
|
+
*Justin Carvalho*
|
81
102
|
|
82
|
-
|
103
|
+
* Fix duplicate objects stored in has many association after save.
|
83
104
|
|
84
|
-
|
105
|
+
Fixes #42549.
|
85
106
|
|
86
|
-
*
|
107
|
+
*Alex Ghiculescu*
|
108
|
+
|
109
|
+
* Fix performance regression in `CollectionAssocation#build`.
|
110
|
+
|
111
|
+
*Alex Ghiculescu*
|
87
112
|
|
113
|
+
* Fix retrieving default value for text column for MariaDB.
|
114
|
+
|
115
|
+
*fatkodima*
|
88
116
|
|
89
|
-
|
117
|
+
|
118
|
+
## Rails 6.1.4.7 (March 08, 2022) ##
|
90
119
|
|
91
120
|
* No changes.
|
92
121
|
|
93
122
|
|
94
|
-
## Rails
|
123
|
+
## Rails 6.1.4.6 (February 11, 2022) ##
|
95
124
|
|
96
125
|
* No changes.
|
97
126
|
|
98
|
-
|
127
|
+
|
128
|
+
## Rails 6.1.4.5 (February 11, 2022) ##
|
99
129
|
|
100
130
|
* No changes.
|
101
131
|
|
102
132
|
|
103
|
-
## Rails
|
133
|
+
## Rails 6.1.4.4 (December 15, 2021) ##
|
104
134
|
|
105
135
|
* No changes.
|
106
136
|
|
107
137
|
|
108
|
-
## Rails
|
138
|
+
## Rails 6.1.4.3 (December 14, 2021) ##
|
109
139
|
|
110
|
-
*
|
140
|
+
* No changes.
|
111
141
|
|
112
|
-
Prior to the fix, when there was a circular series of `autosave: true`
|
113
|
-
associations, the callback for a `has_many` association was run while
|
114
|
-
another instance of the same callback on the same association hadn't
|
115
|
-
finished running. When control returned to the first instance of the
|
116
|
-
callback, the instance variable had changed, and subsequent associated
|
117
|
-
records weren't saved correctly. Specifically, the ID field for the
|
118
|
-
`belongs_to` corresponding to the `has_many` was `nil`.
|
119
142
|
|
120
|
-
|
143
|
+
## Rails 6.1.4.2 (December 14, 2021) ##
|
121
144
|
|
122
|
-
|
145
|
+
* No changes.
|
123
146
|
|
124
|
-
* PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
|
125
147
|
|
126
|
-
|
148
|
+
## Rails 6.1.4.1 (August 19, 2021) ##
|
127
149
|
|
128
|
-
|
150
|
+
* No changes.
|
129
151
|
|
130
|
-
* Fix sqlite3 collation parsing when using decimal columns.
|
131
152
|
|
132
|
-
|
153
|
+
## Rails 6.1.4 (June 24, 2021) ##
|
133
154
|
|
134
|
-
*
|
155
|
+
* Do not try to rollback transactions that failed due to a `ActiveRecord::TransactionRollbackError`.
|
135
156
|
|
136
|
-
|
157
|
+
*Jamie McCarthy*
|
137
158
|
|
138
|
-
|
159
|
+
* Raise an error if `pool_config` is `nil` in `set_pool_config`.
|
139
160
|
|
140
|
-
*
|
141
|
-
|
161
|
+
*Eileen M. Uchitelle*
|
162
|
+
|
163
|
+
* Fix compatibility with `psych >= 4`.
|
142
164
|
|
143
|
-
|
165
|
+
Starting in Psych 4.0.0 `YAML.load` behaves like `YAML.safe_load`. To preserve compatibility
|
166
|
+
Active Record's schema cache loader and `YAMLColumn` now uses `YAML.unsafe_load` if available.
|
144
167
|
|
145
|
-
*
|
168
|
+
*Jean Boussier*
|
146
169
|
|
170
|
+
* Support using replicas when using `rails dbconsole`.
|
147
171
|
|
148
|
-
|
172
|
+
*Christopher Thornton*
|
149
173
|
|
150
|
-
*
|
174
|
+
* Restore connection pools after transactional tests.
|
151
175
|
|
152
|
-
|
176
|
+
*Eugene Kenny*
|
153
177
|
|
154
|
-
|
178
|
+
* Change `upsert_all` to fails cleanly for MySQL when `:unique_by` is used.
|
155
179
|
|
156
|
-
*
|
180
|
+
*Bastian Bartmann*
|
157
181
|
|
158
|
-
|
182
|
+
* Fix user-defined `self.default_scope` to respect table alias.
|
159
183
|
|
160
|
-
*
|
184
|
+
*Ryuta Kamizono*
|
161
185
|
|
162
|
-
|
186
|
+
* Clear `@cache_keys` cache after `update_all`, `delete_all`, `destroy_all`.
|
163
187
|
|
164
188
|
*Ryuta Kamizono*
|
165
189
|
|
166
|
-
*
|
190
|
+
* Changed Arel predications `contains` and `overlaps` to use
|
191
|
+
`quoted_node` so that PostgreSQL arrays are quoted properly.
|
192
|
+
|
193
|
+
*Bradley Priest*
|
167
194
|
|
168
|
-
|
195
|
+
* Fix `merge` when the `where` clauses have string contents.
|
169
196
|
|
170
197
|
*Ryuta Kamizono*
|
171
198
|
|
172
|
-
* Fix
|
199
|
+
* Fix rollback of parent destruction with nested `dependent: :destroy`.
|
173
200
|
|
174
|
-
*
|
201
|
+
*Jacopo Beschi*
|
175
202
|
|
176
|
-
*
|
203
|
+
* Fix binds logging for `"WHERE ... IN ..."` statements.
|
177
204
|
|
178
|
-
*
|
205
|
+
*Ricardo Díaz*
|
179
206
|
|
180
|
-
*
|
207
|
+
* Handle `false` in relation strict loading checks.
|
181
208
|
|
182
|
-
|
209
|
+
Previously when a model had strict loading set to true and then had a
|
210
|
+
relation set `strict_loading` to false the false wasn't considered when
|
211
|
+
deciding whether to raise/warn about strict loading.
|
212
|
+
|
213
|
+
```
|
214
|
+
class Dog < ActiveRecord::Base
|
215
|
+
self.strict_loading_by_default = true
|
183
216
|
|
217
|
+
has_many :treats, strict_loading: false
|
218
|
+
end
|
219
|
+
```
|
184
220
|
|
185
|
-
|
221
|
+
In the example, `dog.treats` would still raise even though
|
222
|
+
`strict_loading` was set to false. This is a bug affecting more than
|
223
|
+
Active Storage which is why I made this PR superseding #41461. We need
|
224
|
+
to fix this for all applications since the behavior is a little
|
225
|
+
surprising. I took the test from #41461 and the code suggestion from #41453
|
226
|
+
with some additions.
|
186
227
|
|
187
|
-
*
|
228
|
+
*Eileen M. Uchitelle*, *Radamés Roriz*
|
188
229
|
|
230
|
+
* Fix numericality validator without precision.
|
189
231
|
|
190
|
-
|
232
|
+
*Ryuta Kamizono*
|
191
233
|
|
192
|
-
*
|
234
|
+
* Fix aggregate attribute on Enum types.
|
193
235
|
|
194
236
|
*Ryuta Kamizono*
|
195
237
|
|
196
|
-
*
|
238
|
+
* Fix `CREATE INDEX` statement generation for PostgreSQL.
|
197
239
|
|
198
|
-
*
|
240
|
+
*eltongo*
|
199
241
|
|
200
|
-
*
|
242
|
+
* Fix where clause on enum attribute when providing array of strings.
|
201
243
|
|
202
|
-
|
203
|
-
adapter.
|
244
|
+
*Ryuta Kamizono*
|
204
245
|
|
205
|
-
|
246
|
+
* Fix `unprepared_statement` to work it when nesting.
|
206
247
|
|
207
|
-
*
|
248
|
+
*Ryuta Kamizono*
|
208
249
|
|
209
|
-
PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test
|
210
|
-
was passing for SQLite and MySQL, but failed for PostgreSQL:
|
211
250
|
|
212
|
-
|
213
|
-
class DeveloperName < ActiveRecord::Type::String
|
214
|
-
def deserialize(value)
|
215
|
-
"Developer: #{value}"
|
216
|
-
end
|
217
|
-
end
|
251
|
+
## Rails 6.1.3.2 (May 05, 2021) ##
|
218
252
|
|
219
|
-
|
220
|
-
self.table_name = "developers"
|
253
|
+
* No changes.
|
221
254
|
|
222
|
-
attribute :name, DeveloperName.new
|
223
255
|
|
224
|
-
|
225
|
-
end
|
256
|
+
## Rails 6.1.3.1 (March 26, 2021) ##
|
226
257
|
|
227
|
-
|
228
|
-
developer.update_column :name, "name"
|
258
|
+
* No changes.
|
229
259
|
|
230
|
-
loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
|
231
|
-
puts loaded_developer.name # should be "Developer: name" but it's just "name"
|
232
|
-
```
|
233
260
|
|
234
|
-
|
261
|
+
## Rails 6.1.3 (February 17, 2021) ##
|
235
262
|
|
236
|
-
*
|
263
|
+
* Fix the MySQL adapter to always set the right collation and charset
|
264
|
+
to the connection session.
|
237
265
|
|
238
|
-
*
|
266
|
+
*Rafael Mendonça França*
|
239
267
|
|
240
|
-
*
|
241
|
-
|
268
|
+
* Fix MySQL adapter handling of time objects when prepared statements
|
269
|
+
are enabled.
|
242
270
|
|
243
|
-
*
|
271
|
+
*Rafael Mendonça França*
|
244
272
|
|
245
|
-
*
|
273
|
+
* Fix scoping in enum fields using conditions that would generate
|
274
|
+
an `IN` clause.
|
246
275
|
|
247
276
|
*Ryuta Kamizono*
|
248
277
|
|
249
|
-
*
|
278
|
+
* Skip optimised #exist? query when #include? is called on a relation
|
279
|
+
with a having clause
|
250
280
|
|
251
|
-
|
281
|
+
Relations that have aliased select values AND a having clause that
|
282
|
+
references an aliased select value would generate an error when
|
283
|
+
#include? was called, due to an optimisation that would generate
|
284
|
+
call #exists? on the relation instead, which effectively alters
|
285
|
+
the select values of the query (and thus removes the aliased select
|
286
|
+
values), but leaves the having clause intact. Because the having
|
287
|
+
clause is then referencing an aliased column that is no longer
|
288
|
+
present in the simplified query, an ActiveRecord::InvalidStatement
|
289
|
+
error was raised.
|
252
290
|
|
253
|
-
|
291
|
+
An sample query affected by this problem:
|
254
292
|
|
255
|
-
|
293
|
+
```ruby
|
294
|
+
Author.select('COUNT(*) as total_posts', 'authors.*')
|
295
|
+
.joins(:posts)
|
296
|
+
.group(:id)
|
297
|
+
.having('total_posts > 2')
|
298
|
+
.include?(Author.first)
|
299
|
+
```
|
256
300
|
|
257
|
-
|
301
|
+
This change adds an addition check to the condition that skips the
|
302
|
+
simplified #exists? query, which simply checks for the presence of
|
303
|
+
a having clause.
|
258
304
|
|
259
|
-
|
305
|
+
Fixes #41417
|
260
306
|
|
261
|
-
*
|
307
|
+
*Michael Smart*
|
262
308
|
|
263
|
-
*
|
309
|
+
* Increment postgres prepared statement counter before making a prepared statement, so if the statement is aborted
|
310
|
+
without Rails knowledge (e.g., if app gets kill -9d during long-running query or due to Rack::Timeout), app won't end
|
311
|
+
up in perpetual crash state for being inconsistent with Postgres.
|
264
312
|
|
265
|
-
*
|
313
|
+
*wbharding*, *Martin Tepper*
|
266
314
|
|
267
|
-
* Prevent leaking of user's DB credentials on `rails db:create` failure.
|
268
315
|
|
269
|
-
|
316
|
+
## Rails 6.1.2.1 (February 10, 2021) ##
|
270
317
|
|
271
|
-
*
|
318
|
+
* Fix possible DoS vector in PostgreSQL money type
|
319
|
+
|
320
|
+
Carefully crafted input can cause a DoS via the regular expressions used
|
321
|
+
for validating the money format in the PostgreSQL adapter. This patch
|
322
|
+
fixes the regexp.
|
272
323
|
|
273
|
-
|
324
|
+
Thanks to @dee-see from Hackerone for this patch!
|
274
325
|
|
275
|
-
|
326
|
+
[CVE-2021-22880]
|
276
327
|
|
277
|
-
*
|
328
|
+
*Aaron Patterson*
|
278
329
|
|
279
|
-
* Avoid extra scoping when using `Relation#update` that was causing this method to change the current scope.
|
280
330
|
|
281
|
-
|
331
|
+
## Rails 6.1.2 (February 09, 2021) ##
|
282
332
|
|
283
|
-
* Fix
|
333
|
+
* Fix timestamp type for sqlite3.
|
284
334
|
|
285
|
-
*
|
335
|
+
*Eileen M. Uchitelle*
|
286
336
|
|
287
|
-
*
|
337
|
+
* Make destroy async transactional.
|
288
338
|
|
289
|
-
|
339
|
+
An active record rollback could occur while enqueuing a job. In this
|
340
|
+
case the job would enqueue even though the database deletion
|
341
|
+
rolledback putting things in a funky state.
|
290
342
|
|
343
|
+
Now the jobs are only enqueued until after the db transaction has been committed.
|
291
344
|
|
292
|
-
|
345
|
+
*Cory Gwin*
|
293
346
|
|
294
|
-
*
|
347
|
+
* Fix malformed packet error in MySQL statement for connection configuration.
|
295
348
|
|
349
|
+
*robinroestenburg*
|
296
350
|
|
297
|
-
|
351
|
+
* Connection specification now passes the "url" key as a configuration for the
|
352
|
+
adapter if the "url" protocol is "jdbc", "http", or "https". Previously only
|
353
|
+
urls with the "jdbc" prefix were passed to the Active Record Adapter, others
|
354
|
+
are assumed to be adapter specification urls.
|
298
355
|
|
299
|
-
|
356
|
+
Fixes #41137.
|
300
357
|
|
301
|
-
|
358
|
+
*Jonathan Bracy*
|
302
359
|
|
303
|
-
|
360
|
+
* Fix granular connection swapping when there are multiple abstract classes.
|
304
361
|
|
305
|
-
*
|
362
|
+
*Eileen M. Uchitelle*
|
363
|
+
|
364
|
+
* Fix `find_by` with custom primary key for belongs_to association.
|
306
365
|
|
307
|
-
*
|
366
|
+
*Ryuta Kamizono*
|
308
367
|
|
309
|
-
*
|
368
|
+
* Add support for `rails console --sandbox` for multiple database applications.
|
310
369
|
|
311
|
-
*
|
370
|
+
*alpaca-tc*
|
312
371
|
|
313
|
-
* Fix `
|
372
|
+
* Fix `where` on polymorphic association with empty array.
|
314
373
|
|
315
374
|
*Ryuta Kamizono*
|
316
375
|
|
317
|
-
* Fix
|
376
|
+
* Fix preventing writes for `ApplicationRecord`.
|
377
|
+
|
378
|
+
*Eileen M. Uchitelle*
|
379
|
+
|
380
|
+
|
381
|
+
## Rails 6.1.1 (January 07, 2021) ##
|
382
|
+
|
383
|
+
* Fix fixtures loading when strict loading is enabled for the association.
|
318
384
|
|
319
|
-
|
385
|
+
*Alex Ghiculescu*
|
386
|
+
|
387
|
+
* Fix `where` with custom primary key for belongs_to association.
|
320
388
|
|
321
389
|
*Ryuta Kamizono*
|
322
390
|
|
323
|
-
* Fix
|
391
|
+
* Fix `where` with aliased associations.
|
324
392
|
|
325
|
-
*
|
393
|
+
*Ryuta Kamizono*
|
326
394
|
|
327
|
-
* Fix
|
395
|
+
* Fix `composed_of` with symbol mapping.
|
328
396
|
|
329
|
-
|
397
|
+
*Ryuta Kamizono*
|
330
398
|
|
331
|
-
|
399
|
+
* Don't skip money's type cast for pluck and calculations.
|
332
400
|
|
333
|
-
*
|
401
|
+
*Ryuta Kamizono*
|
334
402
|
|
335
|
-
|
403
|
+
* Fix `where` on polymorphic association with non Active Record object.
|
336
404
|
|
337
405
|
*Ryuta Kamizono*
|
338
406
|
|
339
|
-
* `
|
407
|
+
* Make sure `db:prepare` works even the schema file doesn't exist.
|
340
408
|
|
341
|
-
|
409
|
+
*Rafael Mendonça França*
|
410
|
+
|
411
|
+
* Fix complicated `has_many :through` with nested where condition.
|
342
412
|
|
343
413
|
*Ryuta Kamizono*
|
344
414
|
|
345
|
-
*
|
415
|
+
* Handle STI models for `has_many dependent: :destroy_async`.
|
346
416
|
|
347
|
-
*
|
417
|
+
*Muhammad Usman*
|
348
418
|
|
349
|
-
*
|
350
|
-
wrongly persists through record.
|
419
|
+
* Restore possibility of passing `false` to :polymorphic option of `belongs_to`.
|
351
420
|
|
352
|
-
|
421
|
+
Previously, passing `false` would trigger the option validation logic
|
422
|
+
to throw an error saying :polymorphic would not be a valid option.
|
353
423
|
|
354
|
-
*
|
424
|
+
*glaszig*
|
355
425
|
|
356
|
-
*
|
357
|
-
query cache.
|
426
|
+
* Allow adding nonnamed expression indexes to be revertible.
|
358
427
|
|
359
|
-
|
428
|
+
Fixes #40732.
|
360
429
|
|
430
|
+
Previously, the following code would raise an error, when executed while rolling back,
|
431
|
+
and the index name should be specified explicitly. Now, the index name is inferred
|
432
|
+
automatically.
|
361
433
|
|
362
|
-
|
434
|
+
```ruby
|
435
|
+
add_index(:items, "to_tsvector('english', description)")
|
436
|
+
```
|
363
437
|
|
364
|
-
*
|
438
|
+
*fatkodima*
|
365
439
|
|
366
|
-
*Aaron Stone*
|
367
440
|
|
368
|
-
|
441
|
+
## Rails 6.1.0 (December 09, 2020) ##
|
369
442
|
|
370
|
-
|
371
|
-
have a specified precision then on assignment the value is rounded to
|
372
|
-
that precision. This behavior is now applied to time columns as well.
|
443
|
+
* Only warn about negative enums if a positive form that would cause conflicts exists.
|
373
444
|
|
374
|
-
Fixes #
|
445
|
+
Fixes #39065.
|
375
446
|
|
376
|
-
*
|
447
|
+
*Alex Ghiculescu*
|
377
448
|
|
378
|
-
*
|
449
|
+
* Change `attribute_for_inspect` to take `filter_attributes` in consideration.
|
379
450
|
|
380
|
-
|
381
|
-
because until #24542 the quoting for time columns didn't remove the date
|
382
|
-
component. To ensure that values are consistent we now normalize the
|
383
|
-
date component to 2001-01-01 on reading and writing.
|
451
|
+
*Rafael Mendonça França*
|
384
452
|
|
385
|
-
|
453
|
+
* Fix odd behavior of inverse_of with multiple belongs_to to same class.
|
386
454
|
|
387
|
-
|
455
|
+
Fixes #35204.
|
388
456
|
|
389
|
-
|
390
|
-
was removed however it only removed it when it was 2001-01-01. Now the
|
391
|
-
date component is removed irrespective of what the date is.
|
457
|
+
*Tomoyuki Kai*
|
392
458
|
|
393
|
-
|
459
|
+
* Build predicate conditions with objects that delegate `#id` and primary key:
|
394
460
|
|
395
|
-
|
396
|
-
|
461
|
+
```ruby
|
462
|
+
class AdminAuthor
|
463
|
+
delegate_missing_to :@author
|
397
464
|
|
398
|
-
|
465
|
+
def initialize(author)
|
466
|
+
@author = author
|
467
|
+
end
|
468
|
+
end
|
399
469
|
|
400
|
-
|
470
|
+
Post.where(author: AdminAuthor.new(author))
|
471
|
+
```
|
401
472
|
|
402
|
-
*
|
473
|
+
*Sean Doyle*
|
403
474
|
|
404
|
-
|
475
|
+
* Add `connected_to_many` API.
|
405
476
|
|
406
|
-
|
477
|
+
This API allows applications to connect to multiple databases at once without switching all of them or implementing a deeply nested stack.
|
407
478
|
|
408
|
-
|
479
|
+
Before:
|
409
480
|
|
410
|
-
|
411
|
-
|
412
|
-
|
481
|
+
AnimalsRecord.connected_to(role: :reading) do
|
482
|
+
MealsRecord.connected_to(role: :reading) do
|
483
|
+
Dog.first # read from animals replica
|
484
|
+
Dinner.first # read from meals replica
|
485
|
+
Person.first # read from primary writer
|
486
|
+
end
|
487
|
+
end
|
413
488
|
|
414
|
-
|
489
|
+
After:
|
415
490
|
|
416
|
-
|
491
|
+
ActiveRecord::Base.connected_to_many([AnimalsRecord, MealsRecord], role: :reading) do
|
492
|
+
Dog.first # read from animals replica
|
493
|
+
Dinner.first # read from meals replica
|
494
|
+
Person.first # read from primary writer
|
495
|
+
end
|
417
496
|
|
418
|
-
*
|
497
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
419
498
|
|
420
|
-
|
499
|
+
* Add option to raise or log for `ActiveRecord::StrictLoadingViolationError`.
|
421
500
|
|
422
|
-
|
501
|
+
Some applications may not want to raise an error in production if using `strict_loading`. This would allow an application to set strict loading to log for the production environment while still raising in development and test environments.
|
423
502
|
|
424
|
-
|
503
|
+
Set `config.active_record.action_on_strict_loading_violation` to `:log` errors instead of raising.
|
425
504
|
|
426
|
-
*
|
505
|
+
*Eileen M. Uchitelle*
|
427
506
|
|
428
|
-
*
|
429
|
-
Using a `Relation` for performing queries is the prefered API.
|
507
|
+
* Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
|
430
508
|
|
431
|
-
|
509
|
+
Fixes #34255.
|
432
510
|
|
433
|
-
*
|
511
|
+
*Steven Weber*
|
434
512
|
|
435
|
-
|
436
|
-
david_balance = customers(:david).balance
|
437
|
-
Customer.where(balance: [david_balance]).to_sql
|
513
|
+
* Optimise the length of index names for polymorphic references by using the reference name rather than the type and id column names.
|
438
514
|
|
439
|
-
|
440
|
-
# After : WHERE `customers`.`balance` = 50
|
441
|
-
```
|
515
|
+
Because the default behaviour when adding an index with multiple columns is to use all column names in the index name, this could frequently lead to overly long index names for polymorphic references which would fail the migration if it exceeded the database limit.
|
442
516
|
|
443
|
-
|
517
|
+
This change reduces the chance of that happening by using the reference name, e.g. `index_my_table_on_my_reference`.
|
444
518
|
|
445
|
-
|
519
|
+
Fixes #38655.
|
446
520
|
|
447
|
-
*
|
521
|
+
*Luke Redpath*
|
448
522
|
|
449
|
-
|
523
|
+
* MySQL: Uniqueness validator now respects default database collation,
|
524
|
+
no longer enforce case sensitive comparison by default.
|
450
525
|
|
451
526
|
*Ryuta Kamizono*
|
452
527
|
|
453
|
-
*
|
528
|
+
* Remove deprecated methods from `ActiveRecord::ConnectionAdapters::DatabaseLimits`.
|
454
529
|
|
455
|
-
|
530
|
+
`column_name_length`
|
531
|
+
`table_name_length`
|
532
|
+
`columns_per_table`
|
533
|
+
`indexes_per_table`
|
534
|
+
`columns_per_multicolumn_index`
|
535
|
+
`sql_query_length`
|
536
|
+
`joins_per_query`
|
456
537
|
|
457
|
-
*
|
538
|
+
*Rafael Mendonça França*
|
458
539
|
|
459
|
-
*
|
540
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?`.
|
460
541
|
|
461
|
-
*
|
542
|
+
*Rafael Mendonça França*
|
543
|
+
|
544
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?`.
|
462
545
|
|
463
|
-
*
|
546
|
+
*Rafael Mendonça França*
|
547
|
+
|
548
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?`.
|
464
549
|
|
465
|
-
*
|
550
|
+
*Rafael Mendonça França*
|
466
551
|
|
467
|
-
*
|
552
|
+
* Remove deprecated `ActiveRecord::Base#update_attributes` and `ActiveRecord::Base#update_attributes!`.
|
468
553
|
|
469
|
-
*
|
554
|
+
*Rafael Mendonça França*
|
470
555
|
|
471
|
-
*
|
556
|
+
* Remove deprecated `migrations_path` argument in `ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version`.
|
472
557
|
|
473
|
-
|
558
|
+
*Rafael Mendonça França*
|
474
559
|
|
475
|
-
|
560
|
+
* Remove deprecated `config.active_record.sqlite3.represent_boolean_as_integer`.
|
476
561
|
|
477
|
-
*
|
562
|
+
*Rafael Mendonça França*
|
478
563
|
|
479
|
-
|
564
|
+
* `relation.create` does no longer leak scope to class level querying methods
|
565
|
+
in initialization block and callbacks.
|
480
566
|
|
481
|
-
|
482
|
-
belongs_to :author
|
483
|
-
has_many :books, through: :author
|
484
|
-
has_many :subscriptions, through: :books
|
485
|
-
end
|
567
|
+
Before:
|
486
568
|
|
487
|
-
|
488
|
-
|
489
|
-
has_many :books
|
490
|
-
has_many :subscriptions, through: :books
|
569
|
+
User.where(name: "John").create do |john|
|
570
|
+
User.find_by(name: "David") # => nil
|
491
571
|
end
|
492
572
|
|
493
|
-
|
494
|
-
|
495
|
-
|
573
|
+
After:
|
574
|
+
|
575
|
+
User.where(name: "John").create do |john|
|
576
|
+
User.find_by(name: "David") # => #<User name: "David", ...>
|
496
577
|
end
|
497
578
|
|
498
|
-
|
499
|
-
|
579
|
+
*Ryuta Kamizono*
|
580
|
+
|
581
|
+
* Named scope chain does no longer leak scope to class level querying methods.
|
582
|
+
|
583
|
+
class User < ActiveRecord::Base
|
584
|
+
scope :david, -> { User.where(name: "David") }
|
500
585
|
end
|
501
586
|
|
502
587
|
Before:
|
503
588
|
|
504
|
-
|
589
|
+
User.where(name: "John").david
|
590
|
+
# SELECT * FROM users WHERE name = 'John' AND name = 'David'
|
505
591
|
|
506
592
|
After:
|
507
593
|
|
508
|
-
|
509
|
-
|
594
|
+
User.where(name: "John").david
|
595
|
+
# SELECT * FROM users WHERE name = 'David'
|
510
596
|
|
511
|
-
|
597
|
+
*Ryuta Kamizono*
|
512
598
|
|
513
|
-
|
599
|
+
* Remove deprecated methods from `ActiveRecord::DatabaseConfigurations`.
|
514
600
|
|
515
|
-
|
516
|
-
|
517
|
-
|
601
|
+
`fetch`
|
602
|
+
`each`
|
603
|
+
`first`
|
604
|
+
`values`
|
605
|
+
`[]=`
|
518
606
|
|
519
|
-
|
607
|
+
*Rafael Mendonça França*
|
520
608
|
|
521
|
-
|
609
|
+
* `where.not` now generates NAND predicates instead of NOR.
|
522
610
|
|
523
|
-
|
524
|
-
SQL queries for association counting.
|
611
|
+
Before:
|
525
612
|
|
526
|
-
|
613
|
+
User.where.not(name: "Jon", role: "admin")
|
614
|
+
# SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
|
527
615
|
|
528
|
-
|
616
|
+
After:
|
529
617
|
|
530
|
-
|
618
|
+
User.where.not(name: "Jon", role: "admin")
|
619
|
+
# SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
|
531
620
|
|
532
|
-
*
|
621
|
+
*Rafael Mendonça França*
|
533
622
|
|
534
|
-
|
623
|
+
* Remove deprecated `ActiveRecord::Result#to_hash` method.
|
535
624
|
|
536
|
-
*
|
625
|
+
*Rafael Mendonça França*
|
537
626
|
|
538
|
-
|
627
|
+
* Deprecate `ActiveRecord::Base.allow_unsafe_raw_sql`.
|
539
628
|
|
540
|
-
*
|
541
|
-
information.
|
629
|
+
*Rafael Mendonça França*
|
542
630
|
|
543
|
-
|
631
|
+
* Remove deprecated support for using unsafe raw SQL in `ActiveRecord::Relation` methods.
|
544
632
|
|
545
|
-
*
|
633
|
+
*Rafael Mendonça França*
|
546
634
|
|
547
|
-
|
548
|
-
|
549
|
-
and other debugging.
|
635
|
+
* Allow users to silence the "Rails couldn't infer whether you are using multiple databases..."
|
636
|
+
message using `config.active_record.suppress_multiple_database_warning`.
|
550
637
|
|
551
|
-
|
552
|
-
recommended for use in the production environment since it relies
|
553
|
-
on Ruby's `Kernel#caller_locations` which is fairly slow.
|
638
|
+
*Omri Gabay*
|
554
639
|
|
555
|
-
|
640
|
+
* Connections can be granularly switched for abstract classes when `connected_to` is called.
|
556
641
|
|
557
|
-
|
642
|
+
This change allows `connected_to` to switch a `role` and/or `shard` for a single abstract class instead of all classes globally. Applications that want to use the new feature need to set `config.active_record.legacy_connection_handling` to `false` in their application configuration.
|
558
643
|
|
559
|
-
|
560
|
-
# create_table :posts do |t|
|
561
|
-
# t.integer :comments_count, default: 0
|
562
|
-
# t.integer :lock_version
|
563
|
-
# t.timestamps
|
564
|
-
# end
|
565
|
-
class Post < ApplicationRecord
|
566
|
-
end
|
644
|
+
Example usage:
|
567
645
|
|
568
|
-
|
569
|
-
# t.belongs_to :post
|
570
|
-
# end
|
571
|
-
class Comment < ApplicationRecord
|
572
|
-
belongs_to :post, touch: true, counter_cache: true
|
573
|
-
end
|
574
|
-
```
|
646
|
+
Given an application we have a `User` model that inherits from `ApplicationRecord` and a `Dog` model that inherits from `AnimalsRecord`. `AnimalsRecord` and `ApplicationRecord` have writing and reading connections as well as shard `default`, `one`, and `two`.
|
575
647
|
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
|
581
|
-
VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
|
582
|
-
commit transaction
|
583
|
-
|
584
|
-
comment = Comment.create!(post: post)
|
585
|
-
# => begin transaction
|
586
|
-
INSERT INTO "comments" ("post_id") VALUES (1)
|
587
|
-
|
588
|
-
UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
|
589
|
-
"lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
|
590
|
-
|
591
|
-
UPDATE "posts" SET "updated_at" = '2017-12-11 21:27:11.398330',
|
592
|
-
"lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
|
593
|
-
rollback transaction
|
594
|
-
# => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
|
595
|
-
|
596
|
-
Comment.take.destroy!
|
597
|
-
# => begin transaction
|
598
|
-
DELETE FROM "comments" WHERE "comments"."id" = 1
|
599
|
-
|
600
|
-
UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
|
601
|
-
"lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
|
602
|
-
|
603
|
-
UPDATE "posts" SET "updated_at" = '2017-12-11 21:42:47.785901',
|
604
|
-
"lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
|
605
|
-
rollback transaction
|
606
|
-
# => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
|
607
|
-
```
|
648
|
+
```ruby
|
649
|
+
ActiveRecord::Base.connected_to(role: :reading) do
|
650
|
+
User.first # reads from default replica
|
651
|
+
Dog.first # reads from default replica
|
608
652
|
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
"lock_version" = COALESCE("lock_version", 0) + 1,
|
623
|
-
"updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
|
624
|
-
commit transaction
|
625
|
-
|
626
|
-
comment.destroy!
|
627
|
-
# => begin transaction
|
628
|
-
DELETE FROM "comments" WHERE "comments"."id" = 1
|
629
|
-
|
630
|
-
UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
|
631
|
-
"lock_version" = COALESCE("lock_version", 0) + 1,
|
632
|
-
"updated_at" = '2017-12-11 21:39:02.685520' WHERE "posts"."id" = 1
|
633
|
-
commit transaction
|
653
|
+
AnimalsRecord.connected_to(role: :writing, shard: :one) do
|
654
|
+
User.first # reads from default replica
|
655
|
+
Dog.first # reads from shard one primary
|
656
|
+
end
|
657
|
+
|
658
|
+
User.first # reads from default replica
|
659
|
+
Dog.first # reads from default replica
|
660
|
+
|
661
|
+
ApplicationRecord.connected_to(role: :writing, shard: :two) do
|
662
|
+
User.first # reads from shard two primary
|
663
|
+
Dog.first # reads from default replica
|
664
|
+
end
|
665
|
+
end
|
634
666
|
```
|
635
667
|
|
636
|
-
|
668
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
637
669
|
|
638
|
-
|
670
|
+
* Allow double-dash comment syntax when querying read-only databases
|
639
671
|
|
640
|
-
*
|
672
|
+
*James Adam*
|
641
673
|
|
642
|
-
|
674
|
+
* Add `values_at` method.
|
643
675
|
|
644
|
-
|
676
|
+
Returns an array containing the values associated with the given methods.
|
645
677
|
|
646
|
-
|
678
|
+
```ruby
|
679
|
+
topic = Topic.first
|
680
|
+
topic.values_at(:title, :author_name)
|
681
|
+
# => ["Budget", "Jason"]
|
682
|
+
```
|
647
683
|
|
648
|
-
|
684
|
+
Similar to `Hash#values_at` but on an Active Record instance.
|
649
685
|
|
650
|
-
|
686
|
+
*Guillaume Briday*
|
651
687
|
|
652
|
-
|
688
|
+
* Fix `read_attribute_before_type_cast` to consider attribute aliases.
|
653
689
|
|
654
|
-
*
|
655
|
-
when canceling statement due to user request.
|
690
|
+
*Marcelo Lauxen*
|
656
691
|
|
657
|
-
|
692
|
+
* Support passing record to uniqueness validator `:conditions` callable:
|
658
693
|
|
659
|
-
|
660
|
-
|
694
|
+
```ruby
|
695
|
+
class Article < ApplicationRecord
|
696
|
+
validates_uniqueness_of :title, conditions: ->(article) {
|
697
|
+
published_at = article.published_at
|
698
|
+
where(published_at: published_at.beginning_of_year..published_at.end_of_year)
|
699
|
+
}
|
700
|
+
end
|
701
|
+
```
|
661
702
|
|
662
|
-
*
|
703
|
+
*Eliot Sykes*
|
663
704
|
|
664
|
-
*
|
665
|
-
|
705
|
+
* `BatchEnumerator#update_all` and `BatchEnumerator#delete_all` now return the
|
706
|
+
total number of rows affected, just like their non-batched counterparts.
|
666
707
|
|
667
|
-
|
668
|
-
|
669
|
-
|
708
|
+
```ruby
|
709
|
+
Person.in_batches.update_all("first_name = 'Eugene'") # => 42
|
710
|
+
Person.in_batches.delete_all # => 42
|
670
711
|
```
|
671
712
|
|
672
|
-
|
673
|
-
```
|
674
|
-
Article.order(Arel.sql("LENGTH(title)"))
|
675
|
-
```
|
713
|
+
Fixes #40287.
|
676
714
|
|
677
|
-
|
678
|
-
discouraged] form `Article.order(params[:my_order])`, under the
|
679
|
-
mistaken belief that only column names will be accepted.
|
715
|
+
*Eugene Kenny*
|
680
716
|
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
to
|
717
|
+
* Add support for PostgreSQL `interval` data type with conversion to
|
718
|
+
`ActiveSupport::Duration` when loading records from database and
|
719
|
+
serialization to ISO 8601 formatted duration string on save.
|
720
|
+
Add support to define a column in migrations and get it in a schema dump.
|
721
|
+
Optional column precision is supported.
|
685
722
|
|
686
|
-
|
687
|
-
references) are unaffected:
|
688
|
-
```
|
689
|
-
Article.order("title DESC")
|
690
|
-
```
|
723
|
+
To use this in 6.1, you need to place the next string to your model file:
|
691
724
|
|
692
|
-
|
725
|
+
attribute :duration, :interval
|
693
726
|
|
694
|
-
|
695
|
-
`Type#serialize`. This means that `update_all(foo: 'true')` will properly
|
696
|
-
persist a boolean.
|
727
|
+
To keep old behavior until 7.0 is released:
|
697
728
|
|
698
|
-
|
729
|
+
attribute :duration, :string
|
699
730
|
|
700
|
-
|
701
|
-
when statement timeout exceeded.
|
731
|
+
Example:
|
702
732
|
|
703
|
-
|
733
|
+
create_table :events do |t|
|
734
|
+
t.string :name
|
735
|
+
t.interval :duration
|
736
|
+
end
|
704
737
|
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
or name of a migration file. Raise error if format of `VERSION` is invalid.
|
709
|
-
Raise error if target migration doesn't exist.
|
738
|
+
class Event < ApplicationRecord
|
739
|
+
attribute :duration, :interval
|
740
|
+
end
|
710
741
|
|
711
|
-
|
742
|
+
Event.create!(name: 'Rock Fest', duration: 2.days)
|
743
|
+
Event.last.duration # => 2 days
|
744
|
+
Event.last.duration.iso8601 # => "P2D"
|
745
|
+
Event.new(duration: 'P1DT12H3S').duration # => 1 day, 12 hours, and 3 seconds
|
746
|
+
Event.new(duration: '1 day') # Unknown value will be ignored and NULL will be written to database
|
712
747
|
|
713
|
-
*
|
714
|
-
`db/schema.rb` when using the sqlite adapter.
|
748
|
+
*Andrey Novikov*
|
715
749
|
|
716
|
-
|
750
|
+
* Allow associations supporting the `dependent:` key to take `dependent: :destroy_async`.
|
717
751
|
|
718
|
-
|
752
|
+
```ruby
|
753
|
+
class Account < ActiveRecord::Base
|
754
|
+
belongs_to :supplier, dependent: :destroy_async
|
755
|
+
end
|
756
|
+
```
|
719
757
|
|
720
|
-
|
758
|
+
`:destroy_async` will enqueue a job to destroy associated records in the background.
|
721
759
|
|
722
|
-
*Rafael Mendonça França*
|
760
|
+
*DHH*, *George Claghorn*, *Cory Gwin*, *Rafael Mendonça França*, *Adrianna Chang*
|
723
761
|
|
724
|
-
*
|
762
|
+
* Add `SKIP_TEST_DATABASE` environment variable to disable modifying the test database when `rails db:create` and `rails db:drop` are called.
|
725
763
|
|
726
|
-
*
|
764
|
+
*Jason Schweier*
|
727
765
|
|
728
|
-
*
|
766
|
+
* `connects_to` can only be called on `ActiveRecord::Base` or abstract classes.
|
729
767
|
|
730
|
-
|
768
|
+
Ensure that `connects_to` can only be called from `ActiveRecord::Base` or abstract classes. This protects the application from opening duplicate or too many connections.
|
731
769
|
|
732
|
-
*
|
770
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
733
771
|
|
734
|
-
|
772
|
+
* All connection adapters `execute` now raises `ActiveRecord::ConnectionNotEstablished` rather than
|
773
|
+
`ActiveRecord::StatementInvalid` when they encounter a connection error.
|
735
774
|
|
736
|
-
*
|
775
|
+
*Jean Boussier*
|
737
776
|
|
738
|
-
|
777
|
+
* `Mysql2Adapter#quote_string` now raises `ActiveRecord::ConnectionNotEstablished` rather than
|
778
|
+
`ActiveRecord::StatementInvalid` when it can't connect to the MySQL server.
|
739
779
|
|
740
|
-
*
|
780
|
+
*Jean Boussier*
|
741
781
|
|
742
|
-
|
782
|
+
* Add support for check constraints that are `NOT VALID` via `validate: false` (PostgreSQL-only).
|
743
783
|
|
744
|
-
*
|
784
|
+
*Alex Robbin*
|
745
785
|
|
746
|
-
|
786
|
+
* Ensure the default configuration is considered primary or first for an environment
|
747
787
|
|
748
|
-
|
788
|
+
If a multiple database application provides a configuration named primary, that will be treated as default. In applications that do not have a primary entry, the default database configuration will be the first configuration for an environment.
|
749
789
|
|
750
|
-
*
|
790
|
+
*Eileen M. Uchitelle*
|
751
791
|
|
752
|
-
*
|
792
|
+
* Allow `where` references association names as joined table name aliases.
|
753
793
|
|
754
|
-
|
794
|
+
```ruby
|
795
|
+
class Comment < ActiveRecord::Base
|
796
|
+
enum label: [:default, :child]
|
797
|
+
has_many :children, class_name: "Comment", foreign_key: :parent_id
|
798
|
+
end
|
755
799
|
|
756
|
-
|
800
|
+
# ... FROM comments LEFT OUTER JOIN comments children ON ... WHERE children.label = 1
|
801
|
+
Comment.includes(:children).where("children.label": "child")
|
802
|
+
```
|
757
803
|
|
758
|
-
*
|
804
|
+
*Ryuta Kamizono*
|
759
805
|
|
760
|
-
*
|
806
|
+
* Support storing demodulized class name for polymorphic type.
|
761
807
|
|
762
|
-
|
808
|
+
Before Rails 6.1, storing demodulized class name is supported only for STI type
|
809
|
+
by `store_full_sti_class` class attribute.
|
763
810
|
|
764
|
-
|
811
|
+
Now `store_full_class_name` class attribute can handle both STI and polymorphic types.
|
765
812
|
|
766
|
-
*
|
813
|
+
*Ryuta Kamizono*
|
767
814
|
|
768
|
-
*
|
815
|
+
* Deprecate `rails db:structure:{load, dump}` tasks and extend
|
816
|
+
`rails db:schema:{load, dump}` tasks to work with either `:ruby` or `:sql` format,
|
817
|
+
depending on `config.active_record.schema_format` configuration value.
|
769
818
|
|
770
|
-
*
|
819
|
+
*fatkodima*
|
771
820
|
|
772
|
-
*
|
773
|
-
ar_internal_metadata's data for a test database.
|
821
|
+
* Respect the `select` values for eager loading.
|
774
822
|
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
823
|
+
```ruby
|
824
|
+
post = Post.select("UPPER(title) AS title").first
|
825
|
+
post.title # => "WELCOME TO THE WEBLOG"
|
826
|
+
post.body # => ActiveModel::MissingAttributeError
|
827
|
+
|
828
|
+
# Rails 6.0 (ignore the `select` values)
|
829
|
+
post = Post.select("UPPER(title) AS title").eager_load(:comments).first
|
830
|
+
post.title # => "Welcome to the weblog"
|
831
|
+
post.body # => "Such a lovely day"
|
832
|
+
|
833
|
+
# Rails 6.1 (respect the `select` values)
|
834
|
+
post = Post.select("UPPER(title) AS title").eager_load(:comments).first
|
835
|
+
post.title # => "WELCOME TO THE WEBLOG"
|
836
|
+
post.body # => ActiveModel::MissingAttributeError
|
781
837
|
```
|
782
838
|
|
783
|
-
|
784
|
-
```
|
785
|
-
$ RAILS_ENV=test rails dbconsole
|
786
|
-
> SELECT * FROM ar_internal_metadata;
|
787
|
-
key|value|created_at|updated_at
|
788
|
-
environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
|
789
|
-
```
|
839
|
+
*Ryuta Kamizono*
|
790
840
|
|
791
|
-
|
841
|
+
* Allow attribute's default to be configured but keeping its own type.
|
792
842
|
|
793
|
-
|
843
|
+
```ruby
|
844
|
+
class Post < ActiveRecord::Base
|
845
|
+
attribute :written_at, default: -> { Time.now.utc }
|
846
|
+
end
|
794
847
|
|
795
|
-
|
848
|
+
# Rails 6.0
|
849
|
+
Post.type_for_attribute(:written_at) # => #<Type::Value ... precision: nil, ...>
|
796
850
|
|
797
|
-
|
851
|
+
# Rails 6.1
|
852
|
+
Post.type_for_attribute(:written_at) # => #<Type::DateTime ... precision: 6, ...>
|
853
|
+
```
|
798
854
|
|
799
855
|
*Ryuta Kamizono*
|
800
856
|
|
801
|
-
*
|
857
|
+
* Allow default to be configured for Enum.
|
802
858
|
|
803
|
-
|
859
|
+
```ruby
|
860
|
+
class Book < ActiveRecord::Base
|
861
|
+
enum status: [:proposed, :written, :published], _default: :published
|
862
|
+
end
|
804
863
|
|
805
|
-
|
864
|
+
Book.new.status # => "published"
|
865
|
+
```
|
806
866
|
|
807
|
-
*
|
867
|
+
*Ryuta Kamizono*
|
808
868
|
|
809
|
-
|
869
|
+
* Deprecate YAML loading from legacy format older than Rails 5.0.
|
810
870
|
|
811
871
|
*Ryuta Kamizono*
|
812
872
|
|
813
|
-
*
|
873
|
+
* Added the setting `ActiveRecord::Base.immutable_strings_by_default`, which
|
874
|
+
allows you to specify that all string columns should be frozen unless
|
875
|
+
otherwise specified. This will reduce memory pressure for applications which
|
876
|
+
do not generally mutate string properties of Active Record objects.
|
814
877
|
|
815
|
-
|
816
|
-
this datatype in Active Record. However, the serialization of
|
817
|
-
`PostgreSQL::OID::Range` was incomplete, because it did not properly
|
818
|
-
cast the bounds that make up the range. This led to subseconds being
|
819
|
-
dropped in SQL commands:
|
878
|
+
*Sean Griffin*, *Ryuta Kamizono*
|
820
879
|
|
821
|
-
|
880
|
+
* Deprecate `map!` and `collect!` on `ActiveRecord::Result`.
|
881
|
+
|
882
|
+
*Ryuta Kamizono*
|
822
883
|
|
823
|
-
|
824
|
-
# => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
|
884
|
+
* Support `relation.and` for intersection as Set theory.
|
825
885
|
|
826
|
-
|
886
|
+
```ruby
|
887
|
+
david_and_mary = Author.where(id: [david, mary])
|
888
|
+
mary_and_bob = Author.where(id: [mary, bob])
|
827
889
|
|
828
|
-
|
829
|
-
# => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
|
890
|
+
david_and_mary.merge(mary_and_bob) # => [mary, bob]
|
830
891
|
|
831
|
-
|
892
|
+
david_and_mary.and(mary_and_bob) # => [mary]
|
893
|
+
david_and_mary.or(mary_and_bob) # => [david, mary, bob]
|
894
|
+
```
|
832
895
|
|
833
|
-
*
|
834
|
-
array.
|
896
|
+
*Ryuta Kamizono*
|
835
897
|
|
836
|
-
|
898
|
+
* Merging conditions on the same column no longer maintain both conditions,
|
899
|
+
and will be consistently replaced by the latter condition in Rails 7.0.
|
900
|
+
To migrate to Rails 7.0's behavior, use `relation.merge(other, rewhere: true)`.
|
837
901
|
|
838
|
-
|
902
|
+
```ruby
|
903
|
+
# Rails 6.1 (IN clause is replaced by merger side equality condition)
|
904
|
+
Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
|
839
905
|
|
840
|
-
|
906
|
+
# Rails 6.1 (both conflict conditions exists, deprecated)
|
907
|
+
Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
|
841
908
|
|
842
|
-
|
909
|
+
# Rails 6.1 with rewhere to migrate to Rails 7.0's behavior
|
910
|
+
Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
|
843
911
|
|
844
|
-
|
845
|
-
|
912
|
+
# Rails 7.0 (same behavior with IN clause, mergee side condition is consistently replaced)
|
913
|
+
Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
|
914
|
+
Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
|
915
|
+
```
|
846
916
|
|
847
|
-
|
917
|
+
*Ryuta Kamizono*
|
848
918
|
|
849
|
-
|
919
|
+
* Do not mark Postgresql MAC address and UUID attributes as changed when the assigned value only varies by case.
|
850
920
|
|
851
|
-
*
|
852
|
-
when lock wait timeout exceeded.
|
921
|
+
*Peter Fry*
|
853
922
|
|
854
|
-
|
923
|
+
* Resolve issue with insert_all unique_by option when used with expression index.
|
855
924
|
|
856
|
-
|
925
|
+
When the `:unique_by` option of `ActiveRecord::Persistence.insert_all` and
|
926
|
+
`ActiveRecord::Persistence.upsert_all` was used with the name of an expression index, an error
|
927
|
+
was raised. Adding a guard around the formatting behavior for the `:unique_by` corrects this.
|
857
928
|
|
858
|
-
|
929
|
+
Usage:
|
859
930
|
|
860
|
-
|
931
|
+
```ruby
|
932
|
+
create_table :books, id: :integer, force: true do |t|
|
933
|
+
t.column :name, :string
|
934
|
+
t.index "lower(name)", unique: true
|
935
|
+
end
|
861
936
|
|
862
|
-
|
937
|
+
Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
|
938
|
+
```
|
863
939
|
|
864
|
-
|
940
|
+
Fixes #39516.
|
865
941
|
|
866
|
-
|
942
|
+
*Austen Madden*
|
867
943
|
|
868
|
-
|
944
|
+
* Add basic support for CHECK constraints to database migrations.
|
869
945
|
|
870
|
-
|
946
|
+
Usage:
|
871
947
|
|
872
|
-
|
948
|
+
```ruby
|
949
|
+
add_check_constraint :products, "price > 0", name: "price_check"
|
950
|
+
remove_check_constraint :products, name: "price_check"
|
951
|
+
```
|
873
952
|
|
874
|
-
*
|
953
|
+
*fatkodima*
|
875
954
|
|
876
|
-
|
955
|
+
* Add `ActiveRecord::Base.strict_loading_by_default` and `ActiveRecord::Base.strict_loading_by_default=`
|
956
|
+
to enable/disable strict_loading mode by default for a model. The configuration's value is
|
957
|
+
inheritable by subclasses, but they can override that value and it will not impact parent class.
|
877
958
|
|
878
|
-
|
879
|
-
`references` only, as `references` can be implicitly called by `where`.
|
959
|
+
Usage:
|
880
960
|
|
881
|
-
|
961
|
+
```ruby
|
962
|
+
class Developer < ApplicationRecord
|
963
|
+
self.strict_loading_by_default = true
|
882
964
|
|
883
|
-
|
965
|
+
has_many :projects
|
966
|
+
end
|
884
967
|
|
885
|
-
|
886
|
-
|
968
|
+
dev = Developer.first
|
969
|
+
dev.projects.first
|
970
|
+
# => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.
|
971
|
+
```
|
887
972
|
|
888
|
-
*
|
973
|
+
*bogdanvlviv*
|
889
974
|
|
890
|
-
*
|
975
|
+
* Deprecate passing an Active Record object to `quote`/`type_cast` directly.
|
891
976
|
|
892
977
|
*Ryuta Kamizono*
|
893
978
|
|
894
|
-
*
|
895
|
-
`destroyed_by_association` will now be set to the reflection, matching the
|
896
|
-
behaviour of `has_many` associations.
|
979
|
+
* Default engine `ENGINE=InnoDB` is no longer dumped to make schema more agnostic.
|
897
980
|
|
898
|
-
|
981
|
+
Before:
|
899
982
|
|
900
|
-
|
983
|
+
```ruby
|
984
|
+
create_table "accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
|
985
|
+
end
|
986
|
+
```
|
901
987
|
|
902
|
-
|
903
|
-
bind values used by the `or` instead. (possibly other cases too)
|
988
|
+
After:
|
904
989
|
|
905
|
-
```
|
906
|
-
|
907
|
-
|
908
|
-
# SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 2 OR "posts"."id" = 3)
|
909
|
-
# With fix:
|
910
|
-
# SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1 OR "posts"."id" = 2)
|
990
|
+
```ruby
|
991
|
+
create_table "accounts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
992
|
+
end
|
911
993
|
```
|
912
994
|
|
913
|
-
*
|
995
|
+
*Ryuta Kamizono*
|
914
996
|
|
915
|
-
*
|
916
|
-
|
997
|
+
* Added delegated type as an alternative to single-table inheritance for representing class hierarchies.
|
998
|
+
See ActiveRecord::DelegatedType for the full description.
|
917
999
|
|
918
|
-
*
|
1000
|
+
*DHH*
|
919
1001
|
|
920
|
-
*
|
921
|
-
`current_scope`, with the exception of `unscoped`.
|
1002
|
+
* Deprecate aggregations with group by duplicated fields.
|
922
1003
|
|
923
|
-
|
1004
|
+
To migrate to Rails 7.0's behavior, use `uniq!(:group)` to deduplicate group fields.
|
924
1005
|
|
925
|
-
|
1006
|
+
```ruby
|
1007
|
+
accounts = Account.group(:firm_id)
|
1008
|
+
|
1009
|
+
# duplicated group fields, deprecated.
|
1010
|
+
accounts.merge(accounts.where.not(credit_limit: nil)).sum(:credit_limit)
|
1011
|
+
# => {
|
1012
|
+
# [1, 1] => 50,
|
1013
|
+
# [2, 2] => 60
|
1014
|
+
# }
|
1015
|
+
|
1016
|
+
# use `uniq!(:group)` to deduplicate group fields.
|
1017
|
+
accounts.merge(accounts.where.not(credit_limit: nil)).uniq!(:group).sum(:credit_limit)
|
1018
|
+
# => {
|
1019
|
+
# 1 => 50,
|
1020
|
+
# 2 => 60
|
1021
|
+
# }
|
1022
|
+
```
|
926
1023
|
|
927
|
-
*
|
1024
|
+
*Ryuta Kamizono*
|
928
1025
|
|
929
|
-
|
930
|
-
recognize 't' and 'f' as was previously serialized.
|
1026
|
+
* Deprecate duplicated query annotations.
|
931
1027
|
|
932
|
-
|
933
|
-
for SQLite databases, so it's implemented behind a configuration flag
|
934
|
-
whose default false value is deprecated.
|
1028
|
+
To migrate to Rails 7.0's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
|
935
1029
|
|
936
|
-
|
1030
|
+
```ruby
|
1031
|
+
accounts = Account.where(id: [1, 2]).annotate("david and mary")
|
937
1032
|
|
938
|
-
|
939
|
-
|
1033
|
+
# duplicated annotations, deprecated.
|
1034
|
+
accounts.merge(accounts.rewhere(id: 3))
|
1035
|
+
# SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */ /* david and mary */
|
940
1036
|
|
941
|
-
|
942
|
-
|
1037
|
+
# use `uniq!(:annotate)` to deduplicate annotations.
|
1038
|
+
accounts.merge(accounts.rewhere(id: 3)).uniq!(:annotate)
|
1039
|
+
# SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */
|
1040
|
+
```
|
943
1041
|
|
944
|
-
*
|
1042
|
+
*Ryuta Kamizono*
|
945
1043
|
|
946
|
-
*
|
947
|
-
`ActiveRecord::StatementInvalid` exceptions.
|
1044
|
+
* Resolve conflict between counter cache and optimistic locking.
|
948
1045
|
|
949
|
-
|
1046
|
+
Bump an Active Record instance's lock version after updating its counter
|
1047
|
+
cache. This avoids raising an unnecessary `ActiveRecord::StaleObjectError`
|
1048
|
+
upon subsequent transactions by maintaining parity with the corresponding
|
1049
|
+
database record's `lock_version` column.
|
950
1050
|
|
951
|
-
|
1051
|
+
Fixes #16449.
|
952
1052
|
|
953
|
-
|
1053
|
+
*Aaron Lipman*
|
954
1054
|
|
955
|
-
|
1055
|
+
* Support merging option `:rewhere` to allow mergee side condition to be replaced exactly.
|
956
1056
|
|
957
|
-
|
1057
|
+
```ruby
|
1058
|
+
david_and_mary = Author.where(id: david.id..mary.id)
|
958
1059
|
|
959
|
-
|
960
|
-
|
1060
|
+
# both conflict conditions exists
|
1061
|
+
david_and_mary.merge(Author.where(id: bob)) # => []
|
961
1062
|
|
962
|
-
|
963
|
-
|
1063
|
+
# mergee side condition is replaced by rewhere
|
1064
|
+
david_and_mary.merge(Author.rewhere(id: bob)) # => [bob]
|
964
1065
|
|
965
|
-
|
1066
|
+
# mergee side condition is replaced by rewhere option
|
1067
|
+
david_and_mary.merge(Author.where(id: bob), rewhere: true) # => [bob]
|
1068
|
+
```
|
966
1069
|
|
967
|
-
*
|
1070
|
+
*Ryuta Kamizono*
|
968
1071
|
|
969
|
-
|
970
|
-
|
971
|
-
|
1072
|
+
* Add support for finding records based on signed ids, which are tamper-proof, verified ids that can be
|
1073
|
+
set to expire and scoped with a purpose. This is particularly useful for things like password reset
|
1074
|
+
or email verification, where you want the bearer of the signed id to be able to interact with the
|
1075
|
+
underlying record, but usually only within a certain time period.
|
972
1076
|
|
973
|
-
|
1077
|
+
```ruby
|
1078
|
+
signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset
|
1079
|
+
|
1080
|
+
User.find_signed signed_id # => nil, since the purpose does not match
|
1081
|
+
|
1082
|
+
travel 16.minutes
|
1083
|
+
User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired
|
1084
|
+
|
1085
|
+
travel_back
|
1086
|
+
User.find_signed signed_id, purpose: :password_reset # => User.first
|
1087
|
+
|
1088
|
+
User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
|
1089
|
+
```
|
1090
|
+
|
1091
|
+
*DHH*
|
1092
|
+
|
1093
|
+
* Support `ALGORITHM = INSTANT` DDL option for index operations on MySQL.
|
974
1094
|
|
975
|
-
*
|
1095
|
+
*Ryuta Kamizono*
|
1096
|
+
|
1097
|
+
* Fix index creation to preserve index comment in bulk change table on MySQL.
|
976
1098
|
|
977
1099
|
*Ryuta Kamizono*
|
978
1100
|
|
979
|
-
*
|
980
|
-
without being connected.
|
1101
|
+
* Allow `unscope` to be aware of table name qualified values.
|
981
1102
|
|
982
|
-
|
1103
|
+
It is possible to unscope only the column in the specified table.
|
983
1104
|
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
on a `has_many :through` association, the child records will not be persisted.
|
1105
|
+
```ruby
|
1106
|
+
posts = Post.joins(:comments).group(:"posts.hidden")
|
1107
|
+
posts = posts.where("posts.hidden": false, "comments.hidden": false)
|
988
1108
|
|
989
|
-
|
1109
|
+
posts.count
|
1110
|
+
# => { false => 10 }
|
990
1111
|
|
991
|
-
|
992
|
-
|
1112
|
+
# unscope both hidden columns
|
1113
|
+
posts.unscope(where: :hidden).count
|
1114
|
+
# => { false => 11, true => 1 }
|
993
1115
|
|
994
|
-
|
1116
|
+
# unscope only comments.hidden column
|
1117
|
+
posts.unscope(where: :"comments.hidden").count
|
1118
|
+
# => { false => 11 }
|
1119
|
+
```
|
1120
|
+
|
1121
|
+
*Ryuta Kamizono*, *Slava Korolev*
|
1122
|
+
|
1123
|
+
* Fix `rewhere` to truly overwrite collided where clause by new where clause.
|
1124
|
+
|
1125
|
+
```ruby
|
1126
|
+
steve = Person.find_by(name: "Steve")
|
1127
|
+
david = Author.find_by(name: "David")
|
1128
|
+
|
1129
|
+
relation = Essay.where(writer: steve)
|
995
1130
|
|
1131
|
+
# Before
|
1132
|
+
relation.rewhere(writer: david).to_a # => []
|
1133
|
+
|
1134
|
+
# After
|
1135
|
+
relation.rewhere(writer: david).to_a # => [david]
|
996
1136
|
```
|
997
|
-
Author.joins(:posts).merge(Post.joins(:comments))
|
998
|
-
# Before the change:
|
999
|
-
#=> SELECT ... FROM authors INNER JOIN posts ON ... LEFT OUTER JOIN comments ON...
|
1000
1137
|
|
1001
|
-
|
1002
|
-
|
1138
|
+
*Ryuta Kamizono*
|
1139
|
+
|
1140
|
+
* Inspect time attributes with subsec and time zone offset.
|
1141
|
+
|
1142
|
+
```ruby
|
1143
|
+
p Knot.create
|
1144
|
+
=> #<Knot id: 1, created_at: "2016-05-05 01:29:47.116928000 +0000">
|
1003
1145
|
```
|
1004
1146
|
|
1005
|
-
*
|
1147
|
+
*akinomaeni*, *Jonathan Hefner*
|
1006
1148
|
|
1007
|
-
*
|
1008
|
-
`locking_column`, without default value, is null in the database.
|
1149
|
+
* Deprecate passing a column to `type_cast`.
|
1009
1150
|
|
1010
|
-
*
|
1151
|
+
*Ryuta Kamizono*
|
1011
1152
|
|
1012
|
-
*
|
1013
|
-
`locking_column` is null in the database.
|
1153
|
+
* Deprecate `in_clause_length` and `allowed_index_name_length` in `DatabaseLimits`.
|
1014
1154
|
|
1015
|
-
*
|
1155
|
+
*Ryuta Kamizono*
|
1156
|
+
|
1157
|
+
* Support bulk insert/upsert on relation to preserve scope values.
|
1158
|
+
|
1159
|
+
*Josef Šimánek*, *Ryuta Kamizono*
|
1160
|
+
|
1161
|
+
* Preserve column comment value on changing column name on MySQL.
|
1162
|
+
|
1163
|
+
*Islam Taha*
|
1164
|
+
|
1165
|
+
* Add support for `if_exists` option for removing an index.
|
1166
|
+
|
1167
|
+
The `remove_index` method can take an `if_exists` option. If this is set to true an error won't be raised if the index doesn't exist.
|
1168
|
+
|
1169
|
+
*Eileen M. Uchitelle*
|
1170
|
+
|
1171
|
+
* Remove ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base.
|
1172
|
+
|
1173
|
+
*Ryuta Kamizono*
|
1174
|
+
|
1175
|
+
* Prevent `build_association` from `touching` a parent record if the record isn't persisted for `has_one` associations.
|
1176
|
+
|
1177
|
+
Fixes #38219.
|
1178
|
+
|
1179
|
+
*Josh Brody*
|
1180
|
+
|
1181
|
+
* Add support for `if_not_exists` option for adding index.
|
1182
|
+
|
1183
|
+
The `add_index` method respects `if_not_exists` option. If it is set to true
|
1184
|
+
index won't be added.
|
1185
|
+
|
1186
|
+
Usage:
|
1187
|
+
|
1188
|
+
```ruby
|
1189
|
+
add_index :users, :account_id, if_not_exists: true
|
1190
|
+
```
|
1191
|
+
|
1192
|
+
The `if_not_exists` option passed to `create_table` also gets propagated to indexes
|
1193
|
+
created within that migration so that if table and its indexes exist then there is no
|
1194
|
+
attempt to create them again.
|
1195
|
+
|
1196
|
+
*Prathamesh Sonpatki*
|
1197
|
+
|
1198
|
+
* Add `ActiveRecord::Base#previously_new_record?` to show if a record was new before the last save.
|
1199
|
+
|
1200
|
+
*Tom Ward*
|
1201
|
+
|
1202
|
+
* Support descending order for `find_each`, `find_in_batches`, and `in_batches`.
|
1203
|
+
|
1204
|
+
Batch processing methods allow you to work with the records in batches, greatly reducing memory consumption, but records are always batched from oldest id to newest.
|
1205
|
+
|
1206
|
+
This change allows reversing the order, batching from newest to oldest. This is useful when you need to process newer batches of records first.
|
1207
|
+
|
1208
|
+
Pass `order: :desc` to yield batches in descending order. The default remains `order: :asc`.
|
1209
|
+
|
1210
|
+
```ruby
|
1211
|
+
Person.find_each(order: :desc) do |person|
|
1212
|
+
person.party_all_night!
|
1213
|
+
end
|
1214
|
+
```
|
1215
|
+
|
1216
|
+
*Alexey Vasiliev*
|
1217
|
+
|
1218
|
+
* Fix `insert_all` with enum values.
|
1219
|
+
|
1220
|
+
Fixes #38716.
|
1221
|
+
|
1222
|
+
*Joel Blum*
|
1223
|
+
|
1224
|
+
* Add support for `db:rollback:name` for multiple database applications.
|
1225
|
+
|
1226
|
+
Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
|
1227
|
+
|
1228
|
+
*Eileen M. Uchitelle*
|
1229
|
+
|
1230
|
+
* `Relation#pick` now uses already loaded results instead of making another query.
|
1231
|
+
|
1232
|
+
*Eugene Kenny*
|
1233
|
+
|
1234
|
+
* Deprecate using `return`, `break` or `throw` to exit a transaction block after writes.
|
1235
|
+
|
1236
|
+
*Dylan Thacker-Smith*
|
1237
|
+
|
1238
|
+
* Dump the schema or structure of a database when calling `db:migrate:name`.
|
1239
|
+
|
1240
|
+
In previous versions of Rails, `rails db:migrate` would dump the schema of the database. In Rails 6, that holds true (`rails db:migrate` dumps all databases' schemas), but `rails db:migrate:name` does not share that behavior.
|
1241
|
+
|
1242
|
+
Going forward, calls to `rails db:migrate:name` will dump the schema (or structure) of the database being migrated.
|
1243
|
+
|
1244
|
+
*Kyle Thompson*
|
1245
|
+
|
1246
|
+
* Reset the `ActiveRecord::Base` connection after `rails db:migrate:name`.
|
1247
|
+
|
1248
|
+
When `rails db:migrate` has finished, it ensures the `ActiveRecord::Base` connection is reset to its original configuration. Going forward, `rails db:migrate:name` will have the same behavior.
|
1249
|
+
|
1250
|
+
*Kyle Thompson*
|
1251
|
+
|
1252
|
+
* Disallow calling `connected_to` on subclasses of `ActiveRecord::Base`.
|
1253
|
+
|
1254
|
+
Behavior has not changed here but the previous API could be misleading to people who thought it would switch connections for only that class. `connected_to` switches the context from which we are getting connections, not the connections themselves.
|
1255
|
+
|
1256
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1257
|
+
|
1258
|
+
* Add support for horizontal sharding to `connects_to` and `connected_to`.
|
1259
|
+
|
1260
|
+
Applications can now connect to multiple shards and switch between their shards in an application. Note that the shard swapping is still a manual process as this change does not include an API for automatic shard swapping.
|
1261
|
+
|
1262
|
+
Usage:
|
1263
|
+
|
1264
|
+
Given the following configuration:
|
1265
|
+
|
1266
|
+
```yaml
|
1267
|
+
# config/database.yml
|
1268
|
+
production:
|
1269
|
+
primary:
|
1270
|
+
database: my_database
|
1271
|
+
primary_shard_one:
|
1272
|
+
database: my_database_shard_one
|
1273
|
+
```
|
1274
|
+
|
1275
|
+
Connect to multiple shards:
|
1276
|
+
|
1277
|
+
```ruby
|
1278
|
+
class ApplicationRecord < ActiveRecord::Base
|
1279
|
+
self.abstract_class = true
|
1280
|
+
|
1281
|
+
connects_to shards: {
|
1282
|
+
default: { writing: :primary },
|
1283
|
+
shard_one: { writing: :primary_shard_one }
|
1284
|
+
}
|
1285
|
+
```
|
1286
|
+
|
1287
|
+
Swap between shards in your controller / model code:
|
1288
|
+
|
1289
|
+
```ruby
|
1290
|
+
ActiveRecord::Base.connected_to(shard: :shard_one) do
|
1291
|
+
# Read from shard one
|
1292
|
+
end
|
1293
|
+
```
|
1294
|
+
|
1295
|
+
The horizontal sharding API also supports read replicas. See guides for more details.
|
1296
|
+
|
1297
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1298
|
+
|
1299
|
+
* Deprecate `spec_name` in favor of `name` on database configurations.
|
1300
|
+
|
1301
|
+
The accessors for `spec_name` on `configs_for` and `DatabaseConfig` are deprecated. Please use `name` instead.
|
1302
|
+
|
1303
|
+
Deprecated behavior:
|
1304
|
+
|
1305
|
+
```ruby
|
1306
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
|
1307
|
+
db_config.spec_name
|
1308
|
+
```
|
1309
|
+
|
1310
|
+
New behavior:
|
1311
|
+
|
1312
|
+
```ruby
|
1313
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "development", name: "primary")
|
1314
|
+
db_config.name
|
1315
|
+
```
|
1316
|
+
|
1317
|
+
*Eileen M. Uchitelle*
|
1318
|
+
|
1319
|
+
* Add additional database-specific rake tasks for multi-database users.
|
1320
|
+
|
1321
|
+
Previously, `rails db:create`, `rails db:drop`, and `rails db:migrate` were the only rails tasks that could operate on a single
|
1322
|
+
database. For example:
|
1323
|
+
|
1324
|
+
```
|
1325
|
+
rails db:create
|
1326
|
+
rails db:create:primary
|
1327
|
+
rails db:create:animals
|
1328
|
+
rails db:drop
|
1329
|
+
rails db:drop:primary
|
1330
|
+
rails db:drop:animals
|
1331
|
+
rails db:migrate
|
1332
|
+
rails db:migrate:primary
|
1333
|
+
rails db:migrate:animals
|
1334
|
+
```
|
1335
|
+
|
1336
|
+
With these changes, `rails db:schema:dump`, `rails db:schema:load`, `rails db:structure:dump`, `rails db:structure:load` and
|
1337
|
+
`rails db:test:prepare` can additionally operate on a single database. For example:
|
1338
|
+
|
1339
|
+
```
|
1340
|
+
rails db:schema:dump
|
1341
|
+
rails db:schema:dump:primary
|
1342
|
+
rails db:schema:dump:animals
|
1343
|
+
rails db:schema:load
|
1344
|
+
rails db:schema:load:primary
|
1345
|
+
rails db:schema:load:animals
|
1346
|
+
rails db:structure:dump
|
1347
|
+
rails db:structure:dump:primary
|
1348
|
+
rails db:structure:dump:animals
|
1349
|
+
rails db:structure:load
|
1350
|
+
rails db:structure:load:primary
|
1351
|
+
rails db:structure:load:animals
|
1352
|
+
rails db:test:prepare
|
1353
|
+
rails db:test:prepare:primary
|
1354
|
+
rails db:test:prepare:animals
|
1355
|
+
```
|
1356
|
+
|
1357
|
+
*Kyle Thompson*
|
1358
|
+
|
1359
|
+
* Add support for `strict_loading` mode on association declarations.
|
1360
|
+
|
1361
|
+
Raise an error if attempting to load a record from an association that has been marked as `strict_loading` unless it was explicitly eager loaded.
|
1362
|
+
|
1363
|
+
Usage:
|
1364
|
+
|
1365
|
+
```ruby
|
1366
|
+
class Developer < ApplicationRecord
|
1367
|
+
has_many :projects, strict_loading: true
|
1368
|
+
end
|
1369
|
+
|
1370
|
+
dev = Developer.first
|
1371
|
+
dev.projects.first
|
1372
|
+
# => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.
|
1373
|
+
```
|
1374
|
+
|
1375
|
+
*Kevin Deisz*
|
1376
|
+
|
1377
|
+
* Add support for `strict_loading` mode to prevent lazy loading of records.
|
1378
|
+
|
1379
|
+
Raise an error if a parent record is marked as `strict_loading` and attempts to lazily load its associations. This is useful for finding places you may want to preload an association and avoid additional queries.
|
1380
|
+
|
1381
|
+
Usage:
|
1382
|
+
|
1383
|
+
```ruby
|
1384
|
+
dev = Developer.strict_loading.first
|
1385
|
+
dev.audit_logs.to_a
|
1386
|
+
# => ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.
|
1387
|
+
```
|
1388
|
+
|
1389
|
+
*Eileen M. Uchitelle*, *Aaron Patterson*
|
1390
|
+
|
1391
|
+
* Add support for PostgreSQL 11+ partitioned indexes when using `upsert_all`.
|
1392
|
+
|
1393
|
+
*Sebastián Palma*
|
1394
|
+
|
1395
|
+
* Adds support for `if_not_exists` to `add_column` and `if_exists` to `remove_column`.
|
1396
|
+
|
1397
|
+
Applications can set their migrations to ignore exceptions raised when adding a column that already exists or when removing a column that does not exist.
|
1398
|
+
|
1399
|
+
Example Usage:
|
1400
|
+
|
1401
|
+
```ruby
|
1402
|
+
class AddColumnTitle < ActiveRecord::Migration[6.1]
|
1403
|
+
def change
|
1404
|
+
add_column :posts, :title, :string, if_not_exists: true
|
1405
|
+
end
|
1406
|
+
end
|
1407
|
+
```
|
1408
|
+
|
1409
|
+
```ruby
|
1410
|
+
class RemoveColumnTitle < ActiveRecord::Migration[6.1]
|
1411
|
+
def change
|
1412
|
+
remove_column :posts, :title, if_exists: true
|
1413
|
+
end
|
1414
|
+
end
|
1415
|
+
```
|
1416
|
+
|
1417
|
+
*Eileen M. Uchitelle*
|
1016
1418
|
|
1017
|
-
*
|
1419
|
+
* Regexp-escape table name for MS SQL Server.
|
1420
|
+
|
1421
|
+
Add `Regexp.escape` to one method in ActiveRecord, so that table names with regular expression characters in them work as expected. Since MS SQL Server uses "[" and "]" to quote table and column names, and those characters are regular expression characters, methods like `pluck` and `select` fail in certain cases when used with the MS SQL Server adapter.
|
1422
|
+
|
1423
|
+
*Larry Reid*
|
1424
|
+
|
1425
|
+
* Store advisory locks on their own named connection.
|
1426
|
+
|
1427
|
+
Previously advisory locks were taken out against a connection when a migration started. This works fine in single database applications but doesn't work well when migrations need to open new connections which results in the lock getting dropped.
|
1428
|
+
|
1429
|
+
In order to fix this we are storing the advisory lock on a new connection with the connection specification name `AdvisoryLockBase`. The caveat is that we need to maintain at least 2 connections to a database while migrations are running in order to do this.
|
1430
|
+
|
1431
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1432
|
+
|
1433
|
+
* Allow schema cache path to be defined in the database configuration file.
|
1434
|
+
|
1435
|
+
For example:
|
1436
|
+
|
1437
|
+
```yaml
|
1438
|
+
development:
|
1439
|
+
adapter: postgresql
|
1440
|
+
database: blog_development
|
1441
|
+
pool: 5
|
1442
|
+
schema_cache_path: tmp/schema/main.yml
|
1443
|
+
```
|
1444
|
+
|
1445
|
+
*Katrina Owen*
|
1446
|
+
|
1447
|
+
* Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
|
1448
|
+
|
1449
|
+
`#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in Rails 7.0.
|
1450
|
+
|
1451
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1452
|
+
|
1453
|
+
* Deprecate `#default_hash` and it's alias `#[]` on database configurations.
|
1454
|
+
|
1455
|
+
Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in Rails 7.0.
|
1456
|
+
|
1457
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1458
|
+
|
1459
|
+
* Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
|
1460
|
+
|
1461
|
+
*Gannon McGibbon*
|
1462
|
+
|
1463
|
+
* Find orphans by looking for missing relations through chaining `where.missing`:
|
1464
|
+
|
1465
|
+
Before:
|
1466
|
+
|
1467
|
+
```ruby
|
1468
|
+
Post.left_joins(:author).where(authors: { id: nil })
|
1469
|
+
```
|
1470
|
+
|
1471
|
+
After:
|
1472
|
+
|
1473
|
+
```ruby
|
1474
|
+
Post.where.missing(:author)
|
1475
|
+
```
|
1476
|
+
|
1477
|
+
*Tom Rossi*
|
1478
|
+
|
1479
|
+
* Ensure `:reading` connections always raise if a write is attempted.
|
1480
|
+
|
1481
|
+
Now Rails will raise an `ActiveRecord::ReadOnlyError` if any connection on the reading handler attempts to make a write. If your reading role needs to write you should name the role something other than `:reading`.
|
1482
|
+
|
1483
|
+
*Eileen M. Uchitelle*
|
1484
|
+
|
1485
|
+
* Deprecate `"primary"` as the `connection_specification_name` for `ActiveRecord::Base`.
|
1486
|
+
|
1487
|
+
`"primary"` has been deprecated as the `connection_specification_name` for `ActiveRecord::Base` in favor of using `"ActiveRecord::Base"`. This change affects calls to `ActiveRecord::Base.connection_handler.retrieve_connection` and `ActiveRecord::Base.connection_handler.remove_connection`. If you're calling these methods with `"primary"`, please switch to `"ActiveRecord::Base"`.
|
1488
|
+
|
1489
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1490
|
+
|
1491
|
+
* Add `ActiveRecord::Validations::NumericalityValidator` with
|
1492
|
+
support for casting floats using a database columns' precision value.
|
1493
|
+
|
1494
|
+
*Gannon McGibbon*
|
1495
|
+
|
1496
|
+
* Enforce fresh ETag header after a collection's contents change by adding
|
1497
|
+
ActiveRecord::Relation#cache_key_with_version. This method will be used by
|
1498
|
+
ActionController::ConditionalGet to ensure that when collection cache versioning
|
1499
|
+
is enabled, requests using ConditionalGet don't return the same ETag header
|
1500
|
+
after a collection is modified.
|
1501
|
+
|
1502
|
+
Fixes #38078.
|
1503
|
+
|
1504
|
+
*Aaron Lipman*
|
1505
|
+
|
1506
|
+
* Skip test database when running `db:create` or `db:drop` in development
|
1507
|
+
with `DATABASE_URL` set.
|
1508
|
+
|
1509
|
+
*Brian Buchalter*
|
1510
|
+
|
1511
|
+
* Don't allow mutations on the database configurations hash.
|
1512
|
+
|
1513
|
+
Freeze the configurations hash to disallow directly changing it. If applications need to change the hash, for example to create databases for parallelization, they should use the `DatabaseConfig` object directly.
|
1514
|
+
|
1515
|
+
Before:
|
1516
|
+
|
1517
|
+
```ruby
|
1518
|
+
@db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
|
1519
|
+
@db_config.configuration_hash.merge!(idle_timeout: "0.02")
|
1520
|
+
```
|
1521
|
+
|
1522
|
+
After:
|
1523
|
+
|
1524
|
+
```ruby
|
1525
|
+
@db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
|
1526
|
+
config = @db_config.configuration_hash.merge(idle_timeout: "0.02")
|
1527
|
+
db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(@db_config.env_name, @db_config.spec_name, config)
|
1528
|
+
```
|
1529
|
+
|
1530
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1531
|
+
|
1532
|
+
* Remove `:connection_id` from the `sql.active_record` notification.
|
1533
|
+
|
1534
|
+
*Aaron Patterson*, *Rafael Mendonça França*
|
1535
|
+
|
1536
|
+
* The `:name` key will no longer be returned as part of `DatabaseConfig#configuration_hash`. Please use `DatabaseConfig#owner_name` instead.
|
1537
|
+
|
1538
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1539
|
+
|
1540
|
+
* ActiveRecord's `belongs_to_required_by_default` flag can now be set per model.
|
1541
|
+
|
1542
|
+
You can now opt-out/opt-in specific models from having their associations required
|
1543
|
+
by default.
|
1544
|
+
|
1545
|
+
This change is meant to ease the process of migrating all your models to have
|
1546
|
+
their association required.
|
1547
|
+
|
1548
|
+
*Edouard Chin*
|
1549
|
+
|
1550
|
+
* The `connection_config` method has been deprecated, please use `connection_db_config` instead which will return a `DatabaseConfigurations::DatabaseConfig` instead of a `Hash`.
|
1551
|
+
|
1552
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1553
|
+
|
1554
|
+
* Retain explicit selections on the base model after applying `includes` and `joins`.
|
1555
|
+
|
1556
|
+
Resolves #34889.
|
1557
|
+
|
1558
|
+
*Patrick Rebsch*
|
1559
|
+
|
1560
|
+
* The `database` kwarg is deprecated without replacement because it can't be used for sharding and creates an issue if it's used during a request. Applications that need to create new connections should use `connects_to` instead.
|
1561
|
+
|
1562
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1563
|
+
|
1564
|
+
* Allow attributes to be fetched from Arel node groupings.
|
1565
|
+
|
1566
|
+
*Jeff Emminger*, *Gannon McGibbon*
|
1567
|
+
|
1568
|
+
* A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgreSQL `options`.
|
1569
|
+
|
1570
|
+
*Joshua Flanagan*
|
1571
|
+
|
1572
|
+
* Calling methods like `establish_connection` with a `Hash` which is invalid (eg: no `adapter`) will now raise an error the same way as connections defined in `config/database.yml`.
|
1573
|
+
|
1574
|
+
*John Crepezzi*
|
1575
|
+
|
1576
|
+
* Specifying `implicit_order_column` now subsorts the records by primary key if available to ensure deterministic results.
|
1577
|
+
|
1578
|
+
*Paweł Urbanek*
|
1579
|
+
|
1580
|
+
* `where(attr => [])` now loads an empty result without making a query.
|
1581
|
+
|
1582
|
+
*John Hawthorn*
|
1583
|
+
|
1584
|
+
* Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
|
1585
|
+
|
1586
|
+
*Hiroyuki Ishii*
|
1587
|
+
|
1588
|
+
* Add support for `belongs_to` to `has_many` inversing.
|
1589
|
+
|
1590
|
+
*Gannon McGibbon*
|
1591
|
+
|
1592
|
+
* Allow length configuration for `has_secure_token` method. The minimum length
|
1593
|
+
is set at 24 characters.
|
1594
|
+
|
1595
|
+
Before:
|
1596
|
+
|
1597
|
+
```ruby
|
1598
|
+
has_secure_token :auth_token
|
1599
|
+
```
|
1600
|
+
|
1601
|
+
After:
|
1602
|
+
|
1603
|
+
```ruby
|
1604
|
+
has_secure_token :default_token # 24 characters
|
1605
|
+
has_secure_token :auth_token, length: 36 # 36 characters
|
1606
|
+
has_secure_token :invalid_token, length: 12 # => ActiveRecord::SecureToken::MinimumLengthError
|
1607
|
+
```
|
1608
|
+
|
1609
|
+
*Bernardo de Araujo*
|
1610
|
+
|
1611
|
+
* Deprecate `DatabaseConfigurations#to_h`. These connection hashes are still available via `ActiveRecord::Base.configurations.configs_for`.
|
1612
|
+
|
1613
|
+
*Eileen Uchitelle*, *John Crepezzi*
|
1614
|
+
|
1615
|
+
* Add `DatabaseConfig#configuration_hash` to return database configuration hashes with symbol keys, and use all symbol-key configuration hashes internally. Deprecate `DatabaseConfig#config` which returns a String-keyed `Hash` with the same values.
|
1616
|
+
|
1617
|
+
*John Crepezzi*, *Eileen Uchitelle*
|
1618
|
+
|
1619
|
+
* Allow column names to be passed to `remove_index` positionally along with other options.
|
1620
|
+
|
1621
|
+
Passing other options can be necessary to make `remove_index` correctly reversible.
|
1622
|
+
|
1623
|
+
Before:
|
1624
|
+
|
1625
|
+
add_index :reports, :report_id # => works
|
1626
|
+
add_index :reports, :report_id, unique: true # => works
|
1627
|
+
remove_index :reports, :report_id # => works
|
1628
|
+
remove_index :reports, :report_id, unique: true # => ArgumentError
|
1629
|
+
|
1630
|
+
After:
|
1631
|
+
|
1632
|
+
remove_index :reports, :report_id, unique: true # => works
|
1633
|
+
|
1634
|
+
*Eugene Kenny*
|
1635
|
+
|
1636
|
+
* Allow bulk `ALTER` statements to drop and recreate indexes with the same name.
|
1637
|
+
|
1638
|
+
*Eugene Kenny*
|
1639
|
+
|
1640
|
+
* `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
|
1641
|
+
|
1642
|
+
*Eugene Kenny*
|
1643
|
+
|
1644
|
+
* Call `while_preventing_writes` directly from `connected_to`.
|
1645
|
+
|
1646
|
+
In some cases application authors want to use the database switching middleware and make explicit calls with `connected_to`. It's possible for an app to turn off writes and not turn them back on by the time we call `connected_to(role: :writing)`.
|
1647
|
+
|
1648
|
+
This change allows apps to fix this by assuming if a role is writing we want to allow writes, except in the case it's explicitly turned off.
|
1649
|
+
|
1650
|
+
*Eileen M. Uchitelle*
|
1651
|
+
|
1652
|
+
* Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
|
1018
1653
|
|
1019
1654
|
*Kir Shatrov*
|
1020
1655
|
|
1021
|
-
*
|
1656
|
+
* Stop trying to read yaml file fixtures when loading Active Record fixtures.
|
1657
|
+
|
1658
|
+
*Gannon McGibbon*
|
1659
|
+
|
1660
|
+
* Deprecate `.reorder(nil)` with `.first` / `.first!` taking non-deterministic result.
|
1661
|
+
|
1662
|
+
To continue taking non-deterministic result, use `.take` / `.take!` instead.
|
1022
1663
|
|
1023
1664
|
*Ryuta Kamizono*
|
1024
1665
|
|
1025
|
-
*
|
1666
|
+
* Preserve user supplied joins order as much as possible.
|
1667
|
+
|
1668
|
+
Fixes #36761, #34328, #24281, #12953.
|
1026
1669
|
|
1027
1670
|
*Ryuta Kamizono*
|
1028
1671
|
|
1029
|
-
*
|
1672
|
+
* Allow `matches_regex` and `does_not_match_regexp` on the MySQL Arel visitor.
|
1030
1673
|
|
1031
|
-
|
1674
|
+
*James Pearson*
|
1032
1675
|
|
1033
|
-
|
1676
|
+
* Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section.
|
1034
1677
|
|
1035
|
-
*
|
1036
|
-
in `ActiveSupport::Cache`. This also means that `ActiveRecord::Base#cache_key` will now return a stable key
|
1037
|
-
that does not include a timestamp any more.
|
1678
|
+
*Tongfei Gao*
|
1038
1679
|
|
1039
|
-
|
1040
|
-
until you set `ActiveRecord::Base.cache_versioning = true`. That's the setting for all new apps on Rails 5.2+
|
1680
|
+
* Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
|
1041
1681
|
|
1042
|
-
*
|
1682
|
+
*John Crepezzi*, *Eileen Uchitelle*
|
1043
1683
|
|
1044
|
-
*
|
1684
|
+
* Add a warning for enum elements with 'not_' prefix.
|
1045
1685
|
|
1046
|
-
|
1686
|
+
class Foo
|
1687
|
+
enum status: [:sent, :not_sent]
|
1688
|
+
end
|
1047
1689
|
|
1048
|
-
*
|
1690
|
+
*Edu Depetris*
|
1049
1691
|
|
1050
|
-
|
1692
|
+
* Make currency symbols optional for money column type in PostgreSQL.
|
1051
1693
|
|
1052
|
-
*
|
1694
|
+
*Joel Schneider*
|
1053
1695
|
|
1054
|
-
*
|
1696
|
+
* Add support for beginless ranges, introduced in Ruby 2.7.
|
1055
1697
|
|
1056
|
-
*
|
1698
|
+
*Josh Goodall*
|
1057
1699
|
|
1058
|
-
*
|
1059
|
-
when the current migration does not exist.
|
1700
|
+
* Add `database_exists?` method to connection adapters to check if a database exists.
|
1060
1701
|
|
1061
|
-
*
|
1702
|
+
*Guilherme Mansur*
|
1062
1703
|
|
1063
|
-
*
|
1704
|
+
* Loading the schema for a model that has no `table_name` raises a `TableNotSpecified` error.
|
1064
1705
|
|
1065
|
-
*
|
1706
|
+
*Guilherme Mansur*, *Eugene Kenny*
|
1066
1707
|
|
1067
|
-
*
|
1708
|
+
* PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
|
1068
1709
|
|
1069
|
-
|
1070
|
-
See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
|
1710
|
+
Fixes #36022.
|
1071
1711
|
|
1072
1712
|
*Ryuta Kamizono*
|
1073
1713
|
|
1074
|
-
*
|
1714
|
+
* Make ActiveRecord `ConnectionPool.connections` method thread-safe.
|
1075
1715
|
|
1076
|
-
|
1716
|
+
Fixes #36465.
|
1717
|
+
|
1718
|
+
*Jeff Doering*
|
1719
|
+
|
1720
|
+
* Add support for multiple databases to `rails db:abort_if_pending_migrations`.
|
1721
|
+
|
1722
|
+
*Mark Lee*
|
1723
|
+
|
1724
|
+
* Fix sqlite3 collation parsing when using decimal columns.
|
1725
|
+
|
1726
|
+
*Martin R. Schuster*
|
1727
|
+
|
1728
|
+
* Fix invalid schema when primary key column has a comment.
|
1729
|
+
|
1730
|
+
Fixes #29966.
|
1731
|
+
|
1732
|
+
*Guilherme Goettems Schneider*
|
1733
|
+
|
1734
|
+
* Fix table comment also being applied to the primary key column.
|
1735
|
+
|
1736
|
+
*Guilherme Goettems Schneider*
|
1077
1737
|
|
1078
|
-
*
|
1079
|
-
Previously this method always returned an empty array.
|
1738
|
+
* Allow generated `create_table` migrations to include or skip timestamps.
|
1080
1739
|
|
1081
|
-
*
|
1740
|
+
*Michael Duchemin*
|
1082
1741
|
|
1083
1742
|
|
1084
|
-
Please check [
|
1743
|
+
Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activerecord/CHANGELOG.md) for previous changes.
|