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