activerecord 7.2.1.1 → 8.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +188 -791
  3. data/README.rdoc +1 -1
  4. data/lib/active_record/associations/association.rb +25 -5
  5. data/lib/active_record/associations/builder/association.rb +7 -6
  6. data/lib/active_record/associations/collection_association.rb +10 -8
  7. data/lib/active_record/associations/disable_joins_association_scope.rb +1 -1
  8. data/lib/active_record/associations/has_many_through_association.rb +3 -2
  9. data/lib/active_record/associations/join_dependency/join_association.rb +3 -2
  10. data/lib/active_record/associations/join_dependency.rb +4 -4
  11. data/lib/active_record/associations/preloader/association.rb +2 -2
  12. data/lib/active_record/associations/singular_association.rb +8 -3
  13. data/lib/active_record/associations.rb +34 -4
  14. data/lib/active_record/asynchronous_queries_tracker.rb +28 -24
  15. data/lib/active_record/attribute_assignment.rb +9 -1
  16. data/lib/active_record/attribute_methods/time_zone_conversion.rb +4 -0
  17. data/lib/active_record/attributes.rb +1 -2
  18. data/lib/active_record/autosave_association.rb +69 -27
  19. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +16 -10
  20. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +0 -1
  21. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +0 -1
  22. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +0 -1
  23. data/lib/active_record/connection_adapters/abstract/database_statements.rb +90 -43
  24. data/lib/active_record/connection_adapters/abstract/query_cache.rb +12 -4
  25. data/lib/active_record/connection_adapters/abstract/quoting.rb +1 -1
  26. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
  27. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +26 -5
  28. data/lib/active_record/connection_adapters/abstract/transaction.rb +15 -5
  29. data/lib/active_record/connection_adapters/abstract_adapter.rb +24 -25
  30. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +20 -38
  31. data/lib/active_record/connection_adapters/mysql/quoting.rb +0 -8
  32. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +2 -8
  33. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +43 -45
  34. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +42 -98
  35. data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -8
  36. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -42
  37. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +1 -1
  38. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +10 -0
  39. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +0 -1
  40. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +50 -6
  41. data/lib/active_record/connection_adapters/postgresql_adapter.rb +38 -90
  42. data/lib/active_record/connection_adapters/schema_cache.rb +1 -3
  43. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +76 -100
  44. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +0 -6
  45. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +13 -0
  46. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +8 -1
  47. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +55 -12
  48. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +37 -67
  49. data/lib/active_record/connection_adapters/trilogy_adapter.rb +0 -17
  50. data/lib/active_record/connection_handling.rb +22 -0
  51. data/lib/active_record/core.rb +14 -7
  52. data/lib/active_record/database_configurations/connection_url_resolver.rb +1 -1
  53. data/lib/active_record/encryption/config.rb +3 -1
  54. data/lib/active_record/encryption/encryptable_record.rb +4 -4
  55. data/lib/active_record/encryption/encrypted_attribute_type.rb +10 -1
  56. data/lib/active_record/encryption/encryptor.rb +15 -8
  57. data/lib/active_record/encryption/extended_deterministic_queries.rb +4 -2
  58. data/lib/active_record/encryption/key_provider.rb +1 -1
  59. data/lib/active_record/encryption/scheme.rb +8 -1
  60. data/lib/active_record/encryption.rb +2 -0
  61. data/lib/active_record/enum.rb +7 -10
  62. data/lib/active_record/errors.rb +13 -5
  63. data/lib/active_record/fixtures.rb +0 -1
  64. data/lib/active_record/future_result.rb +14 -10
  65. data/lib/active_record/gem_version.rb +4 -4
  66. data/lib/active_record/insert_all.rb +1 -1
  67. data/lib/active_record/migration/command_recorder.rb +22 -5
  68. data/lib/active_record/migration/compatibility.rb +5 -2
  69. data/lib/active_record/migration.rb +35 -33
  70. data/lib/active_record/model_schema.rb +2 -3
  71. data/lib/active_record/nested_attributes.rb +11 -2
  72. data/lib/active_record/persistence.rb +128 -130
  73. data/lib/active_record/query_logs.rb +97 -39
  74. data/lib/active_record/query_logs_formatter.rb +17 -28
  75. data/lib/active_record/querying.rb +6 -6
  76. data/lib/active_record/railtie.rb +8 -14
  77. data/lib/active_record/reflection.rb +9 -4
  78. data/lib/active_record/relation/batches/batch_enumerator.rb +4 -3
  79. data/lib/active_record/relation/batches.rb +132 -72
  80. data/lib/active_record/relation/calculations.rb +24 -19
  81. data/lib/active_record/relation/delegation.rb +25 -14
  82. data/lib/active_record/relation/finder_methods.rb +18 -18
  83. data/lib/active_record/relation/merger.rb +8 -8
  84. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -1
  85. data/lib/active_record/relation/predicate_builder/relation_handler.rb +4 -3
  86. data/lib/active_record/relation/predicate_builder.rb +6 -1
  87. data/lib/active_record/relation/query_methods.rb +58 -37
  88. data/lib/active_record/relation/record_fetch_warning.rb +2 -2
  89. data/lib/active_record/relation/spawn_methods.rb +1 -1
  90. data/lib/active_record/relation.rb +72 -61
  91. data/lib/active_record/result.rb +68 -7
  92. data/lib/active_record/sanitization.rb +7 -6
  93. data/lib/active_record/schema_dumper.rb +5 -0
  94. data/lib/active_record/schema_migration.rb +2 -1
  95. data/lib/active_record/scoping/named.rb +5 -2
  96. data/lib/active_record/statement_cache.rb +12 -12
  97. data/lib/active_record/store.rb +7 -3
  98. data/lib/active_record/tasks/database_tasks.rb +36 -16
  99. data/lib/active_record/tasks/mysql_database_tasks.rb +0 -2
  100. data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -2
  101. data/lib/active_record/test_fixtures.rb +12 -0
  102. data/lib/active_record/token_for.rb +1 -1
  103. data/lib/active_record/validations/uniqueness.rb +9 -8
  104. data/lib/active_record.rb +15 -0
  105. data/lib/arel/collectors/bind.rb +1 -1
  106. metadata +10 -10
data/CHANGELOG.md CHANGED
@@ -1,949 +1,346 @@
1
- ## Rails 7.2.1.1 (October 15, 2024) ##
1
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
2
2
 
3
- * No changes.
3
+ * Allow `drop_table` to accept an array of table names.
4
4
 
5
+ This will let you to drop multiple tables in a single call.
5
6
 
6
- ## Rails 7.2.1 (August 22, 2024) ##
7
-
8
- * Fix detection for `enum` columns with parallelized tests and PostgreSQL.
9
-
10
- *Rafael Mendonça França*
11
-
12
- * Allow to eager load nested nil associations.
13
-
14
- *fatkodima*
15
-
16
- * Fix swallowing ignore order warning when batching using `BatchEnumerator`.
17
-
18
- *fatkodima*
19
-
20
- * Fix memory bloat on the connection pool when using the Fiber `IsolatedExecutionState`.
21
-
22
- *Jean Boussier*
7
+ ```ruby
8
+ ActiveRecord::Base.lease_connection.drop_table(:users, :posts)
9
+ ```
23
10
 
24
- * Restore inferred association class with the same modularized name.
11
+ *Gabriel Sobrinho*
25
12
 
26
- *Justin Ko*
13
+ * Add support for PostgreSQL `IF NOT EXISTS` via the `:if_not_exists` option
14
+ on the `add_enum_value` method.
27
15
 
28
- * Fix `ActiveRecord::Base.inspect` to properly explain how to load schema information.
16
+ *Ariel Rzezak*
29
17
 
30
- *Jean Boussier*
18
+ * When running `db:migrate` on a fresh database, load the database schema before running migrations.
31
19
 
32
- * Check invalid `enum` options for the new syntax.
20
+ *Andrew Novoselac*
33
21
 
34
- The options using `_` prefix in the old syntax are invalid in the new syntax.
22
+ * Fix an issue where `.left_outer_joins` used with multiple associations that have
23
+ the same child association but different parents does not join all parents.
35
24
 
36
- *Rafael Mendonça França*
25
+ Previously, using `.left_outer_joins` with the same child association would only join one of the parents.
37
26
 
38
- * Fix `ActiveRecord::Encryption::EncryptedAttributeType#type` to return
39
- actual cast type.
27
+ Now it will correctly join both parents.
40
28
 
41
- *Vasiliy Ermolovich*
29
+ Fixes #41498.
42
30
 
43
- * Fix `create_table` with `:auto_increment` option for MySQL adapter.
31
+ *Garrett Blehm*
44
32
 
45
- *fatkodima*
33
+ * Deprecate `unsigned_float` and `unsigned_decimal` short-hand column methods.
46
34
 
35
+ As of MySQL 8.0.17, the UNSIGNED attribute is deprecated for columns of type FLOAT, DOUBLE,
36
+ and DECIMAL. Consider using a simple CHECK constraint instead for such columns.
47
37
 
48
- ## Rails 7.2.0 (August 09, 2024) ##
38
+ https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html
49
39
 
50
- * Handle commas in Sqlite3 default function definitions.
40
+ *Ryuta Kamizono*
51
41
 
52
- *Stephen Margheim*
42
+ * Drop MySQL 5.5 support.
53
43
 
54
- * Fixes `validates_associated` raising an exception when configured with a
55
- singular association and having `index_nested_attribute_errors` enabled.
44
+ MySQL 5.5 is the only version that does not support datetime with precision,
45
+ which we have supported in the core. Now we support MySQL 5.6.4 or later, which
46
+ is the first version to support datetime with precision.
56
47
 
57
- *Martin Spickermann*
48
+ *Ryuta Kamizono*
58
49
 
59
- * The constant `ActiveRecord::ImmutableRelation` has been deprecated because
60
- we want to reserve that name for a stronger sense of "immutable relation".
61
- Please use `ActiveRecord::UnmodifiableRelation` instead.
50
+ * Make Active Record asynchronous queries compatible with transactional fixtures.
62
51
 
63
- *Xavier Noria*
52
+ Previously transactional fixtures would disable asynchronous queries, because transactional
53
+ fixtures impose all queries use the same connection.
64
54
 
65
- * Add condensed `#inspect` for `ConnectionPool`, `AbstractAdapter`, and
66
- `DatabaseConfig`.
67
-
68
- *Hartley McGuire*
69
-
70
- * Fixed a memory performance issue in Active Record attribute methods definition.
55
+ Now asynchronous queries will use the connection pinned by transactional fixtures, and behave
56
+ much closer to production.
71
57
 
72
58
  *Jean Boussier*
73
59
 
74
- * Define the new Active Support notification event `start_transaction.active_record`.
75
-
76
- This event is fired when database transactions or savepoints start, and
77
- complements `transaction.active_record`, which is emitted when they finish.
78
-
79
- The payload has the transaction (`:transaction`) and the connection (`:connection`).
80
-
81
- *Xavier Noria*
82
-
83
- * Fix an issue where the IDs reader method did not return expected results
84
- for preloaded associations in models using composite primary keys.
85
-
86
- *Jay Ang*
60
+ * Deserialize binary data before decrypting
87
61
 
88
- * The payload of `sql.active_record` Active Support notifications now has the current transaction in the `:transaction` key.
62
+ This ensures that we call `PG::Connection.unescape_bytea` on PostgreSQL before decryption.
89
63
 
90
- *Xavier Noria*
91
-
92
- * The payload of `transaction.active_record` Active Support notifications now has the transaction the event is related to in the `:transaction` key.
64
+ *Donal McBreen*
93
65
 
94
- *Xavier Noria*
66
+ * Ensure `ActiveRecord::Encryption.config` is always ready before access.
95
67
 
96
- * Define `ActiveRecord::Transaction#uuid`, which returns a UUID for the database transaction. This may be helpful when tracing database activity. These UUIDs are generated only on demand.
68
+ Previously, `ActiveRecord::Encryption` configuration was deferred until `ActiveRecord::Base`
69
+ was loaded. Therefore, accessing `ActiveRecord::Encryption.config` properties before
70
+ `ActiveRecord::Base` was loaded would give incorrect results.
97
71
 
98
- *Xavier Noria*
72
+ `ActiveRecord::Encryption` now has its own loading hook so that its configuration is set as
73
+ soon as needed.
99
74
 
100
- * Fix inference of association model on nested models with the same demodularized name.
75
+ When `ActiveRecord::Base` is loaded, even lazily, it in turn triggers the loading of
76
+ `ActiveRecord::Encryption`, thus preserving the original behavior of having its config ready
77
+ before any use of `ActiveRecord::Base`.
101
78
 
102
- E.g. with the following setup:
103
-
104
- ```ruby
105
- class Nested::Post < ApplicationRecord
106
- has_one :post, through: :other
107
- end
108
- ```
79
+ *Maxime Réty*
109
80
 
110
- Before, `#post` would infer the model as `Nested::Post`, but now it correctly infers `Post`.
81
+ * Add `TimeZoneConverter#==` method, so objects will be properly compared by
82
+ their type, scale, limit & precision.
111
83
 
112
- *Joshua Young*
84
+ Address #52699.
113
85
 
114
- * PostgreSQL `Cidr#change?` detects the address prefix change.
86
+ *Ruy Rocha*
115
87
 
116
- *Taketo Takashima*
88
+ * Add support for SQLite3 full-text-search and other virtual tables.
117
89
 
118
- * Change `BatchEnumerator#destroy_all` to return the total number of affected rows.
90
+ Previously, adding sqlite3 virtual tables messed up `schema.rb`.
119
91
 
120
- Previously, it always returned `nil`.
92
+ Now, virtual tables can safely be added using `create_virtual_table`.
121
93
 
122
- *fatkodima*
94
+ *Zacharias Knudsen*
123
95
 
124
- * Support `touch_all` in batches.
96
+ * Support use of alternative database interfaces via the `database_cli` ActiveRecord configuration option.
125
97
 
126
98
  ```ruby
127
- Post.in_batches.touch_all
99
+ Rails.application.configure do
100
+ config.active_record.database_cli = { postgresql: "pgcli" }
101
+ end
128
102
  ```
129
103
 
130
- *fatkodima*
131
-
132
- * Add support for `:if_not_exists` and `:force` options to `create_schema`.
133
-
134
- *fatkodima*
135
-
136
- * Fix `index_errors` having incorrect index in association validation errors.
137
-
138
- *lulalala*
139
-
140
- * Add `index_errors: :nested_attributes_order` mode.
141
-
142
- This indexes the association validation errors based on the order received by nested attributes setter, and respects the `reject_if` configuration. This enables API to provide enough information to the frontend to map the validation errors back to their respective form fields.
143
-
144
- *lulalala*
145
-
146
- * Add `Rails.application.config.active_record.postgresql_adapter_decode_dates` to opt out of decoding dates automatically with the postgresql adapter. Defaults to true.
147
-
148
- *Joé Dupuis*
149
-
150
- * Association option `query_constraints` is deprecated in favor of `foreign_key`.
151
-
152
- *Nikita Vasilevsky*
153
-
154
- * Add `ENV["SKIP_TEST_DATABASE_TRUNCATE"]` flag to speed up multi-process test runs on large DBs when all tests run within default transaction.
155
-
156
- This cuts ~10s from the test run of HEY when run by 24 processes against the 178 tables, since ~4,000 table truncates can then be skipped.
157
-
158
- *DHH*
159
-
160
- * Added support for recursive common table expressions.
104
+ *T S Vallender*
161
105
 
162
- ```ruby
163
- Post.with_recursive(
164
- post_and_replies: [
165
- Post.where(id: 42),
166
- Post.joins('JOIN post_and_replies ON posts.in_reply_to_id = post_and_replies.id'),
167
- ]
168
- )
169
- ```
170
-
171
- Generates the following SQL:
106
+ * Add support for dumping table inheritance and native partitioning table definitions for PostgeSQL adapter
172
107
 
173
- ```sql
174
- WITH RECURSIVE "post_and_replies" AS (
175
- (SELECT "posts".* FROM "posts" WHERE "posts"."id" = 42)
176
- UNION ALL
177
- (SELECT "posts".* FROM "posts" JOIN post_and_replies ON posts.in_reply_to_id = post_and_replies.id)
178
- )
179
- SELECT "posts".* FROM "posts"
180
- ```
108
+ *Justin Talbott*
181
109
 
182
- *ClearlyClaire*
110
+ * Add support for `ActiveRecord::Point` type casts using `Hash` values
183
111
 
184
- * `validate_constraint` can be called in a `change_table` block.
112
+ This allows `ActiveRecord::Point` to be cast or serialized from a hash
113
+ with `:x` and `:y` keys of numeric values, mirroring the functionality of
114
+ existing casts for string and array values. Both string and symbol keys are
115
+ supported.
185
116
 
186
- ex:
187
117
  ```ruby
188
- change_table :products do |t|
189
- t.check_constraint "price > discounted_price", name: "price_check", validate: false
190
- t.validate_check_constraint "price_check"
118
+ class PostgresqlPoint < ActiveRecord::Base
119
+ attribute :x, :point
120
+ attribute :y, :point
121
+ attribute :z, :point
191
122
  end
192
- ```
193
-
194
- *Cody Cutrer*
195
123
 
196
- * `PostgreSQLAdapter` now decodes columns of type date to `Date` instead of string.
197
-
198
- Ex:
199
- ```ruby
200
- ActiveRecord::Base.connection
201
- .select_value("select '2024-01-01'::date").class #=> Date
124
+ val = PostgresqlPoint.new({
125
+ x: '(12.34, -43.21)',
126
+ y: [12.34, '-43.21'],
127
+ z: {x: '12.34', y: -43.21}
128
+ })
129
+ ActiveRecord::Point.new(12.32, -43.21) == val.x == val.y == val.z
202
130
  ```
203
131
 
204
- *Joé Dupuis*
205
-
206
- * Strict loading using `:n_plus_one_only` does not eagerly load child associations.
132
+ *Stephen Drew*
207
133
 
208
- With this change, child associations are no longer eagerly loaded, to
209
- match intended behavior and to prevent non-deterministic order issues caused
210
- by calling methods like `first` or `last`. As `first` and `last` don't cause
211
- an N+1 by themselves, calling child associations will no longer raise.
212
- Fixes #49473.
134
+ * Replace `SQLite3::Database#busy_timeout` with `#busy_handler_timeout=`.
213
135
 
214
- Before:
215
-
216
- ```ruby
217
- person = Person.find(1)
218
- person.strict_loading!(mode: :n_plus_one_only)
219
- person.posts.first
220
- # SELECT * FROM posts WHERE person_id = 1; -- non-deterministic order
221
- person.posts.first.firm # raises ActiveRecord::StrictLoadingViolationError
222
- ```
136
+ Provides a non-GVL-blocking, fair retry interval busy handler implementation.
223
137
 
224
- After:
138
+ *Stephen Margheim*
225
139
 
226
- ```ruby
227
- person = Person.find(1)
228
- person.strict_loading!(mode: :n_plus_one_only)
229
- person.posts.first # this is 1+1, not N+1
230
- # SELECT * FROM posts WHERE person_id = 1 ORDER BY id LIMIT 1;
231
- person.posts.first.firm # no longer raises
232
- ```
140
+ * SQLite3Adapter: Translate `SQLite3::BusyException` into `ActiveRecord::StatementTimeout`.
233
141
 
234
- *Reid Lynch*
142
+ *Matthew Nguyen*
235
143
 
236
- * Allow `Sqlite3Adapter` to use `sqlite3` gem version `2.x`.
144
+ * Include schema name in `enable_extension` statements in `db/schema.rb`.
237
145
 
238
- *Mike Dalessio*
146
+ The schema dumper will now include the schema name in generated
147
+ `enable_extension` statements if they differ from the current schema.
239
148
 
240
- * Allow `ActiveRecord::Base#pluck` to accept hash values.
149
+ For example, if you have a migration:
241
150
 
242
151
  ```ruby
243
- # Before
244
- Post.joins(:comments).pluck("posts.id", "comments.id", "comments.body")
245
-
246
- # After
247
- Post.joins(:comments).pluck(posts: [:id], comments: [:id, :body])
152
+ enable_extension "heroku_ext.pgcrypto"
153
+ enable_extension "pg_stat_statements"
248
154
  ```
249
155
 
250
- *fatkodima*
251
-
252
- * Raise an `ActiveRecord::ActiveRecordError` error when the MySQL database returns an invalid version string.
253
-
254
- *Kevin McPhillips*
255
-
256
- * `ActiveRecord::Base.transaction` now yields an `ActiveRecord::Transaction` object.
257
-
258
- This allows to register callbacks on it.
156
+ then the generated schema dump will also contain:
259
157
 
260
158
  ```ruby
261
- Article.transaction do |transaction|
262
- article.update(published: true)
263
- transaction.after_commit do
264
- PublishNotificationMailer.with(article: article).deliver_later
265
- end
266
- end
159
+ enable_extension "heroku_ext.pgcrypto"
160
+ enable_extension "pg_stat_statements"
267
161
  ```
268
162
 
269
- *Jean Boussier*
163
+ *Tony Novak*
270
164
 
271
- * Add `ActiveRecord::Base.current_transaction`.
165
+ * Fix `ActiveRecord::Encryption::EncryptedAttributeType#type` to return
166
+ actual cast type.
272
167
 
273
- Returns the current transaction, to allow registering callbacks on it.
168
+ *Vasiliy Ermolovich*
274
169
 
275
- ```ruby
276
- Article.current_transaction.after_commit do
277
- PublishNotificationMailer.with(article: article).deliver_later
278
- end
279
- ```
170
+ * SQLite3Adapter: Bulk insert fixtures.
280
171
 
281
- *Jean Boussier*
172
+ Previously one insert command was executed for each fixture, now they are
173
+ aggregated in a single bulk insert command.
282
174
 
283
- * Add `ActiveRecord.after_all_transactions_commit` callback.
175
+ *Lázaro Nixon*
284
176
 
285
- Useful for code that may run either inside or outside a transaction and needs
286
- to perform work after the state changes have been properly persisted.
177
+ * PostgreSQLAdapter: Allow `disable_extension` to be called with schema-qualified name.
287
178
 
288
- ```ruby
289
- def publish_article(article)
290
- article.update(published: true)
291
- ActiveRecord.after_all_transactions_commit do
292
- PublishNotificationMailer.with(article: article).deliver_later
293
- end
294
- end
295
- ```
296
-
297
- In the above example, the block is either executed immediately if called outside
298
- of a transaction, or called after the open transaction is committed.
179
+ For parity with `enable_extension`, the `disable_extension` method can be called with a schema-qualified
180
+ name (e.g. `disable_extension "myschema.pgcrypto"`). Note that PostgreSQL's `DROP EXTENSION` does not
181
+ actually take a schema name (unlike `CREATE EXTENSION`), so the resulting SQL statement will only name
182
+ the extension, e.g. `DROP EXTENSION IF EXISTS "pgcrypto"`.
299
183
 
300
- If the transaction is rolled back, the block isn't called.
184
+ *Tony Novak*
301
185
 
302
- *Jean Boussier*
186
+ * Make `create_schema` / `drop_schema` reversible in migrations.
303
187
 
304
- * Add the ability to ignore counter cache columns until they are backfilled.
188
+ Previously, `create_schema` and `drop_schema` were irreversible migration operations.
305
189
 
306
- Starting to use counter caches on existing large tables can be troublesome, because the column
307
- values must be backfilled separately of the column addition (to not lock the table for too long)
308
- and before the use of `:counter_cache` (otherwise methods like `size`/`any?`/etc, which use
309
- counter caches internally, can produce incorrect results). People usually use database triggers
310
- or callbacks on child associations while backfilling before introducing a counter cache
311
- configuration to the association.
190
+ *Tony Novak*
312
191
 
313
- Now, to safely backfill the column, while keeping the column updated with child records added/removed, use:
192
+ * Support batching using custom columns.
314
193
 
315
194
  ```ruby
316
- class Comment < ApplicationRecord
317
- belongs_to :post, counter_cache: { active: false }
195
+ Product.in_batches(cursor: [:shop_id, :id]) do |relation|
196
+ # do something with relation
318
197
  end
319
198
  ```
320
199
 
321
- While the counter cache is not "active", the methods like `size`/`any?`/etc will not use it,
322
- but get the results directly from the database. After the counter cache column is backfilled, simply
323
- remove the `{ active: false }` part from the counter cache definition, and it will now be used by the
324
- mentioned methods.
325
-
326
200
  *fatkodima*
327
201
 
328
- * Retry known idempotent SELECT queries on connection-related exceptions.
329
-
330
- SELECT queries we construct by walking the Arel tree and / or with known model attributes
331
- are idempotent and can safely be retried in the case of a connection error. Previously,
332
- adapters such as `TrilogyAdapter` would raise `ActiveRecord::ConnectionFailed: Trilogy::EOFError`
333
- when encountering a connection error mid-request.
334
-
335
- *Adrianna Chang*
336
-
337
- * Allow association's `foreign_key` to be composite.
338
-
339
- `query_constraints` option was the only way to configure a composite foreign key by passing an `Array`.
340
- Now it's possible to pass an Array value as `foreign_key` to achieve the same behavior of an association.
341
-
342
- *Nikita Vasilevsky*
343
-
344
- * Allow association's `primary_key` to be composite.
345
-
346
- Association's `primary_key` can be composite when derived from associated model `primary_key` or `query_constraints`.
347
- Now it's possible to explicitly set it as composite on the association.
202
+ * Use SQLite `IMMEDIATE` transactions when possible.
348
203
 
349
- *Nikita Vasilevsky*
204
+ Transactions run against the SQLite3 adapter default to IMMEDIATE mode to improve concurrency support and avoid busy exceptions.
350
205
 
351
- * Add `config.active_record.permanent_connection_checkout` setting.
352
-
353
- Controls whether `ActiveRecord::Base.connection` raises an error, emits a deprecation warning, or neither.
354
-
355
- `ActiveRecord::Base.connection` checkouts a database connection from the pool and keeps it leased until the end of
356
- the request or job. This behavior can be undesirable in environments that use many more threads or fibers than there
357
- is available connections.
358
-
359
- This configuration can be used to track down and eliminate code that calls `ActiveRecord::Base.connection` and
360
- migrate it to use `ActiveRecord::Base.with_connection` instead.
361
-
362
- The default behavior remains unchanged, and there is currently no plans to change the default.
363
-
364
- *Jean Boussier*
365
-
366
- * Add dirties option to uncached.
367
-
368
- This adds a `dirties` option to `ActiveRecord::Base.uncached` and
369
- `ActiveRecord::ConnectionAdapters::ConnectionPool#uncached`.
370
-
371
- When set to `true` (the default), writes will clear all query caches belonging to the current thread.
372
- When set to `false`, writes to the affected connection pool will not clear any query cache.
373
-
374
- This is needed by Solid Cache so that cache writes do not clear query caches.
375
-
376
- *Donal McBreen*
377
-
378
- * Deprecate `ActiveRecord::Base.connection` in favor of `.lease_connection`.
379
-
380
- The method has been renamed as `lease_connection` to better reflect that the returned
381
- connection will be held for the duration of the request or job.
382
-
383
- This deprecation is a soft deprecation, no warnings will be issued and there is no
384
- current plan to remove the method.
385
-
386
- *Jean Boussier*
387
-
388
- * Deprecate `ActiveRecord::ConnectionAdapters::ConnectionPool#connection`.
389
-
390
- The method has been renamed as `lease_connection` to better reflect that the returned
391
- connection will be held for the duration of the request or job.
392
-
393
- *Jean Boussier*
206
+ *Stephen Margheim*
394
207
 
395
- * Expose a generic fixture accessor for fixture names that may conflict with Minitest.
208
+ * Raise specific exception when a connection is not defined.
396
209
 
397
- ```ruby
398
- assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
399
- assert_equal "Ruby on Rails", fixture(:web_sites, :rubyonrails).name
400
- ```
210
+ The new `ConnectionNotDefined` exception provides connection name, shard and role accessors indicating the details of the connection that was requested.
401
211
 
402
- *Jean Boussier*
212
+ *Hana Harencarova*, *Matthew Draper*
403
213
 
404
- * Using `Model.query_constraints` with a single non-primary-key column used to raise as expected, but with an
405
- incorrect error message.
214
+ * Delete the deprecated constant `ActiveRecord::ImmutableRelation`.
406
215
 
407
- This has been fixed to raise with a more appropriate error message.
216
+ *Xavier Noria*
408
217
 
409
- *Joshua Young*
218
+ * Fix duplicate callback execution when child autosaves parent with `has_one` and `belongs_to`.
410
219
 
411
- * Fix `has_one` association autosave setting the foreign key attribute when it is unchanged.
220
+ Before, persisting a new child record with a new associated parent record would run `before_validation`,
221
+ `after_validation`, `before_save` and `after_save` callbacks twice.
412
222
 
413
- This behavior is also inconsistent with autosaving `belongs_to` and can have unintended side effects like raising
414
- an `ActiveRecord::ReadonlyAttributeError` when the foreign key attribute is marked as read-only.
223
+ Now, these callbacks are only executed once as expected.
415
224
 
416
225
  *Joshua Young*
417
226
 
418
- * Remove deprecated behavior that would rollback a transaction block when exited using `return`, `break` or `throw`.
419
-
420
- *Rafael Mendonça França*
421
-
422
- * Deprecate `Rails.application.config.active_record.commit_transaction_on_non_local_return`.
423
-
424
- *Rafael Mendonça França*
425
-
426
- * Remove deprecated support to pass `rewhere` to `ActiveRecord::Relation#merge`.
427
-
428
- *Rafael Mendonça França*
429
-
430
- * Remove deprecated support to pass `deferrable: true` to `add_foreign_key`.
431
-
432
- *Rafael Mendonça França*
433
-
434
- * Remove deprecated support to quote `ActiveSupport::Duration`.
435
-
436
- *Rafael Mendonça França*
437
-
438
- * Remove deprecated `#quote_bound_value`.
439
-
440
- *Rafael Mendonça França*
441
-
442
- * Remove deprecated `ActiveRecord::ConnectionAdapters::ConnectionPool#connection_klass`.
443
-
444
- *Rafael Mendonça França*
445
-
446
- * Remove deprecated support to apply `#connection_pool_list`, `#active_connections?`, `#clear_active_connections!`,
447
- `#clear_reloadable_connections!`, `#clear_all_connections!` and `#flush_idle_connections!` to the connections pools
448
- for the current role when the `role` argument isn't provided.
449
-
450
- *Rafael Mendonça França*
451
-
452
- * Remove deprecated `#all_connection_pools`.
453
-
454
- *Rafael Mendonça França*
455
-
456
- * Remove deprecated `ActiveRecord::ConnectionAdapters::SchemaCache#data_sources`.
457
-
458
- *Rafael Mendonça França*
459
-
460
- * Remove deprecated `ActiveRecord::ConnectionAdapters::SchemaCache.load_from`.
461
-
462
- *Rafael Mendonça França*
463
-
464
- * Remove deprecated `#all_foreign_keys_valid?` from database adapters.
465
-
466
- *Rafael Mendonça França*
467
-
468
- * Remove deprecated support to passing coder and class as second argument to `serialize`.
469
-
470
- *Rafael Mendonça França*
471
-
472
- * Remove deprecated support to `ActiveRecord::Base#read_attribute(:id)` to return the custom primary key value.
473
-
474
- *Rafael Mendonça França*
475
-
476
- * Remove deprecated `TestFixtures.fixture_path`.
477
-
478
- *Rafael Mendonça França*
479
-
480
- * Remove deprecated behavior to support referring to a singular association by its plural name.
481
-
482
- *Rafael Mendonça França*
483
-
484
- * Deprecate `Rails.application.config.active_record.allow_deprecated_singular_associations_name`.
485
-
486
- *Rafael Mendonça França*
487
-
488
- * Remove deprecated support to passing `SchemaMigration` and `InternalMetadata` classes as arguments to
489
- `ActiveRecord::MigrationContext`.
490
-
491
- *Rafael Mendonça França*
492
-
493
- * Remove deprecated `ActiveRecord::Migration.check_pending!` method.
494
-
495
- *Rafael Mendonça França*
496
-
497
- * Remove deprecated `ActiveRecord::LogSubscriber.runtime` method.
498
-
499
- *Rafael Mendonça França*
500
-
501
- * Remove deprecated `ActiveRecord::LogSubscriber.runtime=` method.
502
-
503
- *Rafael Mendonça França*
504
-
505
- * Remove deprecated `ActiveRecord::LogSubscriber.reset_runtime` method.
506
-
507
- *Rafael Mendonça França*
508
-
509
- * Remove deprecated support to define `explain` in the connection adapter with 2 arguments.
510
-
511
- *Rafael Mendonça França*
512
-
513
- * Remove deprecated `ActiveRecord::ActiveJobRequiredError`.
514
-
515
- *Rafael Mendonça França*
516
-
517
- * Remove deprecated `ActiveRecord::Base.clear_active_connections!`.
518
-
519
- *Rafael Mendonça França*
520
-
521
- * Remove deprecated `ActiveRecord::Base.clear_reloadable_connections!`.
522
-
523
- *Rafael Mendonça França*
524
-
525
- * Remove deprecated `ActiveRecord::Base.clear_all_connections!`.
526
-
527
- *Rafael Mendonça França*
528
-
529
- * Remove deprecated `ActiveRecord::Base.flush_idle_connections!`.
530
-
531
- *Rafael Mendonça França*
532
-
533
- * Remove deprecated `name` argument from `ActiveRecord::Base.remove_connection`.
534
-
535
- *Rafael Mendonça França*
536
-
537
- * Remove deprecated support to call `alias_attribute` with non-existent attribute names.
538
-
539
- *Rafael Mendonça França*
540
-
541
- * Remove deprecated `Rails.application.config.active_record.suppress_multiple_database_warning`.
542
-
543
- *Rafael Mendonça França*
544
-
545
- * Add `ActiveRecord::Encryption::MessagePackMessageSerializer`.
546
-
547
- Serialize data to the MessagePack format, for efficient storage in binary columns.
548
-
549
- The binary encoding requires around 30% less space than the base64 encoding
550
- used by the default serializer.
551
-
552
- *Donal McBreen*
553
-
554
- * Add support for encrypting binary columns.
555
-
556
- Ensure encryption and decryption pass `Type::Binary::Data` around for binary data.
557
-
558
- Previously encrypting binary columns with the `ActiveRecord::Encryption::MessageSerializer`
559
- incidentally worked for MySQL and SQLite, but not PostgreSQL.
560
-
561
- *Donal McBreen*
562
-
563
- * Deprecated `ENV["SCHEMA_CACHE"]` in favor of `schema_cache_path` in the database configuration.
564
-
565
- *Rafael Mendonça França*
566
-
567
- * Add `ActiveRecord::Base.with_connection` as a shortcut for leasing a connection for a short duration.
568
-
569
- The leased connection is yielded, and for the duration of the block, any call to `ActiveRecord::Base.connection`
570
- will yield that same connection.
571
-
572
- This is useful to perform a few database operations without causing a connection to be leased for the
573
- entire duration of the request or job.
574
-
575
- *Jean Boussier*
576
-
577
- * Deprecate `config.active_record.warn_on_records_fetched_greater_than` now that `sql.active_record`
578
- notification includes `:row_count` field.
579
-
580
- *Jason Nochlin*
581
-
582
- * The fix ensures that the association is joined using the appropriate join type
583
- (either inner join or left outer join) based on the existing joins in the scope.
584
-
585
- This prevents unintentional overrides of existing join types and ensures consistency in the generated SQL queries.
586
-
587
- Example:
588
-
589
-
227
+ * `ActiveRecord::Encryption::Encryptor` now supports a `:compressor` option to customize the compression algorithm used.
590
228
 
591
229
  ```ruby
592
- # `associated` will use `LEFT JOIN` instead of using `JOIN`
593
- Post.left_joins(:author).where.associated(:author)
594
- ```
595
-
596
- *Saleh Alhaddad*
597
-
598
- * Fix an issue where `ActiveRecord::Encryption` configurations are not ready before the loading
599
- of Active Record models, when an application is eager loaded. As a result, encrypted attributes
600
- could be misconfigured in some cases.
601
-
602
- *Maxime Réty*
603
-
604
- * Deprecate defining an `enum` with keyword arguments.
230
+ module ZstdCompressor
231
+ def self.deflate(data)
232
+ Zstd.compress(data)
233
+ end
605
234
 
606
- ```ruby
607
- class Function > ApplicationRecord
608
- # BAD
609
- enum color: [:red, :blue],
610
- type: [:instance, :class]
611
-
612
- # GOOD
613
- enum :color, [:red, :blue]
614
- enum :type, [:instance, :class]
235
+ def self.inflate(data)
236
+ Zstd.decompress(data)
237
+ end
615
238
  end
616
- ```
617
-
618
- *Hartley McGuire*
619
-
620
- * Add `config.active_record.validate_migration_timestamps` option for validating migration timestamps.
621
-
622
- When set, validates that the timestamp prefix for a migration is no more than a day ahead of
623
- the timestamp associated with the current time. This is designed to prevent migrations prefixes
624
- from being hand-edited to future timestamps, which impacts migration generation and other
625
- migration commands.
626
-
627
- *Adrianna Chang*
628
239
 
629
- * Properly synchronize `Mysql2Adapter#active?` and `TrilogyAdapter#active?`.
630
-
631
- As well as `disconnect!` and `verify!`.
632
-
633
- This generally isn't a big problem as connections must not be shared between
634
- threads, but is required when running transactional tests or system tests
635
- and could lead to a SEGV.
636
-
637
- *Jean Boussier*
638
-
639
- * Support `:source_location` tag option for query log tags.
640
-
641
- ```ruby
642
- config.active_record.query_log_tags << :source_location
240
+ class User
241
+ encrypts :name, compressor: ZstdCompressor
242
+ end
643
243
  ```
644
244
 
645
- Calculating the caller location is a costly operation and should be used primarily in development
646
- (note, there is also a `config.active_record.verbose_query_logs` that serves the same purpose)
647
- or occasionally on production for debugging purposes.
648
-
649
- *fatkodima*
650
-
651
- * Add an option to `ActiveRecord::Encryption::Encryptor` to disable compression.
652
-
653
- Allow compression to be disabled by setting `compress: false`
245
+ You disable compression by passing `compress: false`.
654
246
 
655
247
  ```ruby
656
- class User
657
- encrypts :name, encryptor: ActiveRecord::Encryption::Encryptor.new(compress: false)
658
- end
248
+ class User
249
+ encrypts :name, compress: false
250
+ end
659
251
  ```
660
252
 
661
- *Donal McBreen*
662
-
663
- * Deprecate passing strings to `ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename`.
664
-
665
- A `ActiveRecord::DatabaseConfigurations::DatabaseConfig` object should be passed instead.
666
-
667
- *Rafael Mendonça França*
668
-
669
- * Add `row_count` field to `sql.active_record` notification.
670
-
671
- This field returns the amount of rows returned by the query that emitted the notification.
672
-
673
- This metric is useful in cases where one wants to detect queries with big result sets.
674
-
675
- *Marvin Bitterlich*
676
-
677
- * Consistently raise an `ArgumentError` when passing an invalid argument to a nested attributes association writer.
253
+ *heka1024*
678
254
 
679
- Previously, this would only raise on collection associations and produce a generic error on singular associations.
680
-
681
- Now, it will raise on both collection and singular associations.
682
-
683
- *Joshua Young*
684
-
685
- * Fix single quote escapes on default generated MySQL columns.
686
-
687
- MySQL 5.7.5+ supports generated columns, which can be used to create a column that is computed from an expression.
688
-
689
- Previously, the schema dump would output a string with double escapes for generated columns with single quotes in the default expression.
690
-
691
- This would result in issues when importing the schema on a fresh instance of a MySQL database.
692
-
693
- Now, the string will not be escaped and will be valid Ruby upon importing of the schema.
694
-
695
- *Yash Kapadia*
696
-
697
- * Fix Migrations with versions older than 7.1 validating options given to
698
- `add_reference` and `t.references`.
255
+ * Add condensed `#inspect` for `ConnectionPool`, `AbstractAdapter`, and
256
+ `DatabaseConfig`.
699
257
 
700
258
  *Hartley McGuire*
701
259
 
702
- * Add `<role>_types` class method to `ActiveRecord::DelegatedType` so that the delegated types can be introspected.
703
-
704
- *JP Rosevear*
705
-
706
- * Make `schema_dump`, `query_cache`, `replica` and `database_tasks` configurable via `DATABASE_URL`.
707
-
708
- This wouldn't always work previously because boolean values would be interpreted as strings.
709
-
710
- e.g. `DATABASE_URL=postgres://localhost/foo?schema_dump=false` now properly disable dumping the schema
711
- cache.
712
-
713
- *Mike Coutermarsh*, *Jean Boussier*
714
-
715
- * Introduce `ActiveRecord::Transactions::ClassMethods#set_callback`.
716
-
717
- It is identical to `ActiveSupport::Callbacks::ClassMethods#set_callback`
718
- but with support for `after_commit` and `after_rollback` callback options.
719
-
720
- *Joshua Young*
721
-
722
- * Make `ActiveRecord::Encryption::Encryptor` agnostic of the serialization format used for encrypted data.
723
-
724
- Previously, the encryptor instance only allowed an encrypted value serialized as a `String` to be passed to the message serializer.
725
-
726
- Now, the encryptor lets the configured `message_serializer` decide which types of serialized encrypted values are supported. A custom serialiser is therefore allowed to serialize `ActiveRecord::Encryption::Message` objects using a type other than `String`.
727
-
728
- The default `ActiveRecord::Encryption::MessageSerializer` already ensures that only `String` objects are passed for deserialization.
729
-
730
- *Maxime Réty*
731
-
732
- * Fix `encrypted_attribute?` to take into account context properties passed to `encrypts`.
733
-
734
- *Maxime Réty*
735
-
736
- * The object returned by `explain` now responds to `pluck`, `first`,
737
- `last`, `average`, `count`, `maximum`, `minimum`, and `sum`. Those
738
- new methods run `EXPLAIN` on the corresponding queries:
260
+ * Add `.shard_keys`, `.sharded?`, & `.connected_to_all_shards` methods.
739
261
 
740
262
  ```ruby
741
- User.all.explain.count
742
- # EXPLAIN SELECT COUNT(*) FROM `users`
743
- # ...
744
-
745
- User.all.explain.maximum(:id)
746
- # EXPLAIN SELECT MAX(`users`.`id`) FROM `users`
747
- # ...
748
- ```
749
-
750
- *Petrik de Heus*
263
+ class ShardedBase < ActiveRecord::Base
264
+ self.abstract_class = true
751
265
 
752
- * Fixes an issue where `validates_associated` `:on` option wasn't respected
753
- when validating associated records.
754
-
755
- *Austen Madden*, *Alex Ghiculescu*, *Rafał Brize*
756
-
757
- * Allow overriding SQLite defaults from `database.yml`.
758
-
759
- Any PRAGMA configuration set under the `pragmas` key in the configuration
760
- file takes precedence over Rails' defaults, and additional PRAGMAs can be
761
- set as well.
762
-
763
- ```yaml
764
- database: storage/development.sqlite3
765
- timeout: 5000
766
- pragmas:
767
- journal_mode: off
768
- temp_store: memory
769
- ```
770
-
771
- *Stephen Margheim*
772
-
773
- * Remove warning message when running SQLite in production, but leave it unconfigured.
774
-
775
- There are valid use cases for running SQLite in production. However, it must be done
776
- with care, so instead of a warning most users won't see anyway, it's preferable to
777
- leave the configuration commented out to force them to think about having the database
778
- on a persistent volume etc.
779
-
780
- *Jacopo Beschi*, *Jean Boussier*
781
-
782
- * Add support for generated columns to the SQLite3 adapter.
783
-
784
- Generated columns (both stored and dynamic) are supported since version 3.31.0 of SQLite.
785
- This adds support for those to the SQLite3 adapter.
786
-
787
- ```ruby
788
- create_table :users do |t|
789
- t.string :name
790
- t.virtual :name_upper, type: :string, as: 'UPPER(name)'
791
- t.virtual :name_lower, type: :string, as: 'LOWER(name)', stored: true
266
+ connects_to shards: {
267
+ shard_one: { writing: :shard_one },
268
+ shard_two: { writing: :shard_two }
269
+ }
792
270
  end
793
- ```
794
-
795
- *Stephen Margheim*
796
-
797
- * TrilogyAdapter: ignore `host` if `socket` parameter is set.
798
-
799
- This allows to configure a connection on a UNIX socket via `DATABASE_URL`:
800
-
801
- ```
802
- DATABASE_URL=trilogy://does-not-matter/my_db_production?socket=/var/run/mysql.sock
803
- ```
804
-
805
- *Jean Boussier*
806
-
807
- * Make `assert_queries_count`, `assert_no_queries`, `assert_queries_match`, and
808
- `assert_no_queries_match` assertions public.
809
-
810
- To assert the expected number of queries are made, Rails internally uses `assert_queries_count` and
811
- `assert_no_queries`. To assert that specific SQL queries are made, `assert_queries_match` and
812
- `assert_no_queries_match` are used. These assertions can now be used in applications as well.
813
-
814
- ```ruby
815
- class ArticleTest < ActiveSupport::TestCase
816
- test "queries are made" do
817
- assert_queries_count(1) { Article.first }
818
- end
819
271
 
820
- test "creates a foreign key" do
821
- assert_queries_match(/ADD FOREIGN KEY/i, include_schema: true) do
822
- @connection.add_foreign_key(:comments, :posts)
823
- end
824
- end
272
+ class ShardedModel < ShardedBase
825
273
  end
826
- ```
827
-
828
- *Petrik de Heus*, *fatkodima*
829
-
830
- * Fix `has_secure_token` calls the setter method on initialize.
831
-
832
- *Abeid Ahmed*
833
-
834
- * When using a `DATABASE_URL`, allow for a configuration to map the protocol in the URL to a specific database
835
- adapter. This allows decoupling the adapter the application chooses to use from the database connection details
836
- set in the deployment environment.
837
274
 
838
- ```ruby
839
- # ENV['DATABASE_URL'] = "mysql://localhost/example_database"
840
- config.active_record.protocol_adapters.mysql = "trilogy"
841
- # will connect to MySQL using the trilogy adapter
275
+ ShardedModel.shard_keys => [:shard_one, :shard_two]
276
+ ShardedModel.sharded? => true
277
+ ShardedBase.connected_to_all_shards { ShardedModel.current_shard } => [:shard_one, :shard_two]
842
278
  ```
843
279
 
844
- *Jean Boussier*, *Kevin McPhillips*
845
-
846
- * In cases where MySQL returns `warning_count` greater than zero, but returns no warnings when
847
- the `SHOW WARNINGS` query is executed, `ActiveRecord.db_warnings_action` proc will still be
848
- called with a generic warning message rather than silently ignoring the warning(s).
849
-
850
- *Kevin McPhillips*
851
-
852
- * `DatabaseConfigurations#configs_for` accepts a symbol in the `name` parameter.
853
-
854
- *Andrew Novoselac*
280
+ *Nony Dutton*
855
281
 
856
- * Fix `where(field: values)` queries when `field` is a serialized attribute
857
- (for example, when `field` uses `ActiveRecord::Base.serialize` or is a JSON
858
- column).
859
-
860
- *João Alves*
861
-
862
- * Make the output of `ActiveRecord::Core#inspect` configurable.
863
-
864
- By default, calling `inspect` on a record will yield a formatted string including just the `id`.
865
-
866
- ```ruby
867
- Post.first.inspect #=> "#<Post id: 1>"
868
- ```
282
+ * Add a `filter` option to `in_order_of` to prioritize certain values in the sorting without filtering the results
283
+ by these values.
869
284
 
870
- The attributes to be included in the output of `inspect` can be configured with
871
- `ActiveRecord::Core#attributes_for_inspect`.
285
+ *Igor Depolli*
872
286
 
873
- ```ruby
874
- Post.attributes_for_inspect = [:id, :title]
875
- Post.first.inspect #=> "#<Post id: 1, title: "Hello, World!">"
876
- ```
287
+ * Fix an issue where the IDs reader method did not return expected results
288
+ for preloaded associations in models using composite primary keys.
877
289
 
878
- With `attributes_for_inspect` set to `:all`, `inspect` will list all the record's attributes.
290
+ *Jay Ang*
879
291
 
880
- ```ruby
881
- Post.attributes_for_inspect = :all
882
- Post.first.inspect #=> "#<Post id: 1, title: "Hello, World!", published_at: "2023-10-23 14:28:11 +0000">"
883
- ```
292
+ * Allow to configure `strict_loading_mode` globally or within a model.
884
293
 
885
- In `development` and `test` mode, `attributes_for_inspect` will be set to `:all` by default.
294
+ Defaults to `:all`, can be changed to `:n_plus_one_only`.
886
295
 
887
- You can also call `full_inspect` to get an inspection with all the attributes.
296
+ *Garen Torikian*
888
297
 
889
- The attributes in `attribute_for_inspect` will also be used for `pretty_print`.
298
+ * Add `ActiveRecord::Relation#readonly?`.
890
299
 
891
- *Andrew Novoselac*
300
+ Reflects if the relation has been marked as readonly.
892
301
 
893
- * Don't mark attributes as changed when reassigned to `Float::INFINITY` or
894
- `-Float::INFINITY`.
302
+ *Theodor Tonum*
895
303
 
896
- *Maicol Bentancor*
304
+ * Improve `ActiveRecord::Store` to raise a descriptive exception if the column is not either
305
+ structured (e.g., PostgreSQL +hstore+/+json+, or MySQL +json+) or declared serializable via
306
+ `ActiveRecord.store`.
897
307
 
898
- * Support the `RETURNING` clause for MariaDB.
308
+ Previously, a `NoMethodError` would be raised when the accessor was read or written:
899
309
 
900
- *fatkodima*, *Nikolay Kondratyev*
310
+ NoMethodError: undefined method `accessor' for an instance of ActiveRecord::Type::Text
901
311
 
902
- * The SQLite3 adapter now implements the `supports_deferrable_constraints?` contract.
312
+ Now, a descriptive `ConfigurationError` is raised:
903
313
 
904
- Allows foreign keys to be deferred by adding the `:deferrable` key to the `foreign_key` options.
314
+ ActiveRecord::ConfigurationError: the column 'metadata' has not been configured as a store.
315
+ Please make sure the column is declared serializable via 'ActiveRecord.store' or, if your
316
+ database supports it, use a structured column type like hstore or json.
905
317
 
906
- ```ruby
907
- add_reference :person, :alias, foreign_key: { deferrable: :deferred }
908
- add_reference :alias, :person, foreign_key: { deferrable: :deferred }
909
- ```
318
+ *Mike Dalessio*
910
319
 
911
- *Stephen Margheim*
320
+ * Fix inference of association model on nested models with the same demodularized name.
912
321
 
913
- * Add the `set_constraints` helper to PostgreSQL connections.
322
+ E.g. with the following setup:
914
323
 
915
324
  ```ruby
916
- Post.create!(user_id: -1) # => ActiveRecord::InvalidForeignKey
917
-
918
- Post.transaction do
919
- Post.connection.set_constraints(:deferred)
920
- p = Post.create!(user_id: -1)
921
- u = User.create!
922
- p.user = u
923
- p.save!
325
+ class Nested::Post < ApplicationRecord
326
+ has_one :post, through: :other
924
327
  end
925
328
  ```
926
329
 
927
- *Cody Cutrer*
928
-
929
- * Include `ActiveModel::API` in `ActiveRecord::Base`.
930
-
931
- *Sean Doyle*
932
-
933
- * Ensure `#signed_id` outputs `url_safe` strings.
934
-
935
- *Jason Meller*
330
+ Before, `#post` would infer the model as `Nested::Post`, but now it correctly infers `Post`.
936
331
 
937
- * Add `nulls_last` and working `desc.nulls_first` for MySQL.
332
+ *Joshua Young*
938
333
 
939
- *Tristan Fellows*
334
+ * Add public method for checking if a table is ignored by the schema cache.
940
335
 
941
- * Allow for more complex hash arguments for `order` which mimics `where` in `ActiveRecord::Relation`.
336
+ Previously, an application would need to reimplement `ignored_table?` from the schema cache class to check if a table was set to be ignored. This adds a public method to support this and updates the schema cache to use that directly.
942
337
 
943
338
  ```ruby
944
- Topic.includes(:posts).order(posts: { created_at: :desc })
339
+ ActiveRecord.schema_cache_ignored_tables = ["developers"]
340
+ ActiveRecord.schema_cache_ignored_table?("developers")
341
+ => true
945
342
  ```
946
343
 
947
- *Myles Boone*
344
+ *Eileen M. Uchitelle*
948
345
 
949
- Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/activerecord/CHANGELOG.md) for previous changes.
346
+ Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md) for previous changes.