activerecord 8.0.5.1 → 8.1.0.beta1
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 +421 -657
- data/README.rdoc +1 -1
- data/lib/active_record/association_relation.rb +1 -1
- data/lib/active_record/associations/association.rb +1 -1
- data/lib/active_record/associations/belongs_to_association.rb +0 -2
- data/lib/active_record/associations/builder/association.rb +16 -5
- data/lib/active_record/associations/builder/belongs_to.rb +17 -4
- data/lib/active_record/associations/builder/collection_association.rb +7 -3
- data/lib/active_record/associations/builder/has_one.rb +1 -1
- data/lib/active_record/associations/builder/singular_association.rb +33 -5
- data/lib/active_record/associations/collection_proxy.rb +22 -4
- data/lib/active_record/associations/deprecation.rb +88 -0
- data/lib/active_record/associations/errors.rb +3 -0
- data/lib/active_record/associations/join_dependency.rb +4 -2
- data/lib/active_record/associations/preloader/batch.rb +1 -7
- data/lib/active_record/associations/preloader/branch.rb +1 -0
- data/lib/active_record/associations.rb +159 -21
- data/lib/active_record/attribute_methods/serialization.rb +16 -3
- data/lib/active_record/attribute_methods.rb +1 -1
- data/lib/active_record/attributes.rb +3 -0
- data/lib/active_record/autosave_association.rb +2 -2
- data/lib/active_record/base.rb +2 -3
- data/lib/active_record/coders/json.rb +14 -5
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +1 -3
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +15 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +51 -12
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +383 -52
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +27 -31
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +25 -18
- data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -24
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +7 -2
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +26 -34
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +2 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +88 -25
- data/lib/active_record/connection_adapters/abstract/transaction.rb +16 -3
- data/lib/active_record/connection_adapters/abstract_adapter.rb +96 -49
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +43 -11
- data/lib/active_record/connection_adapters/column.rb +17 -4
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +4 -4
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +42 -5
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +26 -4
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +27 -22
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +2 -4
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +18 -23
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +21 -10
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +8 -21
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +65 -30
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +74 -38
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +10 -12
- data/lib/active_record/connection_adapters/schema_cache.rb +2 -2
- data/lib/active_record/connection_adapters/sqlite3/column.rb +2 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +37 -25
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +0 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +3 -15
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +4 -13
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +57 -33
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +4 -3
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +1 -1
- data/lib/active_record/connection_adapters.rb +1 -0
- data/lib/active_record/connection_handling.rb +8 -12
- data/lib/active_record/core.rb +5 -4
- data/lib/active_record/counter_cache.rb +33 -8
- data/lib/active_record/database_configurations/database_config.rb +5 -1
- data/lib/active_record/database_configurations/hash_config.rb +50 -9
- data/lib/active_record/database_configurations/url_config.rb +13 -3
- data/lib/active_record/database_configurations.rb +7 -3
- data/lib/active_record/delegated_type.rb +1 -1
- data/lib/active_record/dynamic_matchers.rb +54 -69
- data/lib/active_record/encryption/encryptable_record.rb +4 -4
- data/lib/active_record/encryption/encrypted_attribute_type.rb +1 -1
- data/lib/active_record/encryption/scheme.rb +1 -1
- data/lib/active_record/enum.rb +24 -8
- data/lib/active_record/errors.rb +23 -7
- data/lib/active_record/explain_registry.rb +0 -1
- data/lib/active_record/filter_attribute_handler.rb +73 -0
- data/lib/active_record/fixtures.rb +2 -2
- data/lib/active_record/future_result.rb +0 -2
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +1 -1
- data/lib/active_record/insert_all.rb +14 -9
- data/lib/active_record/locking/optimistic.rb +7 -0
- data/lib/active_record/locking/pessimistic.rb +5 -0
- data/lib/active_record/log_subscriber.rb +1 -5
- data/lib/active_record/middleware/shard_selector.rb +34 -17
- data/lib/active_record/migration/command_recorder.rb +15 -2
- data/lib/active_record/migration/compatibility.rb +34 -24
- data/lib/active_record/migration/default_schema_versions_formatter.rb +30 -0
- data/lib/active_record/migration.rb +26 -16
- data/lib/active_record/model_schema.rb +10 -7
- data/lib/active_record/nested_attributes.rb +2 -0
- data/lib/active_record/persistence.rb +34 -3
- data/lib/active_record/query_cache.rb +22 -15
- data/lib/active_record/query_logs.rb +3 -7
- data/lib/active_record/railtie.rb +32 -3
- data/lib/active_record/railties/databases.rake +16 -4
- data/lib/active_record/railties/job_checkpoints.rb +15 -0
- data/lib/active_record/railties/job_runtime.rb +10 -11
- data/lib/active_record/reflection.rb +42 -3
- data/lib/active_record/relation/batches.rb +26 -12
- data/lib/active_record/relation/calculations.rb +20 -9
- data/lib/active_record/relation/delegation.rb +0 -1
- data/lib/active_record/relation/finder_methods.rb +28 -12
- data/lib/active_record/relation/merger.rb +2 -2
- data/lib/active_record/relation/predicate_builder/array_handler.rb +1 -3
- data/lib/active_record/relation/predicate_builder.rb +2 -2
- data/lib/active_record/relation/query_attribute.rb +3 -1
- data/lib/active_record/relation/query_methods.rb +40 -31
- data/lib/active_record/relation/where_clause.rb +2 -11
- data/lib/active_record/relation.rb +26 -14
- data/lib/active_record/result.rb +44 -21
- data/lib/active_record/sanitization.rb +2 -0
- data/lib/active_record/schema_dumper.rb +12 -10
- data/lib/active_record/scoping.rb +0 -1
- data/lib/active_record/signed_id.rb +43 -15
- data/lib/active_record/statement_cache.rb +13 -9
- data/lib/active_record/store.rb +44 -19
- data/lib/active_record/tasks/abstract_tasks.rb +76 -0
- data/lib/active_record/tasks/database_tasks.rb +2 -21
- data/lib/active_record/tasks/mysql_database_tasks.rb +3 -40
- data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -39
- data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -26
- data/lib/active_record/test_databases.rb +10 -2
- data/lib/active_record/test_fixtures.rb +27 -2
- data/lib/active_record/testing/query_assertions.rb +8 -2
- data/lib/active_record/timestamp.rb +4 -2
- data/lib/active_record/transaction.rb +2 -5
- data/lib/active_record/transactions.rb +32 -10
- data/lib/active_record/type/hash_lookup_type_map.rb +2 -1
- data/lib/active_record/type/internal/timezone.rb +7 -0
- data/lib/active_record/type/json.rb +15 -2
- data/lib/active_record/type/serialized.rb +11 -9
- data/lib/active_record/type/type_map.rb +1 -1
- data/lib/active_record/type_caster/connection.rb +2 -1
- data/lib/active_record/validations/associated.rb +1 -1
- data/lib/active_record.rb +65 -3
- data/lib/arel/alias_predication.rb +2 -0
- data/lib/arel/crud.rb +6 -11
- data/lib/arel/nodes/count.rb +2 -2
- data/lib/arel/nodes/function.rb +4 -10
- data/lib/arel/nodes/named_function.rb +2 -2
- data/lib/arel/nodes/node.rb +1 -1
- data/lib/arel/nodes.rb +0 -2
- data/lib/arel/predications.rb +3 -1
- data/lib/arel/select_manager.rb +7 -2
- data/lib/arel/visitors/dot.rb +0 -3
- data/lib/arel/visitors/postgresql.rb +55 -0
- data/lib/arel/visitors/sqlite.rb +55 -8
- data/lib/arel/visitors/to_sql.rb +3 -21
- data/lib/arel.rb +3 -1
- metadata +14 -10
- data/lib/active_record/normalization.rb +0 -163
data/CHANGELOG.md
CHANGED
|
@@ -1,194 +1,79 @@
|
|
|
1
|
-
## Rails 8.0.
|
|
1
|
+
## Rails 8.1.0.beta1 (September 04, 2025) ##
|
|
2
2
|
|
|
3
|
-
*
|
|
3
|
+
* Remove deprecated `:unsigned_float` and `:unsigned_decimal` column methods for MySQL.
|
|
4
4
|
|
|
5
|
+
*Rafael Mendonça França*
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* Fix `insert_all` and `upsert_all` log message when called on anonymous classes.
|
|
9
|
-
|
|
10
|
-
*Gabriel Sobrinho*
|
|
11
|
-
|
|
12
|
-
* Respect `ActiveRecord::SchemaDumper.ignore_tables` when dumping SQLite virtual tables.
|
|
13
|
-
|
|
14
|
-
*Hans Schnedlitz*
|
|
15
|
-
|
|
16
|
-
* Restore previous instrumenter after `execute_or_skip`
|
|
17
|
-
|
|
18
|
-
`FutureResult#execute_or_skip` replaces the thread's instrumenter with an
|
|
19
|
-
`EventBuffer` to collect events published during async query execution.
|
|
20
|
-
If the global async executor is saturated and the `caller_runs` fallback
|
|
21
|
-
executes the task on the calling thread, we need to make sure the previous
|
|
22
|
-
instrumenter is restored or the stale `EventBuffer` would stay in place and
|
|
23
|
-
permanently swallow all subsequent `sql.active_record` notifications on
|
|
24
|
-
that thread.
|
|
25
|
-
|
|
26
|
-
*Rosa Gutierrez*
|
|
27
|
-
|
|
28
|
-
* Fix Ruby 4.0 delegator warning when calling inspect on ActiveRecord::Type::Serialized.
|
|
29
|
-
|
|
30
|
-
*Hammad Khan*
|
|
31
|
-
|
|
32
|
-
* Fix support for table names containing hyphens.
|
|
33
|
-
|
|
34
|
-
*Evgeniy Demin*
|
|
35
|
-
|
|
36
|
-
* Fix column deduplication for SQLite3 and PostgreSQL virtual (generated) columns.
|
|
37
|
-
|
|
38
|
-
`Column#==` and `Column#hash` now account for `virtual?` so that the
|
|
39
|
-
`Deduplicable` registry does not treat a generated column and a regular
|
|
40
|
-
column with the same name and type as identical. Previously, if a
|
|
41
|
-
generated column was registered first, a regular column on a different
|
|
42
|
-
table could be deduplicated to the generated instance, silently
|
|
43
|
-
excluding it from INSERT/UPDATE statements.
|
|
44
|
-
|
|
45
|
-
*Jay Huber*
|
|
46
|
-
|
|
47
|
-
* Fix merging relations with arel equality predicates with null relations.
|
|
48
|
-
|
|
49
|
-
*fatkodima*
|
|
50
|
-
|
|
51
|
-
* Fix SQLite3 schema dump for non-autoincrement integer primary keys.
|
|
52
|
-
|
|
53
|
-
Previously, `schema.rb` should incorrectly restore that table with an auto incrementing
|
|
54
|
-
primary key.
|
|
55
|
-
|
|
56
|
-
*Chris Hasiński*
|
|
57
|
-
|
|
58
|
-
* Fix PostgreSQL `schema_search_path` not being reapplied after `reset!` or `reconnect!`.
|
|
59
|
-
|
|
60
|
-
The `schema_search_path` configured in `database.yml` is now correctly
|
|
61
|
-
reapplied instead of falling back to PostgreSQL defaults.
|
|
62
|
-
|
|
63
|
-
*Tobias Egli*
|
|
64
|
-
|
|
65
|
-
* Ensure batched preloaded associations accounts for klass when grouping to avoid issues with STI.
|
|
66
|
-
|
|
67
|
-
*zzak*, *Stjepan Hadjic*
|
|
68
|
-
|
|
69
|
-
* Fix `ActiveRecord::SoleRecordExceeded#record` to return the relation.
|
|
70
|
-
|
|
71
|
-
This was the case until Rails 7.2, but starting from 8.0 it
|
|
72
|
-
started mistakenly returning the model class.
|
|
73
|
-
|
|
74
|
-
*Jean Boussier*
|
|
75
|
-
|
|
76
|
-
* Improve PostgreSQLAdapter resilience to Timeout.timeout.
|
|
77
|
-
|
|
78
|
-
Better handle asynchronous exceptions being thrown inside
|
|
79
|
-
the `reconnect!` method.
|
|
80
|
-
|
|
81
|
-
This may fixes some deep errors such as:
|
|
82
|
-
|
|
83
|
-
```
|
|
84
|
-
undefined method `key?' for nil:NilClass (NoMethodError)
|
|
85
|
-
if !type_map.key?(oid)
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
*Jean Boussier*
|
|
89
|
-
|
|
90
|
-
* Fix `eager_load` when loading `has_many` assocations with composite primary keys.
|
|
91
|
-
|
|
92
|
-
This would result in some records being loaded multiple times.
|
|
93
|
-
|
|
94
|
-
*Martin-Alexander*
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
## Rails 8.0.4.1 (March 23, 2026) ##
|
|
98
|
-
|
|
99
|
-
* No changes.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
## Rails 8.0.4 (October 28, 2025) ##
|
|
103
|
-
|
|
104
|
-
* Fix SQLite3 data loss during table alterations with CASCADE foreign keys.
|
|
105
|
-
|
|
106
|
-
When altering a table in SQLite3 that is referenced by child tables with
|
|
107
|
-
`ON DELETE CASCADE` foreign keys, ActiveRecord would silently delete all
|
|
108
|
-
data from the child tables. This occurred because SQLite requires table
|
|
109
|
-
recreation for schema changes, and during this process the original table
|
|
110
|
-
is temporarily dropped, triggering CASCADE deletes on child tables.
|
|
111
|
-
|
|
112
|
-
The root cause was incorrect ordering of operations. The original code
|
|
113
|
-
wrapped `disable_referential_integrity` inside a transaction, but
|
|
114
|
-
`PRAGMA foreign_keys` cannot be modified inside a transaction in SQLite -
|
|
115
|
-
attempting to do so simply has no effect. This meant foreign keys remained
|
|
116
|
-
enabled during table recreation, causing CASCADE deletes to fire.
|
|
117
|
-
|
|
118
|
-
The fix reverses the order to follow the official SQLite 12-step ALTER TABLE
|
|
119
|
-
procedure: `disable_referential_integrity` now wraps the transaction instead
|
|
120
|
-
of being wrapped by it. This ensures foreign keys are properly disabled
|
|
121
|
-
before the transaction starts and re-enabled after it commits, preventing
|
|
122
|
-
CASCADE deletes while maintaining data integrity through atomic transactions.
|
|
123
|
-
|
|
124
|
-
*Ruy Rocha*
|
|
125
|
-
|
|
126
|
-
* Add support for bound SQL literals in CTEs.
|
|
127
|
-
|
|
128
|
-
*Nicolas Bachschmidt*
|
|
129
|
-
|
|
130
|
-
* Fix `belongs_to` associations not to clear the entire composite primary key.
|
|
131
|
-
|
|
132
|
-
When clearing a `belongs_to` association that references a model with composite primary key,
|
|
133
|
-
only the optional part of the key should be cleared.
|
|
134
|
-
|
|
135
|
-
*zzak*
|
|
136
|
-
|
|
137
|
-
* Fix invalid records being autosaved when distantly associated records are marked for deletion.
|
|
7
|
+
* Remove deprecated `:retries` option for the SQLite3 adapter.
|
|
138
8
|
|
|
139
|
-
*
|
|
9
|
+
*Rafael Mendonça França*
|
|
140
10
|
|
|
11
|
+
* Introduce new database configuration options `keepalive`, `max_age`, and
|
|
12
|
+
`min_connections` -- and rename `pool` to `max_connections` to match.
|
|
141
13
|
|
|
142
|
-
|
|
14
|
+
There are no changes to default behavior, but these allow for more specific
|
|
15
|
+
control over pool behavior.
|
|
143
16
|
|
|
144
|
-
*
|
|
17
|
+
*Matthew Draper*, *Chris AtLee*, *Rachael Wright-Munn*
|
|
145
18
|
|
|
146
|
-
|
|
147
|
-
for each thread.
|
|
19
|
+
* Move `LIMIT` validation from query generation to when `limit()` is called.
|
|
148
20
|
|
|
149
|
-
|
|
21
|
+
*Hartley McGuire*, *Shuyang*
|
|
150
22
|
|
|
151
|
-
|
|
23
|
+
* Add `ActiveRecord::CheckViolation` error class for check constraint violations.
|
|
152
24
|
|
|
153
|
-
*
|
|
25
|
+
*Ryuta Kamizono*
|
|
154
26
|
|
|
155
|
-
|
|
27
|
+
* Add `ActiveRecord::ExclusionViolation` error class for exclusion constraint violations.
|
|
156
28
|
|
|
157
|
-
|
|
29
|
+
When an exclusion constraint is violated in PostgreSQL, the error will now be raised
|
|
30
|
+
as `ActiveRecord::ExclusionViolation` instead of the generic `ActiveRecord::StatementInvalid`,
|
|
31
|
+
making it easier to handle these specific constraint violations in application code.
|
|
158
32
|
|
|
159
|
-
|
|
160
|
-
|
|
33
|
+
This follows the same pattern as other constraint violation error classes like
|
|
34
|
+
`RecordNotUnique` for unique constraint violations and `InvalidForeignKey` for
|
|
35
|
+
foreign key constraint violations.
|
|
161
36
|
|
|
162
|
-
*
|
|
37
|
+
*Ryuta Kamizono*
|
|
163
38
|
|
|
164
|
-
*
|
|
165
|
-
|
|
166
|
-
Rollback still runs, but may take longer.
|
|
39
|
+
* Attributes filtered by `filter_attributes` will now also be filtered by `filter_parameters`
|
|
40
|
+
so sensitive information is not leaked.
|
|
167
41
|
|
|
168
|
-
*
|
|
42
|
+
*Jill Klang*
|
|
169
43
|
|
|
170
|
-
*
|
|
44
|
+
* Add `connection.current_transaction.isolation` API to check current transaction's isolation level.
|
|
171
45
|
|
|
172
|
-
|
|
46
|
+
Returns the isolation level if it was explicitly set via the `isolation:` parameter
|
|
47
|
+
or through `ActiveRecord.with_transaction_isolation_level`, otherwise returns `nil`.
|
|
48
|
+
Nested transactions return the parent transaction's isolation level.
|
|
173
49
|
|
|
174
|
-
|
|
50
|
+
```ruby
|
|
51
|
+
# Returns nil when no transaction
|
|
52
|
+
User.connection.current_transaction.isolation # => nil
|
|
175
53
|
|
|
176
|
-
|
|
54
|
+
# Returns explicitly set isolation level
|
|
55
|
+
User.transaction(isolation: :serializable) do
|
|
56
|
+
User.connection.current_transaction.isolation # => :serializable
|
|
57
|
+
end
|
|
177
58
|
|
|
178
|
-
|
|
59
|
+
# Returns nil when isolation not explicitly set
|
|
60
|
+
User.transaction do
|
|
61
|
+
User.connection.current_transaction.isolation # => nil
|
|
62
|
+
end
|
|
179
63
|
|
|
64
|
+
# Nested transactions inherit parent's isolation
|
|
65
|
+
User.transaction(isolation: :read_committed) do
|
|
66
|
+
User.transaction do
|
|
67
|
+
User.connection.current_transaction.isolation # => :read_committed
|
|
68
|
+
end
|
|
69
|
+
end
|
|
180
70
|
```
|
|
181
|
-
primary:
|
|
182
|
-
schema_format: ruby
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
Useful in multi-database setups to have different formats per-database.
|
|
186
71
|
|
|
187
|
-
*
|
|
72
|
+
*Kir Shatrov*
|
|
188
73
|
|
|
189
|
-
*
|
|
74
|
+
* Emit a warning for pg gem < 1.6.0 when using PostgreSQL 18+
|
|
190
75
|
|
|
191
|
-
*
|
|
76
|
+
*Yasuo Honda*
|
|
192
77
|
|
|
193
78
|
* Fix `#merge` with `#or` or `#and` and a mixture of attributes and SQL strings resulting in an incorrect query.
|
|
194
79
|
|
|
@@ -228,722 +113,601 @@
|
|
|
228
113
|
|
|
229
114
|
*Joshua Young*
|
|
230
115
|
|
|
231
|
-
*
|
|
232
|
-
|
|
233
|
-
*fatkodima*
|
|
234
|
-
|
|
235
|
-
* Fix migration log message for down operations.
|
|
236
|
-
|
|
237
|
-
*Bernardo Barreto*
|
|
238
|
-
|
|
239
|
-
* Prepend `extra_flags` in postgres' `structure_load`
|
|
240
|
-
|
|
241
|
-
When specifying `structure_load_flags` with a postgres adapter, the flags
|
|
242
|
-
were appended to the default flags, instead of prepended.
|
|
243
|
-
This caused issues with flags not being taken into account by postgres.
|
|
244
|
-
|
|
245
|
-
*Alice Loeser*
|
|
246
|
-
|
|
247
|
-
* Fix `annotate` comments to propagate to `update_all`/`delete_all`.
|
|
116
|
+
* Make schema dumper to account for `ActiveRecord.dump_schemas` when dumping in `:ruby` format.
|
|
248
117
|
|
|
249
118
|
*fatkodima*
|
|
250
119
|
|
|
251
|
-
*
|
|
252
|
-
loaded `has_and_belongs_to_many` association.
|
|
253
|
-
|
|
254
|
-
*Hartley McGuire*
|
|
255
|
-
|
|
256
|
-
* `create_or_find_by` will now correctly rollback a transaction.
|
|
257
|
-
|
|
258
|
-
When using `create_or_find_by`, raising a ActiveRecord::Rollback error
|
|
259
|
-
in a `after_save` callback had no effect, the transaction was committed
|
|
260
|
-
and a record created.
|
|
261
|
-
|
|
262
|
-
*Edouard Chin*
|
|
263
|
-
|
|
264
|
-
* Gracefully handle `Timeout.timeout` firing during connection configuration.
|
|
265
|
-
|
|
266
|
-
Use of `Timeout.timeout` could result in improperly initialized database connection.
|
|
267
|
-
|
|
268
|
-
This could lead to a partially configured connection being used, resulting in various exceptions,
|
|
269
|
-
the most common being with the PostgreSQLAdapter raising `undefined method 'key?' for nil`
|
|
270
|
-
or `TypeError: wrong argument type nil (expected PG::TypeMap)`.
|
|
271
|
-
|
|
272
|
-
*Jean Boussier*
|
|
273
|
-
|
|
274
|
-
* Fix stale state for composite foreign keys in belongs_to associations.
|
|
275
|
-
|
|
276
|
-
*Varun Sharma*
|
|
277
|
-
|
|
120
|
+
* Add `:touch` option to `update_column`/`update_columns` methods.
|
|
278
121
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
[CVE-2025-55193]
|
|
122
|
+
```ruby
|
|
123
|
+
# Will update :updated_at/:updated_on alongside :nice column.
|
|
124
|
+
user.update_column(:nice, true, touch: true)
|
|
284
125
|
|
|
285
|
-
|
|
126
|
+
# Will update :updated_at/:updated_on alongside :last_ip column
|
|
127
|
+
user.update_columns(last_ip: request.remote_ip, touch: true)
|
|
128
|
+
```
|
|
286
129
|
|
|
130
|
+
*Dmitrii Ivliev*
|
|
287
131
|
|
|
288
|
-
|
|
132
|
+
* Optimize Active Record batching further when using ranges.
|
|
289
133
|
|
|
290
|
-
|
|
134
|
+
Tested on a PostgreSQL table with 10M records and batches of 10k records, the generation
|
|
135
|
+
of relations for the 1000 batches was `4.8x` faster (`6.8s` vs. `1.4s`), used `900x`
|
|
136
|
+
less bandwidth (`180MB` vs. `0.2MB`) and allocated `45x` less memory (`490MB` vs. `11MB`).
|
|
291
137
|
|
|
292
|
-
*fatkodima*
|
|
138
|
+
*Maxime Réty*, *fatkodima*
|
|
293
139
|
|
|
294
|
-
*
|
|
140
|
+
* Include current character length in error messages for index and table name length validations.
|
|
295
141
|
|
|
296
|
-
*
|
|
297
|
-
|
|
298
|
-
* Fix inverting `drop_table` without options.
|
|
299
|
-
|
|
300
|
-
*fatkodima*
|
|
142
|
+
*Joshua Young*
|
|
301
143
|
|
|
302
|
-
*
|
|
144
|
+
* Add `rename_schema` method for PostgreSQL.
|
|
303
145
|
|
|
304
|
-
*
|
|
305
|
-
|
|
306
|
-
* Fix `sum` with qualified name on loaded relation.
|
|
146
|
+
*T S Vallender*
|
|
307
147
|
|
|
308
|
-
|
|
148
|
+
* Implement support for deprecating associations:
|
|
309
149
|
|
|
310
|
-
|
|
150
|
+
```ruby
|
|
151
|
+
has_many :posts, deprecated: true
|
|
152
|
+
```
|
|
311
153
|
|
|
312
|
-
|
|
154
|
+
With that, Active Record will report any usage of the `posts` association.
|
|
313
155
|
|
|
314
|
-
|
|
156
|
+
Three reporting modes are supported (`:warn`, `:raise`, and `:notify`), and
|
|
157
|
+
backtraces can be enabled or disabled. Defaults are `:warn` mode and
|
|
158
|
+
disabled backtraces.
|
|
315
159
|
|
|
316
|
-
|
|
317
|
-
comparing it with the minimum required version for the adapter. This meant that the connection could
|
|
318
|
-
never be successfully configured on subsequent reconnection attempts.
|
|
160
|
+
Please, check the docs for further details.
|
|
319
161
|
|
|
320
|
-
|
|
321
|
-
and ensuring the version isn't cached, which allows the version to be retrieved on the next connection attempt.
|
|
162
|
+
*Xavier Noria*
|
|
322
163
|
|
|
323
|
-
|
|
164
|
+
* PostgreSQL adapter create DB now supports `locale_provider` and `locale`.
|
|
324
165
|
|
|
325
|
-
*
|
|
166
|
+
*Bengt-Ove Hollaender*
|
|
326
167
|
|
|
327
|
-
|
|
328
|
-
This could lead to a partially configured connection being used, resulting in various exceptions,
|
|
329
|
-
the most common being with the PostgreSQLAdapter raising `undefined method `key?' for nil`
|
|
330
|
-
or `TypeError: wrong argument type nil (expected PG::TypeMap)`.
|
|
168
|
+
* Use ntuples to populate row_count instead of count for Postgres
|
|
331
169
|
|
|
332
|
-
*
|
|
170
|
+
*Jonathan Calvert*
|
|
333
171
|
|
|
334
|
-
* Fix
|
|
172
|
+
* Fix checking whether an unpersisted record is `include?`d in a strictly
|
|
173
|
+
loaded `has_and_belongs_to_many` association.
|
|
335
174
|
|
|
336
175
|
*Hartley McGuire*
|
|
337
176
|
|
|
338
|
-
*
|
|
177
|
+
* Add ability to change transaction isolation for all pools within a block.
|
|
339
178
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
* PoolConfig no longer keeps a reference to the connection class.
|
|
179
|
+
This functionality is useful if your application needs to change the database
|
|
180
|
+
transaction isolation for a request or action.
|
|
343
181
|
|
|
344
|
-
|
|
345
|
-
|
|
182
|
+
Calling `ActiveRecord.with_transaction_isolation_level(level) {}` in an around filter or
|
|
183
|
+
middleware will set the transaction isolation for all pools accessed within the block,
|
|
184
|
+
but not for the pools that aren't.
|
|
346
185
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
* Fix SQL notifications sometimes not sent when using async queries.
|
|
186
|
+
This works with explicit and implicit transactions:
|
|
350
187
|
|
|
351
188
|
```ruby
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
189
|
+
ActiveRecord.with_transaction_isolation_level(:read_committed) do
|
|
190
|
+
Tag.transaction do # opens a transaction explicitly
|
|
191
|
+
Tag.create!
|
|
192
|
+
end
|
|
355
193
|
end
|
|
356
194
|
```
|
|
357
195
|
|
|
358
|
-
In rare circumstances and under the right race condition, Active Support notifications
|
|
359
|
-
would no longer be dispatched after using an asynchronous query.
|
|
360
|
-
This is now fixed.
|
|
361
|
-
|
|
362
|
-
*Edouard Chin*
|
|
363
|
-
|
|
364
|
-
* Fix support for PostgreSQL enum types with commas in their name.
|
|
365
|
-
|
|
366
|
-
*Arthur Hess*
|
|
367
|
-
|
|
368
|
-
* Fix inserts on MySQL with no RETURNING support for a table with multiple auto populated columns.
|
|
369
|
-
|
|
370
|
-
*Nikita Vasilevsky*
|
|
371
|
-
|
|
372
|
-
* Fix joining on a scoped association with string joins and bind parameters.
|
|
373
|
-
|
|
374
196
|
```ruby
|
|
375
|
-
|
|
376
|
-
|
|
197
|
+
ActiveRecord.with_transaction_isolation_level(:read_committed) do
|
|
198
|
+
Tag.create! # opens a transaction implicitly
|
|
377
199
|
end
|
|
378
|
-
|
|
379
|
-
class InstructorRole < ActiveRecord::Base
|
|
380
|
-
scope :active, -> {
|
|
381
|
-
joins("JOIN students ON instructor_roles.student_id = students.id")
|
|
382
|
-
.where(students { status: 1 })
|
|
383
|
-
}
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
Instructor.joins(:instructor_roles).first
|
|
387
200
|
```
|
|
388
201
|
|
|
389
|
-
|
|
390
|
-
`active` scope bind parameters would be lost.
|
|
391
|
-
|
|
392
|
-
*Jean Boussier*
|
|
393
|
-
|
|
394
|
-
* Fix a potential race condition with system tests and transactional fixtures.
|
|
395
|
-
|
|
396
|
-
*Sjoerd Lagarde*
|
|
202
|
+
*Eileen M. Uchitelle*
|
|
397
203
|
|
|
398
|
-
*
|
|
204
|
+
* Raise `ActiveRecord::MissingRequiredOrderError` when order dependent finder methods (e.g. `#first`, `#last`) are
|
|
205
|
+
called without `order` values on the relation, and the model does not have any order columns (`implicit_order_column`,
|
|
206
|
+
`query_constraints`, or `primary_key`) to fall back on.
|
|
399
207
|
|
|
400
|
-
|
|
401
|
-
|
|
208
|
+
This change will be introduced with a new framework default for Rails 8.1, and the current behavior of not raising
|
|
209
|
+
an error has been deprecated with the aim of removing the configuration option in Rails 8.2.
|
|
402
210
|
|
|
403
211
|
```ruby
|
|
404
|
-
|
|
212
|
+
config.active_record.raise_on_missing_required_finder_order_columns = true
|
|
405
213
|
```
|
|
406
214
|
|
|
407
|
-
*Jean Boussier*
|
|
408
|
-
|
|
409
|
-
* Remember when a database connection has recently been verified (for
|
|
410
|
-
two seconds, by default), to avoid repeated reverifications during a
|
|
411
|
-
single request.
|
|
412
|
-
|
|
413
|
-
This should recreate a similar rate of verification as in Rails 7.1,
|
|
414
|
-
where connections are leased for the duration of a request, and thus
|
|
415
|
-
only verified once.
|
|
416
|
-
|
|
417
|
-
*Matthew Draper*
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
## Rails 8.0.1 (December 13, 2024) ##
|
|
421
|
-
|
|
422
|
-
* Fix removing foreign keys with :restrict action for MySQL.
|
|
423
|
-
|
|
424
|
-
*fatkodima*
|
|
425
|
-
|
|
426
|
-
* Fix a race condition in `ActiveRecord::Base#method_missing` when lazily defining attributes.
|
|
427
|
-
|
|
428
|
-
If multiple thread were concurrently triggering attribute definition on the same model,
|
|
429
|
-
it could result in a `NoMethodError` being raised.
|
|
430
|
-
|
|
431
|
-
*Jean Boussier*
|
|
432
|
-
|
|
433
|
-
* Fix MySQL default functions getting dropped when changing a column's nullability.
|
|
434
|
-
|
|
435
|
-
*Bastian Bartmann*
|
|
436
|
-
|
|
437
|
-
* Fix `add_unique_constraint`/`add_check_constraint`/`add_foreign_key` to be revertible when given invalid options.
|
|
438
|
-
|
|
439
|
-
*fatkodima*
|
|
440
|
-
|
|
441
|
-
* Fix asynchronous destroying of polymorphic `belongs_to` associations.
|
|
442
|
-
|
|
443
|
-
*fatkodima*
|
|
444
|
-
|
|
445
|
-
* Fix `insert_all` to not update existing records.
|
|
446
|
-
|
|
447
|
-
*fatkodima*
|
|
448
|
-
|
|
449
|
-
* `NOT VALID` constraints should not dump in `create_table`.
|
|
450
|
-
|
|
451
|
-
*Ryuta Kamizono*
|
|
452
|
-
|
|
453
|
-
* Fix finding by nil composite primary key association.
|
|
454
|
-
|
|
455
|
-
*fatkodima*
|
|
456
|
-
|
|
457
|
-
* Properly reset composite primary key configuration when setting a primary key.
|
|
458
|
-
|
|
459
|
-
*fatkodima*
|
|
460
|
-
|
|
461
|
-
* Fix Mysql2Adapter support for prepared statements
|
|
462
|
-
|
|
463
|
-
Using prepared statements with MySQL could result in a `NoMethodError` exception.
|
|
464
|
-
|
|
465
|
-
*Jean Boussier*, *Leo Arnold*, *zzak*
|
|
466
|
-
|
|
467
|
-
* Fix parsing of SQLite foreign key names when they contain non-ASCII characters
|
|
468
|
-
|
|
469
|
-
*Zacharias Knudsen*
|
|
470
|
-
|
|
471
|
-
* Fix parsing of MySQL 8.0.16+ CHECK constraints when they contain new lines.
|
|
472
|
-
|
|
473
|
-
*Steve Hill*
|
|
474
|
-
|
|
475
|
-
* Ensure normalized attribute queries use `IS NULL` consistently for `nil` and normalized `nil` values.
|
|
476
|
-
|
|
477
215
|
*Joshua Young*
|
|
478
216
|
|
|
479
|
-
*
|
|
217
|
+
* `:class_name` is now invalid in polymorphic `belongs_to` associations.
|
|
480
218
|
|
|
481
|
-
`
|
|
219
|
+
Reason is `:class_name` does not make sense in those associations because
|
|
220
|
+
the class name of target records is dynamic and stored in the type column.
|
|
482
221
|
|
|
483
|
-
|
|
222
|
+
Existing polymorphic associations setting this option can just delete it.
|
|
223
|
+
While it did not raise, it had no effect anyway.
|
|
484
224
|
|
|
485
|
-
*
|
|
225
|
+
*Xavier Noria*
|
|
486
226
|
|
|
487
|
-
|
|
227
|
+
* Add support for multiple databases to `db:migrate:reset`.
|
|
488
228
|
|
|
229
|
+
*Joé Dupuis*
|
|
489
230
|
|
|
490
|
-
|
|
231
|
+
* Add `affected_rows` to `ActiveRecord::Result`.
|
|
491
232
|
|
|
492
|
-
*
|
|
233
|
+
*Jenny Shen*
|
|
493
234
|
|
|
235
|
+
* Enable passing retryable SqlLiterals to `#where`.
|
|
494
236
|
|
|
495
|
-
|
|
237
|
+
*Hartley McGuire*
|
|
496
238
|
|
|
497
|
-
*
|
|
239
|
+
* Set default for primary keys in `insert_all`/`upsert_all`.
|
|
498
240
|
|
|
499
|
-
|
|
241
|
+
Previously in Postgres, updating and inserting new records in one upsert wasn't possible
|
|
242
|
+
due to null primary key values. `nil` primary key values passed into `insert_all`/`upsert_all`
|
|
243
|
+
are now implicitly set to the default insert value specified by adapter.
|
|
500
244
|
|
|
501
|
-
*
|
|
245
|
+
*Jenny Shen*
|
|
502
246
|
|
|
247
|
+
* Add a load hook `active_record_database_configurations` for `ActiveRecord::DatabaseConfigurations`
|
|
503
248
|
|
|
504
|
-
|
|
249
|
+
*Mike Dalessio*
|
|
505
250
|
|
|
506
|
-
*
|
|
251
|
+
* Use `TRUE` and `FALSE` for SQLite queries with boolean columns.
|
|
507
252
|
|
|
508
|
-
*
|
|
253
|
+
*Hartley McGuire*
|
|
509
254
|
|
|
510
|
-
*
|
|
255
|
+
* Bump minimum supported SQLite to 3.23.0.
|
|
511
256
|
|
|
512
|
-
|
|
513
|
-
is created, leading to potential loss of data if a database is added to an
|
|
514
|
-
existing environment.
|
|
257
|
+
*Hartley McGuire*
|
|
515
258
|
|
|
516
|
-
|
|
517
|
-
are loaded during `db:prepare` which defaults to `true` for primary database
|
|
518
|
-
configs and `false` otherwise.
|
|
259
|
+
* Allow allocated Active Records to lookup associations.
|
|
519
260
|
|
|
520
|
-
|
|
261
|
+
Previously, the association cache isn't setup on allocated record objects, so association
|
|
262
|
+
lookups will crash. Test frameworks like mocha use allocate to check for stubbable instance
|
|
263
|
+
methods, which can trigger an association lookup.
|
|
521
264
|
|
|
522
|
-
*
|
|
265
|
+
*Gannon McGibbon*
|
|
523
266
|
|
|
524
|
-
*
|
|
267
|
+
* Encryption now supports `support_unencrypted_data: true` being set per-attribute.
|
|
525
268
|
|
|
526
|
-
|
|
269
|
+
Previously this only worked if `ActiveRecord::Encryption.config.support_unencrypted_data == true`.
|
|
270
|
+
Now, if the global config is turned off, you can still opt in for a specific attribute.
|
|
527
271
|
|
|
528
|
-
|
|
272
|
+
```ruby
|
|
273
|
+
# ActiveRecord::Encryption.config.support_unencrypted_data = true
|
|
274
|
+
class User < ActiveRecord::Base
|
|
275
|
+
encrypts :name, support_unencrypted_data: false # only supports encrypted data
|
|
276
|
+
encrypts :email # supports encrypted or unencrypted data
|
|
277
|
+
end
|
|
278
|
+
```
|
|
529
279
|
|
|
530
|
-
|
|
280
|
+
```ruby
|
|
281
|
+
# ActiveRecord::Encryption.config.support_unencrypted_data = false
|
|
282
|
+
class User < ActiveRecord::Base
|
|
283
|
+
encrypts :name, support_unencrypted_data: true # supports encrypted or unencrypted data
|
|
284
|
+
encrypts :email # only supports encrypted data
|
|
285
|
+
end
|
|
286
|
+
```
|
|
531
287
|
|
|
532
|
-
*
|
|
288
|
+
*Alex Ghiculescu*
|
|
533
289
|
|
|
534
|
-
|
|
290
|
+
* Model generator no longer needs a database connection to validate column types.
|
|
535
291
|
|
|
292
|
+
*Mike Dalessio*
|
|
536
293
|
|
|
537
|
-
|
|
294
|
+
* Allow signed ID verifiers to be configurable via `Rails.application.message_verifiers`
|
|
538
295
|
|
|
539
|
-
|
|
296
|
+
Prior to this change, the primary way to configure signed ID verifiers was
|
|
297
|
+
to set `signed_id_verifier` on each model class:
|
|
540
298
|
|
|
541
|
-
|
|
299
|
+
```ruby
|
|
300
|
+
Post.signed_id_verifier = ActiveSupport::MessageVerifier.new(...)
|
|
301
|
+
Comment.signed_id_verifier = ActiveSupport::MessageVerifier.new(...)
|
|
302
|
+
```
|
|
542
303
|
|
|
543
|
-
|
|
304
|
+
And if the developer did not set `signed_id_verifier`, a verifier would be
|
|
305
|
+
instantiated with a secret derived from `secret_key_base` and the following
|
|
306
|
+
options:
|
|
544
307
|
|
|
545
|
-
|
|
308
|
+
```ruby
|
|
309
|
+
{ digest: "SHA256", serializer: JSON, url_safe: true }
|
|
310
|
+
```
|
|
546
311
|
|
|
547
|
-
|
|
312
|
+
Thus it was cumbersome to rotate configuration for all verifiers.
|
|
548
313
|
|
|
549
|
-
|
|
314
|
+
This change defines a new Rails config: [`config.active_record.use_legacy_signed_id_verifier`][].
|
|
315
|
+
The default value is `:generate_and_verify`, which preserves the previous
|
|
316
|
+
behavior. However, when set to `:verify`, signed ID verifiers will use
|
|
317
|
+
configuration from `Rails.application.message_verifiers` (specifically,
|
|
318
|
+
`Rails.application.message_verifiers["active_record/signed_id"]`) to
|
|
319
|
+
generate and verify signed IDs, but will also verify signed IDs using the
|
|
320
|
+
older configuration.
|
|
550
321
|
|
|
551
|
-
|
|
322
|
+
To avoid complication, the new behavior only applies when `signed_id_verifier_secret`
|
|
323
|
+
is not set on a model class or any of its ancestors. Additionally,
|
|
324
|
+
`signed_id_verifier_secret` is now deprecated. If you are currently setting
|
|
325
|
+
`signed_id_verifier_secret` on a model class, you can set `signed_id_verifier`
|
|
326
|
+
instead:
|
|
552
327
|
|
|
553
|
-
|
|
328
|
+
```ruby
|
|
329
|
+
# BEFORE
|
|
330
|
+
Post.signed_id_verifier_secret = "my secret"
|
|
554
331
|
|
|
555
|
-
|
|
332
|
+
# AFTER
|
|
333
|
+
Post.signed_id_verifier = ActiveSupport::MessageVerifier.new("my secret", digest: "SHA256", serializer: JSON, url_safe: true)
|
|
334
|
+
```
|
|
556
335
|
|
|
557
|
-
|
|
336
|
+
To ease migration, `signed_id_verifier` has also been changed to behave as a
|
|
337
|
+
`class_attribute` (i.e. inheritable), but _only when `signed_id_verifier_secret`
|
|
338
|
+
is not set_:
|
|
558
339
|
|
|
559
|
-
|
|
340
|
+
```ruby
|
|
341
|
+
# BEFORE
|
|
342
|
+
ActiveRecord::Base.signed_id_verifier = ActiveSupport::MessageVerifier.new(...)
|
|
343
|
+
Post.signed_id_verifier == ActiveRecord::Base.signed_id_verifier # => false
|
|
560
344
|
|
|
561
|
-
|
|
345
|
+
# AFTER
|
|
346
|
+
ActiveRecord::Base.signed_id_verifier = ActiveSupport::MessageVerifier.new(...)
|
|
347
|
+
Post.signed_id_verifier == ActiveRecord::Base.signed_id_verifier # => true
|
|
562
348
|
|
|
563
|
-
|
|
349
|
+
Post.signed_id_verifier_secret = "my secret" # => deprecation warning
|
|
350
|
+
Post.signed_id_verifier == ActiveRecord::Base.signed_id_verifier # => false
|
|
351
|
+
```
|
|
564
352
|
|
|
565
|
-
|
|
353
|
+
Note, however, that it is recommended to eventually migrate from
|
|
354
|
+
model-specific verifiers to a unified configuration managed by
|
|
355
|
+
`Rails.application.message_verifiers`. `ActiveSupport::MessageVerifier#rotate`
|
|
356
|
+
can facilitate that transition. For example:
|
|
566
357
|
|
|
567
|
-
|
|
358
|
+
```ruby
|
|
359
|
+
# BEFORE
|
|
360
|
+
# Generate and verify signed Post IDs using Post-specific configuration
|
|
361
|
+
Post.signed_id_verifier = ActiveSupport::MessageVerifier.new("post secret", ...)
|
|
568
362
|
|
|
569
|
-
|
|
363
|
+
# AFTER
|
|
364
|
+
# Generate and verify signed Post IDs using the unified configuration
|
|
365
|
+
Post.signed_id_verifier = Post.signed_id_verifier.dup
|
|
366
|
+
# Fall back to Post-specific configuration when verifying signed IDs
|
|
367
|
+
Post.signed_id_verifier.rotate("post secret", ...)
|
|
368
|
+
```
|
|
570
369
|
|
|
571
|
-
|
|
370
|
+
[`config.active_record.use_legacy_signed_id_verifier`]: https://guides.rubyonrails.org/v8.1/configuring.html#config-active-record-use-legacy-signed-id-verifier
|
|
572
371
|
|
|
573
|
-
*
|
|
372
|
+
*Ali Sepehri*, *Jonathan Hefner*
|
|
574
373
|
|
|
575
|
-
*
|
|
374
|
+
* Prepend `extra_flags` in postgres' `structure_load`
|
|
576
375
|
|
|
577
|
-
|
|
376
|
+
When specifying `structure_load_flags` with a postgres adapter, the flags
|
|
377
|
+
were appended to the default flags, instead of prepended.
|
|
378
|
+
This caused issues with flags not being taken into account by postgres.
|
|
578
379
|
|
|
579
|
-
*
|
|
580
|
-
specified.
|
|
380
|
+
*Alice Loeser*
|
|
581
381
|
|
|
582
|
-
|
|
382
|
+
* Allow bypassing primary key/constraint addition in `implicit_order_column`
|
|
583
383
|
|
|
584
|
-
|
|
384
|
+
When specifying multiple columns in an array for `implicit_order_column`, adding
|
|
385
|
+
`nil` as the last element will prevent appending the primary key to order
|
|
386
|
+
conditions. This allows more precise control of indexes used by
|
|
387
|
+
generated queries. It should be noted that this feature does introduce the risk
|
|
388
|
+
of API misbehavior if the specified columns are not fully unique.
|
|
585
389
|
|
|
586
|
-
*
|
|
390
|
+
*Issy Long*
|
|
587
391
|
|
|
588
|
-
* Allow `
|
|
392
|
+
* Allow setting the `schema_format` via database configuration.
|
|
589
393
|
|
|
590
|
-
```
|
|
591
|
-
|
|
592
|
-
|
|
394
|
+
```
|
|
395
|
+
primary:
|
|
396
|
+
schema_format: ruby
|
|
593
397
|
```
|
|
594
398
|
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
* Make Float distinguish between `float4` and `float8` in PostgreSQL.
|
|
598
|
-
|
|
599
|
-
Fixes #52742
|
|
399
|
+
Useful for multi-database setups when apps require different formats per-database.
|
|
600
400
|
|
|
601
|
-
*
|
|
401
|
+
*T S Vallender*
|
|
602
402
|
|
|
403
|
+
* Support disabling indexes for MySQL v8.0.0+ and MariaDB v10.6.0+
|
|
603
404
|
|
|
604
|
-
|
|
405
|
+
MySQL 8.0.0 added an option to disable indexes from being used by the query
|
|
406
|
+
optimizer by making them "invisible". This allows the index to still be maintained
|
|
407
|
+
and updated but no queries will be permitted to use it. This can be useful for adding
|
|
408
|
+
new invisible indexes or making existing indexes invisible before dropping them
|
|
409
|
+
to ensure queries are not negatively affected.
|
|
410
|
+
See https://dev.mysql.com/blog-archive/mysql-8-0-invisible-indexes/ for more details.
|
|
605
411
|
|
|
606
|
-
|
|
412
|
+
MariaDB 10.6.0 also added support for this feature by allowing indexes to be "ignored"
|
|
413
|
+
in queries. See https://mariadb.com/kb/en/ignored-indexes/ for more details.
|
|
607
414
|
|
|
608
|
-
|
|
415
|
+
Active Record now supports this option for MySQL 8.0.0+ and MariaDB 10.6.0+ for
|
|
416
|
+
index creation and alteration where the new index option `enabled: true/false` can be
|
|
417
|
+
passed to column and index methods as below:
|
|
609
418
|
|
|
610
419
|
```ruby
|
|
611
|
-
|
|
420
|
+
add_index :users, :email, enabled: false
|
|
421
|
+
enable_index :users, :email
|
|
422
|
+
add_column :users, :dob, :string, index: { enabled: false }
|
|
423
|
+
|
|
424
|
+
change_table :users do |t|
|
|
425
|
+
t.index :name, enabled: false
|
|
426
|
+
t.index :dob
|
|
427
|
+
t.disable_index :dob
|
|
428
|
+
t.column :username, :string, index: { enabled: false }
|
|
429
|
+
t.references :account, index: { enabled: false }
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
create_table :users do |t|
|
|
433
|
+
t.string :name, index: { enabled: false }
|
|
434
|
+
t.string :email
|
|
435
|
+
t.index :email, enabled: false
|
|
436
|
+
end
|
|
612
437
|
```
|
|
613
438
|
|
|
614
|
-
*
|
|
439
|
+
*Merve Taner*
|
|
615
440
|
|
|
616
|
-
*
|
|
617
|
-
on the `add_enum_value` method.
|
|
441
|
+
* Respect `implicit_order_column` in `ActiveRecord::Relation#reverse_order`.
|
|
618
442
|
|
|
619
|
-
*
|
|
443
|
+
*Joshua Young*
|
|
620
444
|
|
|
621
|
-
*
|
|
445
|
+
* Add column types to `ActiveRecord::Result` for SQLite3.
|
|
622
446
|
|
|
623
|
-
*Andrew
|
|
447
|
+
*Andrew Kane*
|
|
624
448
|
|
|
625
|
-
*
|
|
626
|
-
the same child association but different parents does not join all parents.
|
|
449
|
+
* Raise `ActiveRecord::ReadOnlyError` when pessimistically locking with a readonly role.
|
|
627
450
|
|
|
628
|
-
|
|
451
|
+
*Joshua Young*
|
|
629
452
|
|
|
630
|
-
|
|
453
|
+
* Fix using the `SQLite3Adapter`'s `dbconsole` method outside of a Rails application.
|
|
631
454
|
|
|
632
|
-
|
|
455
|
+
*Hartley McGuire*
|
|
633
456
|
|
|
634
|
-
|
|
457
|
+
* Fix migrating multiple databases with `ActiveRecord::PendingMigration` action.
|
|
635
458
|
|
|
636
|
-
*
|
|
459
|
+
*Gannon McGibbon*
|
|
637
460
|
|
|
638
|
-
|
|
639
|
-
|
|
461
|
+
* Enable automatically retrying idempotent association queries on connection
|
|
462
|
+
errors.
|
|
640
463
|
|
|
641
|
-
|
|
464
|
+
*Hartley McGuire*
|
|
642
465
|
|
|
643
|
-
|
|
466
|
+
* Add `allow_retry` to `sql.active_record` instrumentation.
|
|
644
467
|
|
|
645
|
-
|
|
468
|
+
This enables identifying queries which queries are automatically retryable on connection errors.
|
|
646
469
|
|
|
647
|
-
|
|
648
|
-
which we have supported in the core. Now we support MySQL 5.6.4 or later, which
|
|
649
|
-
is the first version to support datetime with precision.
|
|
470
|
+
*Hartley McGuire*
|
|
650
471
|
|
|
651
|
-
|
|
472
|
+
* Better support UPDATE with JOIN for Postgresql and SQLite3
|
|
652
473
|
|
|
653
|
-
|
|
474
|
+
Previously when generating update queries with one or more JOIN clauses,
|
|
475
|
+
Active Record would use a sub query which would prevent to reference the joined
|
|
476
|
+
tables in the `SET` clause, for instance:
|
|
654
477
|
|
|
655
|
-
|
|
656
|
-
|
|
478
|
+
```ruby
|
|
479
|
+
Comment.joins(:post).update_all("title = posts.title")
|
|
480
|
+
```
|
|
657
481
|
|
|
658
|
-
|
|
659
|
-
|
|
482
|
+
This is now supported as long as the relation doesn't also use a `LIMIT`, `ORDER` or
|
|
483
|
+
`GROUP BY` clause. This was supported by the MySQL adapter for a long time.
|
|
660
484
|
|
|
661
485
|
*Jean Boussier*
|
|
662
486
|
|
|
663
|
-
*
|
|
664
|
-
|
|
665
|
-
This ensures that we call `PG::Connection.unescape_bytea` on PostgreSQL before decryption.
|
|
666
|
-
|
|
667
|
-
*Donal McBreen*
|
|
668
|
-
|
|
669
|
-
* Ensure `ActiveRecord::Encryption.config` is always ready before access.
|
|
670
|
-
|
|
671
|
-
Previously, `ActiveRecord::Encryption` configuration was deferred until `ActiveRecord::Base`
|
|
672
|
-
was loaded. Therefore, accessing `ActiveRecord::Encryption.config` properties before
|
|
673
|
-
`ActiveRecord::Base` was loaded would give incorrect results.
|
|
674
|
-
|
|
675
|
-
`ActiveRecord::Encryption` now has its own loading hook so that its configuration is set as
|
|
676
|
-
soon as needed.
|
|
487
|
+
* Introduce a before-fork hook in `ActiveSupport::Testing::Parallelization` to clear existing
|
|
488
|
+
connections, to avoid fork-safety issues with the mysql2 adapter.
|
|
677
489
|
|
|
678
|
-
|
|
679
|
-
`ActiveRecord::Encryption`, thus preserving the original behavior of having its config ready
|
|
680
|
-
before any use of `ActiveRecord::Base`.
|
|
490
|
+
Fixes #41776
|
|
681
491
|
|
|
682
|
-
*
|
|
492
|
+
*Mike Dalessio*, *Donal McBreen*
|
|
683
493
|
|
|
684
|
-
*
|
|
685
|
-
their type, scale, limit & precision.
|
|
686
|
-
|
|
687
|
-
Address #52699.
|
|
688
|
-
|
|
689
|
-
*Ruy Rocha*
|
|
690
|
-
|
|
691
|
-
* Add support for SQLite3 full-text-search and other virtual tables.
|
|
692
|
-
|
|
693
|
-
Previously, adding sqlite3 virtual tables messed up `schema.rb`.
|
|
494
|
+
* PoolConfig no longer keeps a reference to the connection class.
|
|
694
495
|
|
|
695
|
-
|
|
496
|
+
Keeping a reference to the class caused subtle issues when combined with reloading in
|
|
497
|
+
development. Fixes #54343.
|
|
696
498
|
|
|
697
|
-
*
|
|
499
|
+
*Mike Dalessio*
|
|
698
500
|
|
|
699
|
-
*
|
|
501
|
+
* Fix SQL notifications sometimes not sent when using async queries.
|
|
700
502
|
|
|
701
503
|
```ruby
|
|
702
|
-
|
|
703
|
-
|
|
504
|
+
Post.async_count
|
|
505
|
+
ActiveSupport::Notifications.subscribed(->(*) { "Will never reach here" }) do
|
|
506
|
+
Post.count
|
|
704
507
|
end
|
|
705
508
|
```
|
|
706
509
|
|
|
707
|
-
|
|
510
|
+
In rare circumstances and under the right race condition, Active Support notifications
|
|
511
|
+
would no longer be dispatched after using an asynchronous query.
|
|
512
|
+
This is now fixed.
|
|
708
513
|
|
|
709
|
-
*
|
|
514
|
+
*Edouard Chin*
|
|
710
515
|
|
|
711
|
-
|
|
516
|
+
* Eliminate queries loading dumped schema cache on Postgres
|
|
712
517
|
|
|
713
|
-
|
|
518
|
+
Improve resiliency by avoiding needing to open a database connection to load the
|
|
519
|
+
type map while defining attribute methods at boot when a schema cache file is
|
|
520
|
+
configured on PostgreSQL databases.
|
|
714
521
|
|
|
715
|
-
|
|
716
|
-
with `:x` and `:y` keys of numeric values, mirroring the functionality of
|
|
717
|
-
existing casts for string and array values. Both string and symbol keys are
|
|
718
|
-
supported.
|
|
522
|
+
*James Coleman*
|
|
719
523
|
|
|
720
|
-
|
|
721
|
-
class PostgresqlPoint < ActiveRecord::Base
|
|
722
|
-
attribute :x, :point
|
|
723
|
-
attribute :y, :point
|
|
724
|
-
attribute :z, :point
|
|
725
|
-
end
|
|
524
|
+
* `ActiveRecord::Coder::JSON` can be instantiated
|
|
726
525
|
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
z: {x: '12.34', y: -43.21}
|
|
731
|
-
})
|
|
732
|
-
ActiveRecord::Point.new(12.32, -43.21) == val.x == val.y == val.z
|
|
526
|
+
Options can now be passed to `ActiveRecord::Coder::JSON` when instantiating the coder. This allows:
|
|
527
|
+
```ruby
|
|
528
|
+
serialize :config, coder: ActiveRecord::Coder::JSON.new(symbolize_names: true)
|
|
733
529
|
```
|
|
530
|
+
*matthaigh27*
|
|
734
531
|
|
|
735
|
-
|
|
532
|
+
* Deprecate using `insert_all`/`upsert_all` with unpersisted records in associations.
|
|
736
533
|
|
|
737
|
-
|
|
534
|
+
Using these methods on associations containing unpersisted records will now
|
|
535
|
+
show a deprecation warning, as the unpersisted records will be lost after
|
|
536
|
+
the operation.
|
|
738
537
|
|
|
739
|
-
|
|
538
|
+
*Nick Schwaderer*
|
|
740
539
|
|
|
741
|
-
|
|
540
|
+
* Make column name optional for `index_exists?`.
|
|
742
541
|
|
|
743
|
-
|
|
542
|
+
This aligns well with `remove_index` signature as well, where
|
|
543
|
+
index name doesn't need to be derived from the column names.
|
|
744
544
|
|
|
745
|
-
*
|
|
545
|
+
*Ali Ismayiliov*
|
|
746
546
|
|
|
747
|
-
*
|
|
547
|
+
* Change the payload name of `sql.active_record` notification for eager
|
|
548
|
+
loading from "SQL" to "#{model.name} Eager Load".
|
|
748
549
|
|
|
749
|
-
|
|
750
|
-
`enable_extension` statements if they differ from the current schema.
|
|
550
|
+
*zzak*
|
|
751
551
|
|
|
752
|
-
|
|
552
|
+
* Enable automatically retrying idempotent `#exists?` queries on connection
|
|
553
|
+
errors.
|
|
753
554
|
|
|
754
|
-
|
|
755
|
-
enable_extension "heroku_ext.pgcrypto"
|
|
756
|
-
enable_extension "pg_stat_statements"
|
|
757
|
-
```
|
|
555
|
+
*Hartley McGuire*, *classidied*
|
|
758
556
|
|
|
759
|
-
|
|
557
|
+
* Deprecate usage of unsupported methods in conjunction with `update_all`:
|
|
760
558
|
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
```
|
|
559
|
+
`update_all` will now print a deprecation message if a query includes either `WITH`,
|
|
560
|
+
`WITH RECURSIVE` or `DISTINCT` statements. Those were never supported and were ignored
|
|
561
|
+
when generating the SQL query.
|
|
765
562
|
|
|
766
|
-
|
|
563
|
+
An error will be raised in a future Rails release. This behavior will be consistent
|
|
564
|
+
with `delete_all` which currently raises an error for unsupported statements.
|
|
767
565
|
|
|
768
|
-
*
|
|
769
|
-
actual cast type.
|
|
566
|
+
*Edouard Chin*
|
|
770
567
|
|
|
771
|
-
|
|
568
|
+
* The table columns inside `schema.rb` are now sorted alphabetically.
|
|
772
569
|
|
|
773
|
-
|
|
570
|
+
Previously they'd be sorted by creation order, which can cause merge conflicts when two
|
|
571
|
+
branches modify the same table concurrently.
|
|
774
572
|
|
|
775
|
-
|
|
776
|
-
aggregated in a single bulk insert command.
|
|
573
|
+
*John Duff*
|
|
777
574
|
|
|
778
|
-
|
|
575
|
+
* Introduce versions formatter for the schema dumper.
|
|
779
576
|
|
|
780
|
-
|
|
577
|
+
It is now possible to override how schema dumper formats versions information inside the
|
|
578
|
+
`structure.sql` file. Currently, the versions are simply sorted in the decreasing order.
|
|
579
|
+
Within large teams, this can potentially cause many merge conflicts near the top of the list.
|
|
781
580
|
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
actually take a schema name (unlike `CREATE EXTENSION`), so the resulting SQL statement will only name
|
|
785
|
-
the extension, e.g. `DROP EXTENSION IF EXISTS "pgcrypto"`.
|
|
581
|
+
Now, the custom formatter can be provided with a custom sorting logic (e.g. by hash values
|
|
582
|
+
of the versions), which can greatly reduce the number of conflicts.
|
|
786
583
|
|
|
787
|
-
*
|
|
584
|
+
*fatkodima*
|
|
788
585
|
|
|
789
|
-
*
|
|
586
|
+
* Serialized attributes can now be marked as comparable.
|
|
790
587
|
|
|
791
|
-
|
|
588
|
+
A not rare issue when working with serialized attributes is that the serialized representation of an object
|
|
589
|
+
can change over time. Either because you are migrating from one serializer to the other (e.g. YAML to JSON or to msgpack),
|
|
590
|
+
or because the serializer used subtly changed its output.
|
|
792
591
|
|
|
793
|
-
|
|
592
|
+
One example is libyaml that used to have some extra trailing whitespaces, and recently fixed that.
|
|
593
|
+
When this sorts of thing happen, you end up with lots of records that report being changed even though
|
|
594
|
+
they aren't, which in the best case leads to a lot more writes to the database and in the worst case lead to nasty bugs.
|
|
794
595
|
|
|
795
|
-
|
|
596
|
+
The solution is to instead compare the deserialized representation of the object, however Active Record
|
|
597
|
+
can't assume the deserialized object has a working `==` method. Hence why this new functionality is opt-in.
|
|
796
598
|
|
|
797
599
|
```ruby
|
|
798
|
-
|
|
799
|
-
# do something with relation
|
|
800
|
-
end
|
|
600
|
+
serialize :config, type: Hash, coder: JSON, comparable: true
|
|
801
601
|
```
|
|
802
602
|
|
|
803
|
-
*
|
|
804
|
-
|
|
805
|
-
* Use SQLite `IMMEDIATE` transactions when possible.
|
|
806
|
-
|
|
807
|
-
Transactions run against the SQLite3 adapter default to IMMEDIATE mode to improve concurrency support and avoid busy exceptions.
|
|
808
|
-
|
|
809
|
-
*Stephen Margheim*
|
|
810
|
-
|
|
811
|
-
* Raise specific exception when a connection is not defined.
|
|
812
|
-
|
|
813
|
-
The new `ConnectionNotDefined` exception provides connection name, shard and role accessors indicating the details of the connection that was requested.
|
|
603
|
+
*Jean Boussier*
|
|
814
604
|
|
|
815
|
-
|
|
605
|
+
* Fix MySQL default functions getting dropped when changing a column's nullability.
|
|
816
606
|
|
|
817
|
-
*
|
|
607
|
+
*Bastian Bartmann*
|
|
818
608
|
|
|
819
|
-
|
|
609
|
+
* SQLite extensions can be configured in `config/database.yml`.
|
|
820
610
|
|
|
821
|
-
|
|
611
|
+
The database configuration option `extensions:` allows an application to load SQLite extensions
|
|
612
|
+
when using `sqlite3` >= v2.4.0. The array members may be filesystem paths or the names of
|
|
613
|
+
modules that respond to `.to_path`:
|
|
822
614
|
|
|
823
|
-
|
|
824
|
-
|
|
615
|
+
``` yaml
|
|
616
|
+
development:
|
|
617
|
+
adapter: sqlite3
|
|
618
|
+
extensions:
|
|
619
|
+
- SQLean::UUID # module name responding to `.to_path`
|
|
620
|
+
- .sqlpkg/nalgeon/crypto/crypto.so # or a filesystem path
|
|
621
|
+
- <%= AppExtensions.location %> # or ruby code returning a path
|
|
622
|
+
```
|
|
825
623
|
|
|
826
|
-
|
|
624
|
+
*Mike Dalessio*
|
|
827
625
|
|
|
828
|
-
|
|
626
|
+
* `ActiveRecord::Middleware::ShardSelector` supports granular database connection switching.
|
|
829
627
|
|
|
830
|
-
|
|
628
|
+
A new configuration option, `class_name:`, is introduced to
|
|
629
|
+
`config.active_record.shard_selector` to allow an application to specify the abstract connection
|
|
630
|
+
class to be switched by the shard selection middleware. The default class is
|
|
631
|
+
`ActiveRecord::Base`.
|
|
831
632
|
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
def self.deflate(data)
|
|
835
|
-
Zstd.compress(data)
|
|
836
|
-
end
|
|
633
|
+
For example, this configuration tells `ShardSelector` to switch shards using
|
|
634
|
+
`AnimalsRecord.connected_to`:
|
|
837
635
|
|
|
838
|
-
def self.inflate(data)
|
|
839
|
-
Zstd.decompress(data)
|
|
840
|
-
end
|
|
841
|
-
end
|
|
842
|
-
|
|
843
|
-
class User
|
|
844
|
-
encrypts :name, compressor: ZstdCompressor
|
|
845
|
-
end
|
|
846
636
|
```
|
|
847
|
-
|
|
848
|
-
You disable compression by passing `compress: false`.
|
|
849
|
-
|
|
850
|
-
```ruby
|
|
851
|
-
class User
|
|
852
|
-
encrypts :name, compress: false
|
|
853
|
-
end
|
|
637
|
+
config.active_record.shard_selector = { class_name: "AnimalsRecord" }
|
|
854
638
|
```
|
|
855
639
|
|
|
856
|
-
*
|
|
857
|
-
|
|
858
|
-
* Add condensed `#inspect` for `ConnectionPool`, `AbstractAdapter`, and
|
|
859
|
-
`DatabaseConfig`.
|
|
860
|
-
|
|
861
|
-
*Hartley McGuire*
|
|
862
|
-
|
|
863
|
-
* Add `.shard_keys`, `.sharded?`, & `.connected_to_all_shards` methods.
|
|
864
|
-
|
|
865
|
-
```ruby
|
|
866
|
-
class ShardedBase < ActiveRecord::Base
|
|
867
|
-
self.abstract_class = true
|
|
868
|
-
|
|
869
|
-
connects_to shards: {
|
|
870
|
-
shard_one: { writing: :shard_one },
|
|
871
|
-
shard_two: { writing: :shard_two }
|
|
872
|
-
}
|
|
873
|
-
end
|
|
640
|
+
*Mike Dalessio*
|
|
874
641
|
|
|
875
|
-
|
|
876
|
-
end
|
|
642
|
+
* Reset relations after `insert_all`/`upsert_all`.
|
|
877
643
|
|
|
878
|
-
|
|
879
|
-
ShardedModel.sharded? => true
|
|
880
|
-
ShardedBase.connected_to_all_shards { ShardedModel.current_shard } => [:shard_one, :shard_two]
|
|
881
|
-
```
|
|
644
|
+
Bulk insert/upsert methods will now call `reset` if used on a relation, matching the behavior of `update_all`.
|
|
882
645
|
|
|
883
|
-
*
|
|
646
|
+
*Milo Winningham*
|
|
884
647
|
|
|
885
|
-
*
|
|
886
|
-
by these values.
|
|
648
|
+
* Use `_N` as a parallel tests databases suffixes
|
|
887
649
|
|
|
888
|
-
|
|
650
|
+
Peviously, `-N` was used as a suffix. This can cause problems for RDBMSes
|
|
651
|
+
which do not support dashes in database names.
|
|
889
652
|
|
|
890
|
-
*
|
|
891
|
-
for preloaded associations in models using composite primary keys.
|
|
892
|
-
|
|
893
|
-
*Jay Ang*
|
|
653
|
+
*fatkodima*
|
|
894
654
|
|
|
895
|
-
*
|
|
655
|
+
* Remember when a database connection has recently been verified (for
|
|
656
|
+
two seconds, by default), to avoid repeated reverifications during a
|
|
657
|
+
single request.
|
|
896
658
|
|
|
897
|
-
|
|
659
|
+
This should recreate a similar rate of verification as in Rails 7.1,
|
|
660
|
+
where connections are leased for the duration of a request, and thus
|
|
661
|
+
only verified once.
|
|
898
662
|
|
|
899
|
-
*
|
|
663
|
+
*Matthew Draper*
|
|
900
664
|
|
|
901
|
-
*
|
|
665
|
+
* Allow to reset cache counters for multiple records.
|
|
902
666
|
|
|
903
|
-
|
|
667
|
+
```
|
|
668
|
+
Aircraft.reset_counters([1, 2, 3], :wheels_count)
|
|
669
|
+
```
|
|
904
670
|
|
|
905
|
-
|
|
671
|
+
It produces much fewer queries compared to the custom implementation using looping over ids.
|
|
672
|
+
Previously: `O(ids.size * counters.size)` queries, now: `O(ids.size + counters.size)` queries.
|
|
906
673
|
|
|
907
|
-
*
|
|
908
|
-
structured (e.g., PostgreSQL +hstore+/+json+, or MySQL +json+) or declared serializable via
|
|
909
|
-
`ActiveRecord.store`.
|
|
674
|
+
*fatkodima*
|
|
910
675
|
|
|
911
|
-
|
|
676
|
+
* Add `affected_rows` to `sql.active_record` Notification.
|
|
912
677
|
|
|
913
|
-
|
|
678
|
+
*Hartley McGuire*
|
|
914
679
|
|
|
915
|
-
|
|
680
|
+
* Fix `sum` when performing a grouped calculation.
|
|
916
681
|
|
|
917
|
-
|
|
918
|
-
Please make sure the column is declared serializable via 'ActiveRecord.store' or, if your
|
|
919
|
-
database supports it, use a structured column type like hstore or json.
|
|
682
|
+
`User.group(:friendly).sum` no longer worked. This is fixed.
|
|
920
683
|
|
|
921
|
-
*
|
|
684
|
+
*Edouard Chin*
|
|
922
685
|
|
|
923
|
-
*
|
|
686
|
+
* Add support for enabling or disabling transactional tests per database.
|
|
924
687
|
|
|
925
|
-
|
|
688
|
+
A test class can now override the default `use_transactional_tests` setting
|
|
689
|
+
for individual databases, which can be useful if some databases need their
|
|
690
|
+
current state to be accessible to an external process while tests are running.
|
|
926
691
|
|
|
927
692
|
```ruby
|
|
928
|
-
class
|
|
929
|
-
|
|
693
|
+
class MostlyTransactionalTest < ActiveSupport::TestCase
|
|
694
|
+
self.use_transactional_tests = true
|
|
695
|
+
skip_transactional_tests_for_database :shared
|
|
930
696
|
end
|
|
931
697
|
```
|
|
932
698
|
|
|
933
|
-
|
|
699
|
+
*Matthew Cheetham*, *Morgan Mareve*
|
|
934
700
|
|
|
935
|
-
|
|
701
|
+
* Cast `query_cache` value when using URL configuration.
|
|
936
702
|
|
|
937
|
-
*
|
|
703
|
+
*zzak*
|
|
938
704
|
|
|
939
|
-
|
|
705
|
+
* NULLS NOT DISTINCT works with UNIQUE CONSTRAINT as well as UNIQUE INDEX.
|
|
940
706
|
|
|
941
|
-
|
|
942
|
-
ActiveRecord.schema_cache_ignored_tables = ["developers"]
|
|
943
|
-
ActiveRecord.schema_cache_ignored_table?("developers")
|
|
944
|
-
=> true
|
|
945
|
-
```
|
|
707
|
+
*Ryuta Kamizono*
|
|
946
708
|
|
|
947
|
-
|
|
709
|
+
* `PG::UnableToSend: no connection to the server` is now retryable as a connection-related exception
|
|
710
|
+
|
|
711
|
+
*Kazuma Watanabe*
|
|
948
712
|
|
|
949
|
-
Please check [
|
|
713
|
+
Please check [8-0-stable](https://github.com/rails/rails/blob/8-0-stable/activerecord/CHANGELOG.md) for previous changes.
|