activerecord 6.0.4 → 6.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +767 -846
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +3 -3
  5. data/lib/active_record.rb +7 -14
  6. data/lib/active_record/aggregations.rb +1 -1
  7. data/lib/active_record/association_relation.rb +22 -14
  8. data/lib/active_record/associations.rb +114 -11
  9. data/lib/active_record/associations/alias_tracker.rb +19 -15
  10. data/lib/active_record/associations/association.rb +39 -27
  11. data/lib/active_record/associations/association_scope.rb +11 -15
  12. data/lib/active_record/associations/belongs_to_association.rb +15 -5
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
  14. data/lib/active_record/associations/builder/association.rb +9 -3
  15. data/lib/active_record/associations/builder/belongs_to.rb +10 -7
  16. data/lib/active_record/associations/builder/collection_association.rb +5 -4
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -1
  18. data/lib/active_record/associations/builder/has_many.rb +6 -2
  19. data/lib/active_record/associations/builder/has_one.rb +11 -14
  20. data/lib/active_record/associations/builder/singular_association.rb +1 -1
  21. data/lib/active_record/associations/collection_association.rb +19 -13
  22. data/lib/active_record/associations/collection_proxy.rb +12 -5
  23. data/lib/active_record/associations/foreign_association.rb +13 -0
  24. data/lib/active_record/associations/has_many_association.rb +24 -2
  25. data/lib/active_record/associations/has_many_through_association.rb +10 -4
  26. data/lib/active_record/associations/has_one_association.rb +15 -1
  27. data/lib/active_record/associations/join_dependency.rb +63 -49
  28. data/lib/active_record/associations/join_dependency/join_association.rb +29 -14
  29. data/lib/active_record/associations/join_dependency/join_part.rb +1 -1
  30. data/lib/active_record/associations/preloader.rb +5 -3
  31. data/lib/active_record/associations/preloader/association.rb +13 -5
  32. data/lib/active_record/associations/preloader/through_association.rb +1 -1
  33. data/lib/active_record/associations/singular_association.rb +1 -1
  34. data/lib/active_record/attribute_assignment.rb +10 -8
  35. data/lib/active_record/attribute_methods.rb +52 -48
  36. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  37. data/lib/active_record/attribute_methods/dirty.rb +1 -11
  38. data/lib/active_record/attribute_methods/primary_key.rb +6 -2
  39. data/lib/active_record/attribute_methods/query.rb +3 -6
  40. data/lib/active_record/attribute_methods/read.rb +8 -11
  41. data/lib/active_record/attribute_methods/serialization.rb +4 -4
  42. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -13
  43. data/lib/active_record/attribute_methods/write.rb +12 -20
  44. data/lib/active_record/attributes.rb +27 -7
  45. data/lib/active_record/autosave_association.rb +47 -30
  46. data/lib/active_record/base.rb +2 -14
  47. data/lib/active_record/callbacks.rb +32 -22
  48. data/lib/active_record/coders/yaml_column.rb +1 -1
  49. data/lib/active_record/connection_adapters.rb +50 -0
  50. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +180 -134
  51. data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
  52. data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -22
  53. data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -7
  54. data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
  55. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  56. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
  57. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +110 -30
  58. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
  59. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +224 -85
  60. data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -24
  61. data/lib/active_record/connection_adapters/abstract_adapter.rb +31 -70
  62. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +123 -87
  63. data/lib/active_record/connection_adapters/column.rb +15 -1
  64. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  65. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  66. data/lib/active_record/connection_adapters/mysql/database_statements.rb +22 -24
  67. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -1
  68. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  69. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +33 -6
  70. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
  71. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
  72. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +3 -3
  73. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  74. data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -12
  75. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  76. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  77. data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
  78. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +12 -53
  79. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  80. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  81. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  82. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -10
  83. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  84. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -2
  85. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  87. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -1
  89. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  90. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
  91. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +5 -1
  92. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +61 -29
  93. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  94. data/lib/active_record/connection_adapters/postgresql_adapter.rb +72 -55
  95. data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
  96. data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
  97. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +30 -5
  98. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -1
  99. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  100. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +36 -3
  101. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +48 -50
  102. data/lib/active_record/connection_handling.rb +210 -71
  103. data/lib/active_record/core.rb +215 -49
  104. data/lib/active_record/database_configurations.rb +124 -85
  105. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  106. data/lib/active_record/database_configurations/database_config.rb +52 -9
  107. data/lib/active_record/database_configurations/hash_config.rb +54 -8
  108. data/lib/active_record/database_configurations/url_config.rb +15 -40
  109. data/lib/active_record/delegated_type.rb +209 -0
  110. data/lib/active_record/destroy_association_async_job.rb +36 -0
  111. data/lib/active_record/enum.rb +33 -23
  112. data/lib/active_record/errors.rb +47 -12
  113. data/lib/active_record/explain.rb +9 -4
  114. data/lib/active_record/explain_subscriber.rb +1 -1
  115. data/lib/active_record/fixture_set/file.rb +10 -17
  116. data/lib/active_record/fixture_set/model_metadata.rb +1 -2
  117. data/lib/active_record/fixture_set/render_context.rb +1 -1
  118. data/lib/active_record/fixture_set/table_row.rb +2 -2
  119. data/lib/active_record/fixtures.rb +54 -8
  120. data/lib/active_record/gem_version.rb +3 -3
  121. data/lib/active_record/inheritance.rb +40 -18
  122. data/lib/active_record/insert_all.rb +32 -5
  123. data/lib/active_record/integration.rb +3 -5
  124. data/lib/active_record/internal_metadata.rb +15 -4
  125. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  126. data/lib/active_record/locking/optimistic.rb +13 -16
  127. data/lib/active_record/locking/pessimistic.rb +6 -2
  128. data/lib/active_record/log_subscriber.rb +26 -8
  129. data/lib/active_record/middleware/database_selector.rb +4 -1
  130. data/lib/active_record/middleware/database_selector/resolver.rb +5 -0
  131. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  132. data/lib/active_record/migration.rb +113 -83
  133. data/lib/active_record/migration/command_recorder.rb +47 -27
  134. data/lib/active_record/migration/compatibility.rb +67 -17
  135. data/lib/active_record/model_schema.rb +88 -42
  136. data/lib/active_record/nested_attributes.rb +2 -3
  137. data/lib/active_record/no_touching.rb +1 -1
  138. data/lib/active_record/persistence.rb +50 -45
  139. data/lib/active_record/query_cache.rb +15 -5
  140. data/lib/active_record/querying.rb +11 -6
  141. data/lib/active_record/railtie.rb +64 -44
  142. data/lib/active_record/railties/databases.rake +253 -98
  143. data/lib/active_record/readonly_attributes.rb +4 -0
  144. data/lib/active_record/reflection.rb +59 -44
  145. data/lib/active_record/relation.rb +90 -64
  146. data/lib/active_record/relation/batches.rb +38 -31
  147. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  148. data/lib/active_record/relation/calculations.rb +100 -43
  149. data/lib/active_record/relation/finder_methods.rb +44 -14
  150. data/lib/active_record/relation/from_clause.rb +1 -1
  151. data/lib/active_record/relation/merger.rb +20 -23
  152. data/lib/active_record/relation/predicate_builder.rb +57 -33
  153. data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
  154. data/lib/active_record/relation/predicate_builder/association_query_value.rb +2 -2
  155. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +3 -3
  156. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  157. data/lib/active_record/relation/query_methods.rb +319 -196
  158. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  159. data/lib/active_record/relation/spawn_methods.rb +6 -5
  160. data/lib/active_record/relation/where_clause.rb +104 -57
  161. data/lib/active_record/result.rb +41 -33
  162. data/lib/active_record/runtime_registry.rb +2 -2
  163. data/lib/active_record/sanitization.rb +6 -17
  164. data/lib/active_record/schema_dumper.rb +34 -4
  165. data/lib/active_record/schema_migration.rb +0 -4
  166. data/lib/active_record/scoping/named.rb +1 -17
  167. data/lib/active_record/secure_token.rb +16 -8
  168. data/lib/active_record/serialization.rb +5 -3
  169. data/lib/active_record/signed_id.rb +116 -0
  170. data/lib/active_record/statement_cache.rb +20 -4
  171. data/lib/active_record/store.rb +2 -2
  172. data/lib/active_record/suppressor.rb +2 -2
  173. data/lib/active_record/table_metadata.rb +36 -52
  174. data/lib/active_record/tasks/database_tasks.rb +139 -113
  175. data/lib/active_record/tasks/mysql_database_tasks.rb +34 -35
  176. data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -26
  177. data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -9
  178. data/lib/active_record/test_databases.rb +5 -4
  179. data/lib/active_record/test_fixtures.rb +36 -33
  180. data/lib/active_record/timestamp.rb +4 -6
  181. data/lib/active_record/touch_later.rb +21 -21
  182. data/lib/active_record/transactions.rb +15 -64
  183. data/lib/active_record/type.rb +8 -1
  184. data/lib/active_record/type/serialized.rb +6 -2
  185. data/lib/active_record/type_caster/connection.rb +0 -1
  186. data/lib/active_record/type_caster/map.rb +8 -5
  187. data/lib/active_record/validations.rb +1 -0
  188. data/lib/active_record/validations/associated.rb +1 -1
  189. data/lib/active_record/validations/numericality.rb +35 -0
  190. data/lib/active_record/validations/uniqueness.rb +24 -4
  191. data/lib/arel.rb +5 -13
  192. data/lib/arel/attributes/attribute.rb +4 -0
  193. data/lib/arel/collectors/bind.rb +5 -0
  194. data/lib/arel/collectors/composite.rb +8 -0
  195. data/lib/arel/collectors/sql_string.rb +7 -0
  196. data/lib/arel/collectors/substitute_binds.rb +7 -0
  197. data/lib/arel/nodes.rb +3 -1
  198. data/lib/arel/nodes/binary.rb +82 -8
  199. data/lib/arel/nodes/bind_param.rb +8 -0
  200. data/lib/arel/nodes/casted.rb +21 -9
  201. data/lib/arel/nodes/equality.rb +6 -9
  202. data/lib/arel/nodes/grouping.rb +3 -0
  203. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  204. data/lib/arel/nodes/in.rb +8 -1
  205. data/lib/arel/nodes/infix_operation.rb +13 -1
  206. data/lib/arel/nodes/join_source.rb +1 -1
  207. data/lib/arel/nodes/node.rb +7 -6
  208. data/lib/arel/nodes/ordering.rb +27 -0
  209. data/lib/arel/nodes/sql_literal.rb +3 -0
  210. data/lib/arel/nodes/table_alias.rb +7 -3
  211. data/lib/arel/nodes/unary.rb +0 -1
  212. data/lib/arel/predications.rb +12 -18
  213. data/lib/arel/select_manager.rb +1 -2
  214. data/lib/arel/table.rb +13 -5
  215. data/lib/arel/visitors.rb +0 -7
  216. data/lib/arel/visitors/dot.rb +14 -2
  217. data/lib/arel/visitors/mysql.rb +11 -1
  218. data/lib/arel/visitors/postgresql.rb +15 -4
  219. data/lib/arel/visitors/to_sql.rb +89 -78
  220. data/lib/rails/generators/active_record/migration.rb +6 -1
  221. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  222. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
  223. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +3 -3
  224. data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
  225. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  226. metadata +27 -28
  227. data/lib/active_record/advisory_lock_base.rb +0 -18
  228. data/lib/active_record/attribute_decorators.rb +0 -88
  229. data/lib/active_record/connection_adapters/connection_specification.rb +0 -296
  230. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  231. data/lib/active_record/define_callbacks.rb +0 -22
  232. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  233. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  234. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  235. data/lib/arel/attributes.rb +0 -22
  236. data/lib/arel/visitors/depth_first.rb +0 -203
  237. data/lib/arel/visitors/ibm_db.rb +0 -34
  238. data/lib/arel/visitors/informix.rb +0 -62
  239. data/lib/arel/visitors/mssql.rb +0 -156
  240. data/lib/arel/visitors/oracle.rb +0 -158
  241. data/lib/arel/visitors/oracle12.rb +0 -65
  242. data/lib/arel/visitors/where_sql.rb +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1fc6a79e2176d3edc373f3f920c287f8f1bd35123e3af17f52034282f4f15735
4
- data.tar.gz: 91b8b7c4107316e3b09b3176acf6b7fea744976df609f292b192033923962a4c
3
+ metadata.gz: 66ac86600eb6f03cff86765392e7ec1baf5741aca1050133653dab7d9552ede3
4
+ data.tar.gz: ab475bbab2246deea73d3d699374c6f309fdddc97f467d783695af1e737cb352
5
5
  SHA512:
6
- metadata.gz: ad92ac3aaab6f497944161e777415d90cb0c1e61d8d297d571d18cb017d430a8bbf0dc97289cec4f19620e0421641c42917c4bbeaba9fe4638c0601d1c0c50ed
7
- data.tar.gz: b8094270448f085b549609e682be83489ab08a0d56f6b7946d6f525b4c20f32bf8847dc89a0696ae7e63231213cddbac16a78cc17a43f1c2591063f34a07644d
6
+ metadata.gz: 51480027525839e315d70abb310a433cfa48c9fb25084ba13ce4d18d205e0d3eb4ae79fe259716a15c055e7083d381e590ddc4e6829662c21276cacf70845834
7
+ data.tar.gz: ec51c2bc1172ec830f700aea91674fed170a9d362c7a8be600328055db0132d79b38049d8ee9ad03729b962c7667982519b3fb0bfa8569cac7c3686c8f73ebd3
data/CHANGELOG.md CHANGED
@@ -1,1350 +1,1271 @@
1
- ## Rails 6.0.4 (June 15, 2021) ##
1
+ ## Rails 6.1.0.rc1 (November 02, 2020) ##
2
2
 
3
- * Only warn about negative enums if a positive form that would cause conflicts exists.
3
+ * Add `connected_to_many` API.
4
4
 
5
- Fixes #39065.
5
+ This API allows applications to connect to multiple databases at once without switching all of them or implementing a deeply nested stack.
6
6
 
7
- *Alex Ghiculescu*
8
-
9
- * Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
10
-
11
- Fixes #34255.
7
+ Before:
12
8
 
13
- *Steven Weber*
9
+ AnimalsRecord.connected_to(role: :reading) do
10
+ MealsRecord.connected_to(role: :reading) do
11
+ Dog.first # read from animals replica
12
+ Dinner.first # read from meals replica
13
+ Person.first # read from primary writer
14
+ end
15
+ end
14
16
 
15
- * Reset statement cache for association if `table_name` is changed.
17
+ After:
16
18
 
17
- Fixes #36453.
19
+ ActiveRecord::Base.connected_to_many([AnimalsRecord, MealsRecord], role: :reading) do
20
+ Dog.first # read from animals replica
21
+ Dinner.first # read from meals replica
22
+ Person.first # read from primary writer
23
+ end
18
24
 
19
- *Ryuta Kamizono*
25
+ *Eileen M. Uchitelle*, *John Crepezzi*
20
26
 
21
- * Type cast extra select for eager loading.
27
+ * Add option to raise or log for `ActiveRecord::StrictLoadingViolationError`.
22
28
 
23
- *Ryuta Kamizono*
29
+ Some applications may not want to raise an error in production if using `strict_loading`. This would allow an application to set strict loading to log for the production environment while still raising in development and test environments.
24
30
 
25
- * Prevent collection associations from being autosaved multiple times.
31
+ Set `config.active_record.action_on_strict_loading_violation` to `:log` errors instead of raising.
26
32
 
27
- Fixes #39173.
33
+ *Eileen M. Uchitelle*
28
34
 
29
- *Eugene Kenny*
35
+ * Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
30
36
 
31
- * Resolve issue with insert_all unique_by option when used with expression index.
37
+ Fixes #34255.
32
38
 
33
- When the `:unique_by` option of `ActiveRecord::Persistence.insert_all` and
34
- `ActiveRecord::Persistence.upsert_all` was used with the name of an expression index, an error
35
- was raised. Adding a guard around the formatting behavior for the `:unique_by` corrects this.
39
+ *Steven Weber*
36
40
 
37
- Usage:
41
+ * Optimise the length of index names for polymorphic references by using the reference name rather than the type and id column names.
38
42
 
39
- ```ruby
40
- create_table :books, id: :integer, force: true do |t|
41
- t.column :name, :string
42
- t.index "lower(name)", unique: true
43
- end
43
+ Because the default behaviour when adding an index with multiple columns is to use all column names in the index name, this could frequently lead to overly long index names for polymorphic references which would fail the migration if it exceeded the database limit.
44
44
 
45
- Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
46
- ```
45
+ This change reduces the chance of that happening by using the reference name, e.g. `index_my_table_on_my_reference`.
47
46
 
48
- Fixes #39516.
47
+ Fixes #38655.
49
48
 
50
- *Austen Madden*
49
+ *Luke Redpath*
51
50
 
52
- * Fix preloading for polymorphic association with custom scope.
51
+ * MySQL: Uniqueness validator now respects default database collation,
52
+ no longer enforce case sensitive comparison by default.
53
53
 
54
54
  *Ryuta Kamizono*
55
55
 
56
- * Allow relations with different SQL comments in the `or` method.
56
+ * Remove deprecated methods from `ActiveRecord::ConnectionAdapters::DatabaseLimits`.
57
57
 
58
- *Takumi Shotoku*
58
+ `column_name_length`
59
+ `table_name_length`
60
+ `columns_per_table`
61
+ `indexes_per_table`
62
+ `columns_per_multicolumn_index`
63
+ `sql_query_length`
64
+ `joins_per_query`
59
65
 
60
- * Resolve conflict between counter cache and optimistic locking.
61
-
62
- Bump an Active Record instance's lock version after updating its counter
63
- cache. This avoids raising an unnecessary `ActiveRecord::StaleObjectError`
64
- upon subsequent transactions by maintaining parity with the corresponding
65
- database record's `lock_version` column.
66
+ *Rafael Mendonça França*
66
67
 
67
- Fixes #16449.
68
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?`.
68
69
 
69
- *Aaron Lipman*
70
+ *Rafael Mendonça França*
70
71
 
71
- * Fix through association with source/through scope which has joins.
72
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?`.
72
73
 
73
- *Ryuta Kamizono*
74
+ *Rafael Mendonça França*
74
75
 
75
- * Fix through association to respect source scope for includes/preload.
76
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?`.
76
77
 
77
- *Ryuta Kamizono*
78
+ *Rafael Mendonça França*
78
79
 
79
- * Fix eager load with Arel joins to maintain the original joins order.
80
+ * Remove deprecated `ActiveRecord::Base#update_attributes` and `ActiveRecord::Base#update_attributes!`.
80
81
 
81
- *Ryuta Kamizono*
82
+ *Rafael Mendonça França*
82
83
 
83
- * Fix group by count with eager loading + order + limit/offset.
84
+ * Remove deprecated `migrations_path` argument in `ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version`.
84
85
 
85
- *Ryuta Kamizono*
86
+ *Rafael Mendonça França*
86
87
 
87
- * Fix left joins order when merging multiple left joins from different associations.
88
+ * Remove deprecated `config.active_record.sqlite3.represent_boolean_as_integer`.
88
89
 
89
- *Ryuta Kamizono*
90
+ *Rafael Mendonça França*
90
91
 
91
- * Fix index creation to preserve index comment in bulk change table on MySQL.
92
+ * `relation.create` does no longer leak scope to class level querying methods
93
+ in initialization block and callbacks.
92
94
 
93
- *Ryuta Kamizono*
95
+ Before:
94
96
 
95
- * Change `remove_foreign_key` to not check `:validate` option if database
96
- doesn't support the feature.
97
+ User.where(name: "John").create do |john|
98
+ User.find_by(name: "David") # => nil
99
+ end
97
100
 
98
- *Ryuta Kamizono*
101
+ After:
99
102
 
100
- * Fix the result of aggregations to maintain duplicated "group by" fields.
103
+ User.where(name: "John").create do |john|
104
+ User.find_by(name: "David") # => #<User name: "David", ...>
105
+ end
101
106
 
102
107
  *Ryuta Kamizono*
103
108
 
104
- * Do not return duplicated records when using preload.
105
-
106
- *Bogdan Gusiev*
107
-
108
-
109
- ## Rails 6.0.3.7 (May 05, 2021) ##
110
-
111
- * No changes.
112
-
113
-
114
- ## Rails 6.0.3.6 (March 26, 2021) ##
109
+ * Named scope chain does no longer leak scope to class level querying methods.
115
110
 
116
- * No changes.
117
-
118
-
119
- ## Rails 6.0.3.5 (February 10, 2021) ##
120
-
121
- * Fix possible DoS vector in PostgreSQL money type
122
-
123
- Carefully crafted input can cause a DoS via the regular expressions used
124
- for validating the money format in the PostgreSQL adapter. This patch
125
- fixes the regexp.
126
-
127
- Thanks to @dee-see from Hackerone for this patch!
128
-
129
- [CVE-2021-22880]
130
-
131
- *Aaron Patterson*
111
+ class class User < ActiveRecord::Base
112
+ scope :david, -> { User.where(name: "David") }
113
+ end
132
114
 
115
+ Before:
133
116
 
134
- ## Rails 6.0.3.4 (October 07, 2020) ##
117
+ User.where(name: "John").david
118
+ # SELECT * FROM users WHERE name = 'John' AND name = 'David'
135
119
 
136
- * No changes.
120
+ After:
137
121
 
122
+ User.where(name: "John").david
123
+ # SELECT * FROM users WHERE name = 'David'
138
124
 
139
- ## Rails 6.0.3.3 (September 09, 2020) ##
125
+ *Ryuta Kamizono*
140
126
 
141
- * No changes.
127
+ * Remove deprecated methods from `ActiveRecord::DatabaseConfigurations`.
142
128
 
129
+ `fetch`
130
+ `each`
131
+ `first`
132
+ `values`
133
+ `[]=`
143
134
 
144
- ## Rails 6.0.3.2 (June 17, 2020) ##
135
+ *Rafael Mendonça França*
145
136
 
146
- * No changes.
137
+ * `where.not` now generates NAND predicates instead of NOR.
147
138
 
139
+ Before:
148
140
 
149
- ## Rails 6.0.3.1 (May 18, 2020) ##
141
+ User.where.not(name: "Jon", role: "admin")
142
+ # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
150
143
 
151
- * No changes.
144
+ After:
152
145
 
146
+ User.where.not(name: "Jon", role: "admin")
147
+ # SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
153
148
 
154
- ## Rails 6.0.3 (May 06, 2020) ##
149
+ *Rafael Mendonça França*
155
150
 
156
- * Recommend applications don't use the `database` kwarg in `connected_to`
151
+ * Remove deprecated `ActiveRecord::Result#to_hash` method.
157
152
 
158
- The database kwarg in `connected_to` was meant to be used for one-off scripts but is often used in requests. This is really dangerous because it re-establishes a connection every time. It's deprecated in 6.1 and will be removed in 6.2 without replacement. This change soft deprecates it in 6.0 by removing documentation.
153
+ *Rafael Mendonça França*
159
154
 
160
- *Eileen M. Uchitelle*
155
+ * Deprecate `ActiveRecord::Base.allow_unsafe_raw_sql`.
161
156
 
162
- * Fix support for PostgreSQL 11+ partitioned indexes.
157
+ *Rafael Mendonça França*
163
158
 
164
- *Sebastián Palma*
159
+ * Remove deprecated support for using unsafe raw SQL in `ActiveRecord::Relation` methods.
165
160
 
166
- * Add support for beginless ranges, introduced in Ruby 2.7.
161
+ *Rafael Mendonça França*
167
162
 
168
- *Josh Goodall*
163
+ * Allow users to silence the "Rails couldn't infer whether you are using multiple databases..."
164
+ message using `config.active_record.suppress_multiple_database_warning`.
169
165
 
170
- * Fix insert_all with enum values
166
+ *Omri Gabay*
171
167
 
172
- Fixes #38716.
168
+ * Connections can be granularly switched for abstract classes when `connected_to` is called.
173
169
 
174
- *Joel Blum*
170
+ This change allows `connected_to` to switch a `role` and/or `shard` for a single abstract class instead of all classes globally. Applications that want to use the new feature need to set `config.active_record.legacy_connection_handling` to `false` in their application configuration.
175
171
 
176
- * Regexp-escape table name for MS SQL
172
+ Example usage:
177
173
 
178
- Add `Regexp.escape` to one method in ActiveRecord, so that table names with regular expression characters in them work as expected. Since MS SQL Server uses "[" and "]" to quote table and column names, and those characters are regular expression characters, methods like `pluck` and `select` fail in certain cases when used with the MS SQL Server adapter.
174
+ Given an application we have a `User` model that inherits from `ApplicationRecord` and a `Dog` model that inherits from `AnimalsRecord`. `AnimalsRecord` and `ApplicationRecord` have writing and reading connections as well as shard `default`, `one`, and `two`.
179
175
 
180
- *Larry Reid*
176
+ ```ruby
177
+ ActiveRecord::Base.connected_to(role: :reading) do
178
+ User.first # reads from default replica
179
+ Dog.first # reads from default replica
181
180
 
182
- * Store advisory locks on their own named connection.
181
+ AnimalsRecord.connected_to(role: :writing, shard: :one) do
182
+ User.first # reads from default replica
183
+ Dog.first # reads from shard one primary
184
+ end
183
185
 
184
- Previously advisory locks were taken out against a connection when a migration started. This works fine in single database applications but doesn't work well when migrations need to open new connections which results in the lock getting dropped.
186
+ User.first # reads from default replica
187
+ Dog.first # reads from default replica
185
188
 
186
- In order to fix this we are storing the advisory lock on a new connection with the connection specification name `AdisoryLockBase`. The caveat is that we need to maintain at least 2 connections to a database while migrations are running in order to do this.
189
+ ApplicationRecord.connected_to(role: :writing, shard: :two) do
190
+ User.first # reads from shard two primary
191
+ Dog.first # reads from default replica
192
+ end
193
+ end
194
+ ```
187
195
 
188
196
  *Eileen M. Uchitelle*, *John Crepezzi*
189
197
 
190
- * Ensure `:reading` connections always raise if a write is attempted.
191
-
192
- Now Rails will raise an `ActiveRecord::ReadOnlyError` if any connection on the reading handler attempts to make a write. If your reading role needs to write you should name the role something other than `:reading`.
193
-
194
- *Eileen M. Uchitelle*
195
-
196
- * Enforce fresh ETag header after a collection's contents change by adding
197
- ActiveRecord::Relation#cache_key_with_version. This method will be used by
198
- ActionController::ConditionalGet to ensure that when collection cache versioning
199
- is enabled, requests using ConditionalGet don't return the same ETag header
200
- after a collection is modified. Fixes #38078.
201
-
202
- *Aaron Lipman*
203
-
204
- * A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgresSQL `options`.
205
-
206
- *Joshua Flanagan*
198
+ * Allow double-dash comment syntax when querying read-only databases
207
199
 
208
- * Retain explicit selections on the base model after applying `includes` and `joins`.
209
-
210
- Resolves #34889.
211
-
212
- *Patrick Rebsch*
213
-
214
-
215
- ## Rails 6.0.2.2 (March 19, 2020) ##
216
-
217
- * No changes.
218
-
219
-
220
- ## Rails 6.0.2.1 (December 18, 2019) ##
200
+ *James Adam*
221
201
 
222
- * No changes.
202
+ * Add `values_at` method.
223
203
 
204
+ Returns an array containing the values associated with the given methods.
224
205
 
225
- ## Rails 6.0.2 (December 13, 2019) ##
226
-
227
- * Share the same connection pool for primary and replica databases in the
228
- transactional tests for the same database.
229
-
230
- *Edouard Chin*
231
-
232
- * Fix the preloader when one record is fetched using `after_initialize`
233
- but not the entire collection.
234
-
235
- *Bradley Price*
236
-
237
- * Fix collection callbacks not terminating when `:abort` is thrown.
206
+ ```ruby
207
+ topic = Topic.first
208
+ topic.values_at(:title, :author_name)
209
+ # => ["Budget", "Jason"]
210
+ ```
238
211
 
239
- *Edouard Chin*, *Ryuta Kamizono*
212
+ Similar to `Hash#values_at` but on an Active Record instance.
240
213
 
241
- * Correctly deprecate `where.not` working as NOR for relations.
214
+ *Guillaume Briday*
242
215
 
243
- 12a9664 deprecated where.not working as NOR, however
244
- doing a relation query like `where.not(relation: { ... })`
245
- wouldn't be properly deprecated and `where.not` would work as
246
- NAND instead.
216
+ * Fix `read_attribute_before_type_cast` to consider attribute aliases.
247
217
 
248
- *Edouard Chin*
218
+ *Marcelo Lauxen*
249
219
 
250
- * Fix `db:migrate` task with multiple databases to restore the connection
251
- to the previous database.
220
+ * Support passing record to uniqueness validator `:conditions` callable:
252
221
 
253
- The migrate task iterates and establish a connection over each db
254
- resulting in the last one to be used by subsequent rake tasks.
255
- We should reestablish a connection to the connection that was
256
- established before the migrate tasks was run
222
+ ```ruby
223
+ class Article < ApplicationRecord
224
+ validates_uniqueness_of :title, conditions: ->(article) {
225
+ published_at = article.published_at
226
+ where(published_at: published_at.beginning_of_year..published_at.end_of_year)
227
+ }
228
+ end
229
+ ```
257
230
 
258
- *Edouard Chin*
231
+ *Eliot Sykes*
259
232
 
260
- * Fix multi-threaded issue for `AcceptanceValidator`.
261
-
262
- *Ryuta Kamizono*
233
+ * `BatchEnumerator#update_all` and `BatchEnumerator#delete_all` now return the
234
+ total number of rows affected, just like their non-batched counterparts.
263
235
 
236
+ ```ruby
237
+ Person.in_batches.update_all("first_name = 'Eugene'") # => 42
238
+ Person.in_batches.delete_all # => 42
239
+ ```
264
240
 
265
- ## Rails 6.0.1 (November 5, 2019) ##
241
+ Fixes #40287.
266
242
 
267
- * Common Table Expressions are allowed on read-only connections.
243
+ *Eugene Kenny*
268
244
 
269
- *Chris Morris*
245
+ * Add support for PostgreSQL `interval` data type with conversion to
246
+ `ActiveSupport::Duration` when loading records from database and
247
+ serialization to ISO 8601 formatted duration string on save.
248
+ Add support to define a column in migrations and get it in a schema dump.
249
+ Optional column precision is supported.
270
250
 
271
- * New record instantiation respects `unscope`.
251
+ To use this in 6.1, you need to place the next string to your model file:
272
252
 
273
- *Ryuta Kamizono*
253
+ attribute :duration, :interval
274
254
 
275
- * Fixed a case where `find_in_batches` could halt too early.
255
+ To keep old behavior until 6.2 is released:
276
256
 
277
- *Takayuki Nakata*
257
+ attribute :duration, :string
278
258
 
279
- * Autosaved associations always perform validations when a custom validation
280
- context is used.
259
+ Example:
281
260
 
282
- *Tekin Suleyman*
261
+ create_table :events do |t|
262
+ t.string :name
263
+ t.interval :duration
264
+ end
283
265
 
284
- * `sql.active_record` notifications now include the `:connection` in
285
- their payloads.
266
+ class Event < ApplicationRecord
267
+ attribute :duration, :interval
268
+ end
286
269
 
287
- *Eugene Kenny*
270
+ Event.create!(name: 'Rock Fest', duration: 2.days)
271
+ Event.last.duration # => 2 days
272
+ Event.last.duration.iso8601 # => "P2D"
273
+ Event.new(duration: 'P1DT12H3S').duration # => 1 day, 12 hours, and 3 seconds
274
+ Event.new(duration: '1 day') # Unknown value will be ignored and NULL will be written to database
288
275
 
289
- * A rollback encountered in an `after_commit` callback does not reset
290
- previously-committed record state.
276
+ *Andrey Novikov*
291
277
 
292
- *Ryuta Kamizono*
278
+ * Allow associations supporting the `dependent:` key to take `dependent: :destroy_async`.
293
279
 
294
- * Fixed that join order was lost when eager-loading.
280
+ ```ruby
281
+ class Account < ActiveRecord::Base
282
+ belongs_to :supplier, dependent: :destroy_async
283
+ end
284
+ ```
295
285
 
296
- *Ryuta Kamizono*
286
+ `:destroy_async` will enqueue a job to destroy associated records in the background.
297
287
 
298
- * `DESCRIBE` queries are allowed on read-only connections.
288
+ *DHH*, *George Claghorn*, *Cory Gwin*, *Rafael Mendonça França*, *Adrianna Chang*
299
289
 
300
- *Dylan Thacker-Smith*
290
+ * Add `SKIP_TEST_DATABASE` environment variable to disable modifying the test database when `rails db:create` and `rails db:drop` are called.
301
291
 
302
- * Fixed that records that had been `inspect`ed could not be marshaled.
292
+ *Jason Schweier*
303
293
 
304
- *Eugene Kenny*
294
+ * `connects_to` can only be called on `ActiveRecord::Base` or abstract classes.
305
295
 
306
- * The connection pool reaper thread is respawned in forked processes. This
307
- fixes that idle connections in forked processes wouldn't be reaped.
296
+ Ensure that `connects_to` can only be called from `ActiveRecord::Base` or abstract classes. This protects the application from opening duplicate or too many connections.
308
297
 
309
- *John Hawthorn*
298
+ *Eileen M. Uchitelle*, *John Crepezzi*
310
299
 
311
- * The memoized result of `ActiveRecord::Relation#take` is properly cleared
312
- when `ActiveRecord::Relation#reset` or `ActiveRecord::Relation#reload`
313
- is called.
300
+ * All connection adapters `execute` now raises `ActiveRecord::ConnectionNotEstablished` rather than
301
+ `ActiveRecord::StatementInvalid` when they encounter a connection error.
314
302
 
315
- *Anmol Arora*
303
+ *Jean Boussier*
316
304
 
317
- * Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
305
+ * `Mysql2Adapter#quote_string` now raises `ActiveRecord::ConnectionNotEstablished` rather than
306
+ `ActiveRecord::StatementInvalid` when it can't connect to the MySQL server.
318
307
 
319
- *Hiroyuki Ishii*
320
-
321
- * `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
308
+ *Jean Boussier*
322
309
 
323
- *Eugene Kenny*
310
+ * Add support for check constraints that are `NOT VALID` via `validate: false` (PostgreSQL-only).
324
311
 
325
- * Call `while_preventing_writes` directly from `connected_to`.
312
+ *Alex Robbin*
326
313
 
327
- In some cases application authors want to use the database switching middleware and make explicit calls with `connected_to`. It's possible for an app to turn off writes and not turn them back on by the time we call `connected_to(role: :writing)`.
314
+ * Ensure the default configuration is considered primary or first for an environment
328
315
 
329
- This change allows apps to fix this by assuming if a role is writing we want to allow writes, except in the case it's explicitly turned off.
316
+ If a multiple database application provides a configuration named primary, that will be treated as default. In applications that do not have a primary entry, the default database configuration will be the first configuration for an environment.
330
317
 
331
318
  *Eileen M. Uchitelle*
332
319
 
333
- * Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
320
+ * Allow `where` references association names as joined table name aliases.
334
321
 
335
- *Kir Shatrov*
336
-
337
-
338
- ## Rails 6.0.0 (August 16, 2019) ##
339
-
340
- * Preserve user supplied joins order as much as possible.
322
+ ```ruby
323
+ class Comment < ActiveRecord::Base
324
+ enum label: [:default, :child]
325
+ has_many :children, class_name: "Comment", foreign_key: :parent_id
326
+ end
341
327
 
342
- Fixes #36761, #34328, #24281, #12953.
328
+ # ... FROM comments LEFT OUTER JOIN comments children ON ... WHERE children.label = 1
329
+ Comment.includes(:children).where("children.label": "child")
330
+ ```
343
331
 
344
332
  *Ryuta Kamizono*
345
333
 
346
- * Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
347
-
348
- *John Crepezzi*, *Eileen Uchitelle*
349
-
350
- * Add a warning for enum elements with 'not_' prefix.
351
-
352
- class Foo
353
- enum status: [:sent, :not_sent]
354
- end
334
+ * Support storing demodulized class name for polymorphic type.
355
335
 
356
- *Edu Depetris*
357
-
358
- * Make currency symbols optional for money column type in PostgreSQL
336
+ Before Rails 6.1, storing demodulized class name is supported only for STI type
337
+ by `store_full_sti_class` class attribute.
359
338
 
360
- *Joel Schneider*
339
+ Now `store_full_class_name` class attribute can handle both STI and polymorphic types.
361
340
 
341
+ *Ryuta Kamizono*
362
342
 
363
- ## Rails 6.0.0.rc2 (July 22, 2019) ##
343
+ * Deprecate `rails db:structure:{load, dump}` tasks and extend
344
+ `rails db:schema:{load, dump}` tasks to work with either `:ruby` or `:sql` format,
345
+ depending on `config.active_record.schema_format` configuration value.
364
346
 
365
- * Add database_exists? method to connection adapters to check if a database exists.
347
+ *fatkodima*
366
348
 
367
- *Guilherme Mansur*
349
+ * Respect the `select` values for eager loading.
368
350
 
369
- * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
370
-
371
- Fixes #36022.
351
+ ```ruby
352
+ post = Post.select("UPPER(title) AS title").first
353
+ post.title # => "WELCOME TO THE WEBLOG"
354
+ post.body # => ActiveModel::MissingAttributeError
355
+
356
+ # Rails 6.0 (ignore the `select` values)
357
+ post = Post.select("UPPER(title) AS title").eager_load(:comments).first
358
+ post.title # => "Welcome to the weblog"
359
+ post.body # => "Such a lovely day"
360
+
361
+ # Rails 6.1 (respect the `select` values)
362
+ post = Post.select("UPPER(title) AS title").eager_load(:comments).first
363
+ post.title # => "WELCOME TO THE WEBLOG"
364
+ post.body # => ActiveModel::MissingAttributeError
365
+ ```
372
366
 
373
367
  *Ryuta Kamizono*
374
368
 
375
- * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
369
+ * Allow attribute's default to be configured but keeping its own type.
376
370
 
377
- Fixes #36465.
378
-
379
- *Jeff Doering*
371
+ ```ruby
372
+ class Post < ActiveRecord::Base
373
+ attribute :written_at, default: -> { Time.now.utc }
374
+ end
380
375
 
381
- * Fix sqlite3 collation parsing when using decimal columns.
376
+ # Rails 6.0
377
+ Post.type_for_attribute(:written_at) # => #<Type::Value ... precision: nil, ...>
382
378
 
383
- *Martin R. Schuster*
379
+ # Rails 6.1
380
+ Post.type_for_attribute(:written_at) # => #<Type::DateTime ... precision: 6, ...>
381
+ ```
384
382
 
385
- * Fix invalid schema when primary key column has a comment.
383
+ *Ryuta Kamizono*
386
384
 
387
- Fixes #29966.
385
+ * Allow default to be configured for Enum.
388
386
 
389
- *Guilherme Goettems Schneider*
390
-
391
- * Fix table comment also being applied to the primary key column.
387
+ ```ruby
388
+ class Book < ActiveRecord::Base
389
+ enum status: [:proposed, :written, :published], _default: :published
390
+ end
392
391
 
393
- *Guilherme Goettems Schneider*
392
+ Book.new.status # => "published"
393
+ ```
394
394
 
395
- * Fix merging left_joins to maintain its own `join_type` context.
395
+ *Ryuta Kamizono*
396
396
 
397
- Fixes #36103.
397
+ * Deprecate YAML loading from legacy format older than Rails 5.0.
398
398
 
399
399
  *Ryuta Kamizono*
400
400
 
401
+ * Added the setting `ActiveRecord::Base.immutable_strings_by_default`, which
402
+ allows you to specify that all string columns should be frozen unless
403
+ otherwise specified. This will reduce memory pressure for applications which
404
+ do not generally mutate string properties of Active Record objects.
401
405
 
402
- ## Rails 6.0.0.rc1 (April 24, 2019) ##
406
+ *Sean Griffin*, *Ryuta Kamizono*
403
407
 
404
- * Add `touch` option to `has_one` association.
408
+ * Deprecate `map!` and `collect!` on `ActiveRecord::Result`.
405
409
 
406
- *Abhay Nikam*
410
+ *Ryuta Kamizono*
407
411
 
408
- * Deprecate `where.not` working as NOR and will be changed to NAND in Rails 6.1.
412
+ * Support `relation.and` for intersection as Set theory.
409
413
 
410
414
  ```ruby
411
- all = [treasures(:diamond), treasures(:sapphire), cars(:honda), treasures(:sapphire)]
412
- assert_equal all, PriceEstimate.all.map(&:estimate_of)
413
- ```
415
+ david_and_mary = Author.where(id: [david, mary])
416
+ mary_and_bob = Author.where(id: [mary, bob])
414
417
 
415
- In Rails 6.0:
418
+ david_and_mary.merge(mary_and_bob) # => [mary, bob]
416
419
 
417
- ```ruby
418
- sapphire = treasures(:sapphire)
419
-
420
- nor = all.reject { |e|
421
- e.estimate_of_type == sapphire.class.polymorphic_name
422
- }.reject { |e|
423
- e.estimate_of_id == sapphire.id
424
- }
425
- assert_equal [cars(:honda)], nor
426
-
427
- without_sapphire = PriceEstimate.where.not(
428
- estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
429
- )
430
- assert_equal nor, without_sapphire.map(&:estimate_of)
420
+ david_and_mary.and(mary_and_bob) # => [mary]
421
+ david_and_mary.or(mary_and_bob) # => [david, mary, bob]
431
422
  ```
432
423
 
433
- In Rails 6.1:
434
-
435
- ```ruby
436
- sapphire = treasures(:sapphire)
424
+ *Ryuta Kamizono*
437
425
 
438
- nand = all - [sapphire]
439
- assert_equal [treasures(:diamond), cars(:honda)], nand
426
+ * Merging conditions on the same column no longer maintain both conditions,
427
+ and will be consistently replaced by the latter condition in Rails 6.2.
428
+ To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
440
429
 
441
- without_sapphire = PriceEstimate.where.not(
442
- estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
443
- )
444
- assert_equal nand, without_sapphire.map(&:estimate_of)
445
- ```
430
+ ```ruby
431
+ # Rails 6.1 (IN clause is replaced by merger side equality condition)
432
+ Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
446
433
 
447
- *Ryuta Kamizono*
434
+ # Rails 6.1 (both conflict conditions exists, deprecated)
435
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
448
436
 
449
- * Fix dirty tracking after rollback.
437
+ # Rails 6.1 with rewhere to migrate to Rails 6.2's behavior
438
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
450
439
 
451
- Fixes #15018, #30167, #33868.
440
+ # Rails 6.2 (same behavior with IN clause, mergee side condition is consistently replaced)
441
+ Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
442
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
443
+ ```
452
444
 
453
445
  *Ryuta Kamizono*
454
446
 
455
- * Add `ActiveRecord::Relation#cache_version` to support recyclable cache keys via
456
- the versioned entries in `ActiveSupport::Cache`. This also means that
457
- `ActiveRecord::Relation#cache_key` will now return a stable key that does not
458
- include the max timestamp or count any more.
447
+ * Do not mark Postgresql MAC address and UUID attributes as changed when the assigned value only varies by case.
459
448
 
460
- NOTE: This feature is turned off by default, and `cache_key` will still return
461
- cache keys with timestamps until you set `ActiveRecord::Base.collection_cache_versioning = true`.
462
- That's the setting for all new apps on Rails 6.0+
449
+ *Peter Fry*
463
450
 
464
- *Lachlan Sylvester*
451
+ * Resolve issue with insert_all unique_by option when used with expression index.
465
452
 
466
- * Fix dirty tracking for `touch` to track saved changes.
453
+ When the `:unique_by` option of `ActiveRecord::Persistence.insert_all` and
454
+ `ActiveRecord::Persistence.upsert_all` was used with the name of an expression index, an error
455
+ was raised. Adding a guard around the formatting behavior for the `:unique_by` corrects this.
467
456
 
468
- Fixes #33429.
457
+ Usage:
469
458
 
470
- *Ryuta Kamzono*
459
+ ```ruby
460
+ create_table :books, id: :integer, force: true do |t|
461
+ t.column :name, :string
462
+ t.index "lower(name)", unique: true
463
+ end
471
464
 
472
- * `change_column_comment` and `change_table_comment` are invertible only if
473
- `to` and `from` options are specified.
465
+ Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
466
+ ```
474
467
 
475
- *Yoshiyuki Kinjo*
468
+ Fixes #39516.
476
469
 
477
- * Don't call commit/rollback callbacks when a record isn't saved.
470
+ *Austen Madden*
478
471
 
479
- Fixes #29747.
472
+ * Add basic support for CHECK constraints to database migrations.
480
473
 
481
- *Ryuta Kamizono*
474
+ Usage:
482
475
 
483
- * Fix circular `autosave: true` causes invalid records to be saved.
476
+ ```ruby
477
+ add_check_constraint :products, "price > 0", name: "price_check"
478
+ remove_check_constraint :products, name: "price_check"
479
+ ```
484
480
 
485
- Prior to the fix, when there was a circular series of `autosave: true`
486
- associations, the callback for a `has_many` association was run while
487
- another instance of the same callback on the same association hadn't
488
- finished running. When control returned to the first instance of the
489
- callback, the instance variable had changed, and subsequent associated
490
- records weren't saved correctly. Specifically, the ID field for the
491
- `belongs_to` corresponding to the `has_many` was `nil`.
481
+ *fatkodima*
492
482
 
493
- Fixes #28080.
483
+ * Add `ActiveRecord::Base.strict_loading_by_default` and `ActiveRecord::Base.strict_loading_by_default=`
484
+ to enable/disable strict_loading mode by default for a model. The configuration's value is
485
+ inheritable by subclasses, but they can override that value and it will not impact parent class.
494
486
 
495
- *Larry Reid*
487
+ Usage:
496
488
 
497
- * Raise `ArgumentError` for invalid `:limit` and `:precision` like as other options.
489
+ ```ruby
490
+ class Developer < ApplicationRecord
491
+ self.strict_loading_by_default = true
498
492
 
499
- Before:
493
+ has_many :projects
494
+ end
500
495
 
501
- ```ruby
502
- add_column :items, :attr1, :binary, size: 10 # => ArgumentError
503
- add_column :items, :attr2, :decimal, scale: 10 # => ArgumentError
504
- add_column :items, :attr3, :integer, limit: 10 # => ActiveRecordError
505
- add_column :items, :attr4, :datetime, precision: 10 # => ActiveRecordError
496
+ dev = Developer.first
497
+ dev.projects.first
498
+ # => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.
506
499
  ```
507
500
 
508
- After:
501
+ *bogdanvlviv*
509
502
 
510
- ```ruby
511
- add_column :items, :attr1, :binary, size: 10 # => ArgumentError
512
- add_column :items, :attr2, :decimal, scale: 10 # => ArgumentError
513
- add_column :items, :attr3, :integer, limit: 10 # => ArgumentError
514
- add_column :items, :attr4, :datetime, precision: 10 # => ArgumentError
515
- ```
503
+ * Deprecate passing an Active Record object to `quote`/`type_cast` directly.
516
504
 
517
505
  *Ryuta Kamizono*
518
506
 
519
- * Association loading isn't to be affected by scoping consistently
520
- whether preloaded / eager loaded or not, with the exception of `unscoped`.
507
+ * Default engine `ENGINE=InnoDB` is no longer dumped to make schema more agnostic.
521
508
 
522
509
  Before:
523
510
 
524
511
  ```ruby
525
- Post.where("1=0").scoping do
526
- Comment.find(1).post # => nil
527
- Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
528
- Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
512
+ create_table "accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
529
513
  end
530
514
  ```
531
515
 
532
516
  After:
533
517
 
534
518
  ```ruby
535
- Post.where("1=0").scoping do
536
- Comment.find(1).post # => #<Post id: 1, ...>
537
- Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
538
- Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
519
+ create_table "accounts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
539
520
  end
540
521
  ```
541
522
 
542
- Fixes #34638, #35398.
543
-
544
523
  *Ryuta Kamizono*
545
524
 
546
- * Add `rails db:prepare` to migrate or setup a database.
547
-
548
- Runs `db:migrate` if the database exists or `db:setup` if it doesn't.
549
-
550
- *Roberto Miranda*
551
-
552
- * Add `after_save_commit` callback as shortcut for `after_commit :hook, on: [ :create, :update ]`.
553
-
554
- *DHH*
555
-
556
- * Assign all attributes before calling `build` to ensure the child record is visible in
557
- `before_add` and `after_add` callbacks for `has_many :through` associations.
558
-
559
- Fixes #33249.
560
-
561
- *Ryan H. Kerr*
562
-
563
- * Add `ActiveRecord::Relation#extract_associated` for extracting associated records from a relation.
564
-
565
- ```
566
- account.memberships.extract_associated(:user)
567
- # => Returns collection of User records
568
- ```
525
+ * Added delegated type as an alternative to single-table inheritance for representing class hierarchies.
526
+ See ActiveRecord::DelegatedType for the full description.
569
527
 
570
528
  *DHH*
571
529
 
572
- * Add `ActiveRecord::Relation#annotate` for adding SQL comments to its queries.
530
+ * Deprecate aggregations with group by duplicated fields.
573
531
 
574
- For example:
532
+ To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
575
533
 
534
+ ```ruby
535
+ accounts = Account.group(:firm_id)
536
+
537
+ # duplicated group fields, deprecated.
538
+ accounts.merge(accounts.where.not(credit_limit: nil)).sum(:credit_limit)
539
+ # => {
540
+ # [1, 1] => 50,
541
+ # [2, 2] => 60
542
+ # }
543
+
544
+ # use `uniq!(:group)` to deduplicate group fields.
545
+ accounts.merge(accounts.where.not(credit_limit: nil)).uniq!(:group).sum(:credit_limit)
546
+ # => {
547
+ # 1 => 50,
548
+ # 2 => 60
549
+ # }
576
550
  ```
577
- Post.where(id: 123).annotate("this is a comment").to_sql
578
- # SELECT "posts".* FROM "posts" WHERE "posts"."id" = 123 /* this is a comment */
579
- ```
580
-
581
- This can be useful in instrumentation or other analysis of issued queries.
582
-
583
- *Matt Yoho*
584
-
585
- * Support Optimizer Hints.
586
-
587
- In most databases, a way to control the optimizer is by using optimizer hints,
588
- which can be specified within individual statements.
589
-
590
- Example (for MySQL):
591
-
592
- Topic.optimizer_hints("MAX_EXECUTION_TIME(50000)", "NO_INDEX_MERGE(topics)")
593
- # SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`
594
-
595
- Example (for PostgreSQL with pg_hint_plan):
596
-
597
- Topic.optimizer_hints("SeqScan(topics)", "Parallel(topics 8)")
598
- # SELECT /*+ SeqScan(topics) Parallel(topics 8) */ "topics".* FROM "topics"
599
-
600
- See also:
601
-
602
- * https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html
603
- * https://pghintplan.osdn.jp/pg_hint_plan.html
604
- * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/influencing-the-optimizer.html
605
- * https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-2017
606
- * https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.admin.perf.doc/doc/c0070117.html
607
551
 
608
552
  *Ryuta Kamizono*
609
553
 
610
- * Fix query attribute method on user-defined attribute to be aware of typecasted value.
611
-
612
- For example, the following code no longer return false as casted non-empty string:
613
-
614
- ```
615
- class Post < ActiveRecord::Base
616
- attribute :user_defined_text, :text
617
- end
618
-
619
- Post.new(user_defined_text: "false").user_defined_text? # => true
620
- ```
621
-
622
- *Yuji Kamijima*
623
-
624
- * Quote empty ranges like other empty enumerables.
625
-
626
- *Patrick Rebsch*
627
-
628
- * Add `insert_all`/`insert_all!`/`upsert_all` methods to `ActiveRecord::Persistence`,
629
- allowing bulk inserts akin to the bulk updates provided by `update_all` and
630
- bulk deletes by `delete_all`.
631
-
632
- Supports skipping or upserting duplicates through the `ON CONFLICT` syntax
633
- for PostgreSQL (9.5+) and SQLite (3.24+) and `ON DUPLICATE KEY UPDATE` syntax
634
- for MySQL.
635
-
636
- *Bob Lail*
637
-
638
- * Add `rails db:seed:replant` that truncates tables of each database
639
- for current environment and loads the seeds.
554
+ * Deprecate duplicated query annotations.
640
555
 
641
- *bogdanvlviv*, *DHH*
556
+ To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
642
557
 
643
- * Add `ActiveRecord::Base.connection.truncate` for SQLite3 adapter.
644
-
645
- *bogdanvlviv*
558
+ ```ruby
559
+ accounts = Account.where(id: [1, 2]).annotate("david and mary")
646
560
 
647
- * Deprecate mismatched collation comparison for uniqueness validator.
561
+ # duplicated annotations, deprecated.
562
+ accounts.merge(accounts.rewhere(id: 3))
563
+ # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */ /* david and mary */
648
564
 
649
- Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1.
650
- To continue case sensitive comparison on the case insensitive column,
651
- pass `case_sensitive: true` option explicitly to the uniqueness validator.
565
+ # use `uniq!(:annotate)` to deduplicate annotations.
566
+ accounts.merge(accounts.rewhere(id: 3)).uniq!(:annotate)
567
+ # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */
568
+ ```
652
569
 
653
570
  *Ryuta Kamizono*
654
571
 
655
- * Add `reselect` method. This is a short-hand for `unscope(:select).select(fields)`.
572
+ * Resolve conflict between counter cache and optimistic locking.
573
+
574
+ Bump an Active Record instance's lock version after updating its counter
575
+ cache. This avoids raising an unnecessary `ActiveRecord::StaleObjectError`
576
+ upon subsequent transactions by maintaining parity with the corresponding
577
+ database record's `lock_version` column.
656
578
 
657
- Fixes #27340.
579
+ Fixes #16449.
658
580
 
659
- *Willian Gustavo Veiga*
581
+ *Aaron Lipman*
660
582
 
661
- * Add negative scopes for all enum values.
583
+ * Support merging option `:rewhere` to allow mergee side condition to be replaced exactly.
662
584
 
663
- Example:
585
+ ```ruby
586
+ david_and_mary = Author.where(id: david.id..mary.id)
664
587
 
665
- class Post < ActiveRecord::Base
666
- enum status: %i[ drafted active trashed ]
667
- end
588
+ # both conflict conditions exists
589
+ david_and_mary.merge(Author.where(id: bob)) # => []
668
590
 
669
- Post.not_drafted # => where.not(status: :drafted)
670
- Post.not_active # => where.not(status: :active)
671
- Post.not_trashed # => where.not(status: :trashed)
591
+ # mergee side condition is replaced by rewhere
592
+ david_and_mary.merge(Author.rewhere(id: bob)) # => [bob]
672
593
 
673
- *DHH*
594
+ # mergee side condition is replaced by rewhere option
595
+ david_and_mary.merge(Author.where(id: bob), rewhere: true) # => [bob]
596
+ ```
674
597
 
675
- * Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
598
+ *Ryuta Kamizono*
676
599
 
677
- Fixes #35214.
600
+ * Add support for finding records based on signed ids, which are tamper-proof, verified ids that can be
601
+ set to expire and scoped with a purpose. This is particularly useful for things like password reset
602
+ or email verification, where you want the bearer of the signed id to be able to interact with the
603
+ underlying record, but usually only within a certain time period.
678
604
 
679
- *Juani Villarejo*
605
+ ```ruby
606
+ signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset
680
607
 
608
+ User.find_signed signed_id # => nil, since the purpose does not match
681
609
 
682
- ## Rails 6.0.0.beta3 (March 11, 2019) ##
610
+ travel 16.minutes
611
+ User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired
683
612
 
684
- * No changes.
613
+ travel_back
614
+ User.find_signed signed_id, purpose: :password_reset # => User.first
685
615
 
616
+ User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
617
+ ```
686
618
 
687
- ## Rails 6.0.0.beta2 (February 25, 2019) ##
619
+ *DHH*
688
620
 
689
- * Fix prepared statements caching to be enabled even when query caching is enabled.
621
+ * Support `ALGORITHM = INSTANT` DDL option for index operations on MySQL.
690
622
 
691
623
  *Ryuta Kamizono*
692
624
 
693
- * Ensure `update_all` series cares about optimistic locking.
625
+ * Fix index creation to preserve index comment in bulk change table on MySQL.
694
626
 
695
627
  *Ryuta Kamizono*
696
628
 
697
- * Don't allow `where` with non numeric string matches to 0 values.
629
+ * Allow `unscope` to be aware of table name qualified values.
698
630
 
699
- *Ryuta Kamizono*
631
+ It is possible to unscope only the column in the specified table.
700
632
 
701
- * Introduce `ActiveRecord::Relation#destroy_by` and `ActiveRecord::Relation#delete_by`.
633
+ ```ruby
634
+ posts = Post.joins(:comments).group(:"posts.hidden")
635
+ posts = posts.where("posts.hidden": false, "comments.hidden": false)
702
636
 
703
- `destroy_by` allows relation to find all the records matching the condition and perform
704
- `destroy_all` on the matched records.
637
+ posts.count
638
+ # => { false => 10 }
705
639
 
706
- Example:
640
+ # unscope both hidden columns
641
+ posts.unscope(where: :hidden).count
642
+ # => { false => 11, true => 1 }
707
643
 
708
- Person.destroy_by(name: 'David')
709
- Person.destroy_by(name: 'David', rating: 4)
644
+ # unscope only comments.hidden column
645
+ posts.unscope(where: :"comments.hidden").count
646
+ # => { false => 11 }
647
+ ```
710
648
 
711
- david = Person.find_by(name: 'David')
712
- david.posts.destroy_by(id: [1, 2, 3])
649
+ *Ryuta Kamizono*, *Slava Korolev*
713
650
 
714
- `delete_by` allows relation to find all the records matching the condition and perform
715
- `delete_all` on the matched records.
651
+ * Fix `rewhere` to truly overwrite collided where clause by new where clause.
716
652
 
717
- Example:
653
+ ```ruby
654
+ steve = Person.find_by(name: "Steve")
655
+ david = Author.find_by(name: "David")
718
656
 
719
- Person.delete_by(name: 'David')
720
- Person.delete_by(name: 'David', rating: 4)
657
+ relation = Essay.where(writer: steve)
721
658
 
722
- david = Person.find_by(name: 'David')
723
- david.posts.delete_by(id: [1, 2, 3])
659
+ # Before
660
+ relation.rewhere(writer: david).to_a # => []
724
661
 
725
- *Abhay Nikam*
662
+ # After
663
+ relation.rewhere(writer: david).to_a # => [david]
664
+ ```
726
665
 
727
- * Don't allow `where` with invalid value matches to nil values.
666
+ *Ryuta Kamizono*
728
667
 
729
- Fixes #33624.
668
+ * Inspect time attributes with subsec.
730
669
 
731
- *Ryuta Kamizono*
670
+ ```ruby
671
+ p Knot.create
672
+ => #<Knot id: 1, created_at: "2016-05-05 01:29:47.116928000">
673
+ ```
732
674
 
733
- * SQLite3: Implement `add_foreign_key` and `remove_foreign_key`.
675
+ *akinomaeni*
676
+
677
+ * Deprecate passing a column to `type_cast`.
734
678
 
735
679
  *Ryuta Kamizono*
736
680
 
737
- * Deprecate using class level querying methods if the receiver scope
738
- regarded as leaked. Use `klass.unscoped` to avoid the leaking scope.
681
+ * Deprecate `in_clause_length` and `allowed_index_name_length` in `DatabaseLimits`.
739
682
 
740
683
  *Ryuta Kamizono*
741
684
 
742
- * Allow applications to automatically switch connections.
743
-
744
- Adds a middleware and configuration options that can be used in your
745
- application to automatically switch between the writing and reading
746
- database connections.
685
+ * Support bulk insert/upsert on relation to preserve scope values.
747
686
 
748
- `GET` and `HEAD` requests will read from the replica unless there was
749
- a write in the last 2 seconds, otherwise they will read from the primary.
750
- Non-get requests will always write to the primary. The middleware accepts
751
- an argument for a Resolver class and an Operations class where you are able
752
- to change how the auto-switcher works to be most beneficial for your
753
- application.
687
+ *Josef Šimánek*, *Ryuta Kamizono*
754
688
 
755
- To use the middleware in your application you can use the following
756
- configuration options:
689
+ * Preserve column comment value on changing column name on MySQL.
757
690
 
758
- ```
759
- config.active_record.database_selector = { delay: 2.seconds }
760
- config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
761
- config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
762
- ```
691
+ *Islam Taha*
763
692
 
764
- To change the database selection strategy, pass a custom class to the
765
- configuration options:
693
+ * Add support for `if_exists` option for removing an index.
766
694
 
767
- ```
768
- config.active_record.database_selector = { delay: 10.seconds }
769
- config.active_record.database_resolver = MyResolver
770
- config.active_record.database_resolver_context = MyResolver::MyCookies
771
- ```
695
+ The `remove_index` method can take an `if_exists` option. If this is set to true an error won't be raised if the index doesn't exist.
772
696
 
773
697
  *Eileen M. Uchitelle*
774
698
 
775
- * MySQL: Support `:size` option to change text and blob size.
699
+ * Remove ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base.
776
700
 
777
701
  *Ryuta Kamizono*
778
702
 
779
- * Make `t.timestamps` with precision by default.
703
+ * Prevent `build_association` from `touching` a parent record if the record isn't persisted for `has_one` associations.
780
704
 
781
- *Ryuta Kamizono*
705
+ Fixes #38219.
782
706
 
707
+ *Josh Brody*
783
708
 
784
- ## Rails 6.0.0.beta1 (January 18, 2019) ##
709
+ * Add support for `if_not_exists` option for adding index.
785
710
 
786
- * Remove deprecated `#set_state` from the transaction object.
711
+ The `add_index` method respects `if_not_exists` option. If it is set to true
712
+ index won't be added.
787
713
 
788
- *Rafael Mendonça França*
714
+ Usage:
789
715
 
790
- * Remove deprecated `#supports_statement_cache?` from the database adapters.
716
+ ```ruby
717
+ add_index :users, :account_id, if_not_exists: true
718
+ ```
791
719
 
792
- *Rafael Mendonça França*
720
+ The `if_not_exists` option passed to `create_table` also gets propagated to indexes
721
+ created within that migration so that if table and its indexes exist then there is no
722
+ attempt to create them again.
793
723
 
794
- * Remove deprecated `#insert_fixtures` from the database adapters.
724
+ *Prathamesh Sonpatki*
795
725
 
796
- *Rafael Mendonça França*
726
+ * Add `ActiveRecord::Base#previously_new_record?` to show if a record was new before the last save.
797
727
 
798
- * Remove deprecated `ActiveRecord::ConnectionAdapters::SQLite3Adapter#valid_alter_table_type?`.
728
+ *Tom Ward*
799
729
 
800
- *Rafael Mendonça França*
730
+ * Support descending order for `find_each`, `find_in_batches`, and `in_batches`.
801
731
 
802
- * Do not allow passing the column name to `sum` when a block is passed.
732
+ Batch processing methods allow you to work with the records in batches, greatly reducing memory consumption, but records are always batched from oldest id to newest.
803
733
 
804
- *Rafael Mendonça França*
734
+ This change allows reversing the order, batching from newest to oldest. This is useful when you need to process newer batches of records first.
805
735
 
806
- * Do not allow passing the column name to `count` when a block is passed.
736
+ Pass `order: :desc` to yield batches in descending order. The default remains `order: :asc`.
807
737
 
808
- *Rafael Mendonça França*
738
+ ```ruby
739
+ Person.find_each(order: :desc) do |person|
740
+ person.party_all_night!
741
+ end
742
+ ```
809
743
 
810
- * Remove delegation of missing methods in a relation to arel.
744
+ *Alexey Vasiliev*
811
745
 
812
- *Rafael Mendonça França*
746
+ * Fix `insert_all` with enum values.
813
747
 
814
- * Remove delegation of missing methods in a relation to private methods of the class.
748
+ Fixes #38716.
815
749
 
816
- *Rafael Mendonça França*
750
+ *Joel Blum*
817
751
 
818
- * Deprecate `config.active_record.sqlite3.represent_boolean_as_integer`.
752
+ * Add support for `db:rollback:name` for multiple database applications.
819
753
 
820
- *Rafael Mendonça França*
754
+ Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
821
755
 
822
- * Change `SQLite3Adapter` to always represent boolean values as integers.
756
+ *Eileen M. Uchitelle*
823
757
 
824
- *Rafael Mendonça França*
758
+ * `Relation#pick` now uses already loaded results instead of making another query.
825
759
 
826
- * Remove ability to specify a timestamp name for `#cache_key`.
760
+ *Eugene Kenny*
827
761
 
828
- *Rafael Mendonça França*
762
+ * Deprecate using `return`, `break` or `throw` to exit a transaction block after writes.
829
763
 
830
- * Remove deprecated `ActiveRecord::Migrator.migrations_path=`.
764
+ *Dylan Thacker-Smith*
831
765
 
832
- *Rafael Mendonça França*
766
+ * Dump the schema or structure of a database when calling `db:migrate:name`.
833
767
 
834
- * Remove deprecated `expand_hash_conditions_for_aggregates`.
768
+ In previous versions of Rails, `rails db:migrate` would dump the schema of the database. In Rails 6, that holds true (`rails db:migrate` dumps all databases' schemas), but `rails db:migrate:name` does not share that behavior.
835
769
 
836
- *Rafael Mendonça França*
770
+ Going forward, calls to `rails db:migrate:name` will dump the schema (or structure) of the database being migrated.
837
771
 
838
- * Set polymorphic type column to NULL on `dependent: :nullify` strategy.
772
+ *Kyle Thompson*
839
773
 
840
- On polymorphic associations both the foreign key and the foreign type columns will be set to NULL.
774
+ * Reset the `ActiveRecord::Base` connection after `rails db:migrate:name`.
841
775
 
842
- *Laerti Papa*
776
+ When `rails db:migrate` has finished, it ensures the `ActiveRecord::Base` connection is reset to its original configuration. Going forward, `rails db:migrate:name` will have the same behavior.
843
777
 
844
- * Allow permitted instance of `ActionController::Parameters` as argument of `ActiveRecord::Relation#exists?`.
778
+ *Kyle Thompson*
845
779
 
846
- *Gannon McGibbon*
780
+ * Disallow calling `connected_to` on subclasses of `ActiveRecord::Base`.
847
781
 
848
- * Add support for endless ranges introduces in Ruby 2.6.
782
+ Behavior has not changed here but the previous API could be misleading to people who thought it would switch connections for only that class. `connected_to` switches the context from which we are getting connections, not the connections themselves.
849
783
 
850
- *Greg Navis*
784
+ *Eileen M. Uchitelle*, *John Crepezzi*
851
785
 
852
- * Deprecate passing `migrations_paths` to `connection.assume_migrated_upto_version`.
786
+ * Add support for horizontal sharding to `connects_to` and `connected_to`.
853
787
 
854
- *Ryuta Kamizono*
788
+ Applications can now connect to multiple shards and switch between their shards in an application. Note that the shard swapping is still a manual process as this change does not include an API for automatic shard swapping.
855
789
 
856
- * MySQL: `ROW_FORMAT=DYNAMIC` create table option by default.
790
+ Usage:
857
791
 
858
- Since MySQL 5.7.9, the `innodb_default_row_format` option defines the default row
859
- format for InnoDB tables. The default setting is `DYNAMIC`.
860
- The row format is required for indexing on `varchar(255)` with `utf8mb4` columns.
792
+ Given the following configuration:
861
793
 
862
- *Ryuta Kamizono*
794
+ ```yaml
795
+ # config/database.yml
796
+ production:
797
+ primary:
798
+ database: my_database
799
+ primary_shard_one:
800
+ database: my_database_shard_one
801
+ ```
863
802
 
864
- * Fix join table column quoting with SQLite.
803
+ Connect to multiple shards:
865
804
 
866
- *Gannon McGibbon*
805
+ ```ruby
806
+ class ApplicationRecord < ActiveRecord::Base
807
+ self.abstract_class = true
867
808
 
868
- * Allow disabling scopes generated by `ActiveRecord.enum`.
809
+ connects_to shards: {
810
+ default: { writing: :primary },
811
+ shard_one: { writing: :primary_shard_one }
812
+ }
813
+ ```
869
814
 
870
- *Alfred Dominic*
815
+ Swap between shards in your controller / model code:
871
816
 
872
- * Ensure that `delete_all` on collection proxy returns affected count.
817
+ ```ruby
818
+ ActiveRecord::Base.connected_to(shard: :shard_one) do
819
+ # Read from shard one
820
+ end
821
+ ```
873
822
 
874
- *Ryuta Kamizono*
823
+ The horizontal sharding API also supports read replicas. See guides for more details.
875
824
 
876
- * Reset scope after delete on collection association to clear stale offsets of removed records.
825
+ *Eileen M. Uchitelle*, *John Crepezzi*
877
826
 
878
- *Gannon McGibbon*
827
+ * Deprecate `spec_name` in favor of `name` on database configurations.
879
828
 
880
- * Add the ability to prevent writes to a database for the duration of a block.
829
+ The accessors for `spec_name` on `configs_for` and `DatabaseConfig` are deprecated. Please use `name` instead.
881
830
 
882
- Allows the application to prevent writes to a database. This can be useful when
883
- you're building out multiple databases and want to make sure you're not sending
884
- writes when you want a read.
831
+ Deprecated behavior:
885
832
 
886
- If `while_preventing_writes` is called and the query is considered a write
887
- query the database will raise an exception regardless of whether the database
888
- user is able to write.
833
+ ```ruby
834
+ db_config = ActiveRecord::Base.configs_for(env_name: "development", spec_name: "primary")
835
+ db_config.spec_name
836
+ ```
889
837
 
890
- This is not meant to be a catch-all for write queries but rather a way to enforce
891
- read-only queries without opening a second connection. One purpose of this is to
892
- catch accidental writes, not all writes.
838
+ New behavior:
893
839
 
894
- *Eileen M. Uchitelle*
840
+ ```ruby
841
+ db_config = ActiveRecord::Base.configs_for(env_name: "development", name: "primary")
842
+ db_config.name
843
+ ```
895
844
 
896
- * Allow aliased attributes to be used in `#update_columns` and `#update`.
845
+ *Eileen M. Uchitelle*
897
846
 
898
- *Gannon McGibbon*
847
+ * Add additional database-specific rake tasks for multi-database users.
899
848
 
900
- * Allow spaces in postgres table names.
849
+ Previously, `rails db:create`, `rails db:drop`, and `rails db:migrate` were the only rails tasks that could operate on a single
850
+ database. For example:
901
851
 
902
- Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres adapter.
852
+ ```
853
+ rails db:create
854
+ rails db:create:primary
855
+ rails db:create:animals
856
+ rails db:drop
857
+ rails db:drop:primary
858
+ rails db:drop:animals
859
+ rails db:migrate
860
+ rails db:migrate:primary
861
+ rails db:migrate:animals
862
+ ```
903
863
 
904
- *Gannon McGibbon*
864
+ With these changes, `rails db:schema:dump`, `rails db:schema:load`, `rails db:structure:dump`, `rails db:structure:load` and
865
+ `rails db:test:prepare` can additionally operate on a single database. For example:
905
866
 
906
- * Cached `columns_hash` fields should be excluded from `ResultSet#column_types`.
867
+ ```
868
+ rails db:schema:dump
869
+ rails db:schema:dump:primary
870
+ rails db:schema:dump:animals
871
+ rails db:schema:load
872
+ rails db:schema:load:primary
873
+ rails db:schema:load:animals
874
+ rails db:structure:dump
875
+ rails db:structure:dump:primary
876
+ rails db:structure:dump:animals
877
+ rails db:structure:load
878
+ rails db:structure:load:primary
879
+ rails db:structure:load:animals
880
+ rails db:test:prepare
881
+ rails db:test:prepare:primary
882
+ rails db:test:prepare:animals
883
+ ```
907
884
 
908
- PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test
909
- was passing for SQLite and MySQL, but failed for PostgreSQL:
885
+ *Kyle Thompson*
910
886
 
911
- ```ruby
912
- class DeveloperName < ActiveRecord::Type::String
913
- def deserialize(value)
914
- "Developer: #{value}"
915
- end
916
- end
887
+ * Add support for `strict_loading` mode on association declarations.
917
888
 
918
- class AttributedDeveloper < ActiveRecord::Base
919
- self.table_name = "developers"
889
+ Raise an error if attempting to load a record from an association that has been marked as `strict_loading` unless it was explicitly eager loaded.
920
890
 
921
- attribute :name, DeveloperName.new
891
+ Usage:
922
892
 
923
- self.ignored_columns += ["name"]
893
+ ```ruby
894
+ class Developer < ApplicationRecord
895
+ has_many :projects, strict_loading: true
924
896
  end
925
897
 
926
- developer = AttributedDeveloper.create
927
- developer.update_column :name, "name"
928
-
929
- loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
930
- puts loaded_developer.name # should be "Developer: name" but it's just "name"
898
+ dev = Developer.first
899
+ dev.projects.first
900
+ # => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.
931
901
  ```
932
902
 
933
- *Dmitry Tsepelev*
934
-
935
- * Make the implicit order column configurable.
936
-
937
- When calling ordered finder methods such as `first` or `last` without an
938
- explicit order clause, ActiveRecord sorts records by primary key. This can
939
- result in unpredictable and surprising behaviour when the primary key is
940
- not an auto-incrementing integer, for example when it's a UUID. This change
941
- makes it possible to override the column used for implicit ordering such
942
- that `first` and `last` will return more predictable results.
943
-
944
- Example:
945
-
946
- class Project < ActiveRecord::Base
947
- self.implicit_order_column = "created_at"
948
- end
903
+ *Kevin Deisz*
949
904
 
950
- *Tekin Suleyman*
905
+ * Add support for `strict_loading` mode to prevent lazy loading of records.
951
906
 
952
- * Bump minimum PostgreSQL version to 9.3.
907
+ Raise an error if a parent record is marked as `strict_loading` and attempts to lazily load its associations. This is useful for finding places you may want to preload an association and avoid additional queries.
953
908
 
954
- *Yasuo Honda*
909
+ Usage:
955
910
 
956
- * Values of enum are frozen, raising an error when attempting to modify them.
911
+ ```ruby
912
+ dev = Developer.strict_loading.first
913
+ dev.audit_logs.to_a
914
+ # => ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.
915
+ ```
957
916
 
958
- *Emmanuel Byrd*
917
+ *Eileen M. Uchitelle*, *Aaron Patterson*
959
918
 
960
- * Move `ActiveRecord::StatementInvalid` SQL to error property and include binds as separate error property.
919
+ * Add support for PostgreSQL 11+ partitioned indexes when using `upsert_all`.
961
920
 
962
- `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception_class` now requires `binds` to be passed as the last argument.
921
+ *Sebastián Palma*
963
922
 
964
- `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception` now requires `message`, `sql`, and `binds` to be passed as keyword arguments.
923
+ * Adds support for `if_not_exists` to `add_column` and `if_exists` to `remove_column`.
965
924
 
966
- Subclasses of `ActiveRecord::StatementInvalid` must now provide `sql:` and `binds:` arguments to `super`.
925
+ Applications can set their migrations to ignore exceptions raised when adding a column that already exists or when removing a column that does not exist.
967
926
 
968
- Example:
927
+ Example Usage:
969
928
 
970
- ```
971
- class MySubclassedError < ActiveRecord::StatementInvalid
972
- def initialize(message, sql:, binds:)
973
- super(message, sql: sql, binds: binds)
929
+ ```ruby
930
+ class AddColumnTitle < ActiveRecord::Migration[6.1]
931
+ def change
932
+ add_column :posts, :title, :string, if_not_exists: true
974
933
  end
975
934
  end
976
935
  ```
977
936
 
978
- *Gannon McGibbon*
937
+ ```ruby
938
+ class RemoveColumnTitle < ActiveRecord::Migration[6.1]
939
+ def change
940
+ remove_column :posts, :title, if_exists: true
941
+ end
942
+ end
943
+ ```
979
944
 
980
- * Add an `:if_not_exists` option to `create_table`.
945
+ *Eileen M. Uchitelle*
981
946
 
982
- Example:
947
+ * Regexp-escape table name for MS SQL Server.
983
948
 
984
- create_table :posts, if_not_exists: true do |t|
985
- t.string :title
986
- end
949
+ Add `Regexp.escape` to one method in ActiveRecord, so that table names with regular expression characters in them work as expected. Since MS SQL Server uses "[" and "]" to quote table and column names, and those characters are regular expression characters, methods like `pluck` and `select` fail in certain cases when used with the MS SQL Server adapter.
987
950
 
988
- That would execute:
951
+ *Larry Reid*
989
952
 
990
- CREATE TABLE IF NOT EXISTS posts (
991
- ...
992
- )
953
+ * Store advisory locks on their own named connection.
993
954
 
994
- If the table already exists, `if_not_exists: false` (the default) raises an
995
- exception whereas `if_not_exists: true` does nothing.
955
+ Previously advisory locks were taken out against a connection when a migration started. This works fine in single database applications but doesn't work well when migrations need to open new connections which results in the lock getting dropped.
996
956
 
997
- *fatkodima*, *Stefan Kanev*
957
+ In order to fix this we are storing the advisory lock on a new connection with the connection specification name `AdvisoryLockBase`. The caveat is that we need to maintain at least 2 connections to a database while migrations are running in order to do this.
998
958
 
999
- * Defining an Enum as a Hash with blank key, or as an Array with a blank value, now raises an `ArgumentError`.
959
+ *Eileen M. Uchitelle*, *John Crepezzi*
1000
960
 
1001
- *Christophe Maximin*
961
+ * Allow schema cache path to be defined in the database configuration file.
1002
962
 
1003
- * Adds support for multiple databases to `rails db:schema:cache:dump` and `rails db:schema:cache:clear`.
963
+ For example:
1004
964
 
1005
- *Gannon McGibbon*
965
+ ```yaml
966
+ development:
967
+ adapter: postgresql
968
+ database: blog_development
969
+ pool: 5
970
+ schema_cache_path: tmp/schema/main.yml
971
+ ```
1006
972
 
1007
- * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
1008
- if the attribute does not exist.
973
+ *Katrina Owen*
1009
974
 
1010
- *Sean Griffin*
975
+ * Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
1011
976
 
1012
- * Add support for hash and URL configs in database hash of `ActiveRecord::Base.connected_to`.
977
+ `#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in 6.2.
1013
978
 
1014
- ````
1015
- User.connected_to(database: { writing: "postgres://foo" }) do
1016
- User.create!(name: "Gannon")
1017
- end
979
+ *Eileen M. Uchitelle*, *John Crepezzi*
1018
980
 
1019
- config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
1020
- User.connected_to(database: { reading: config }) do
1021
- User.count
1022
- end
1023
- ````
981
+ * Deprecate `#default_hash` and it's alias `#[]` on database configurations.
1024
982
 
1025
- *Gannon McGibbon*
983
+ Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
1026
984
 
1027
- * Support default expression for MySQL.
985
+ *Eileen M. Uchitelle*, *John Crepezzi*
1028
986
 
1029
- MySQL 8.0.13 and higher supports default value to be a function or expression.
987
+ * Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
1030
988
 
1031
- https://dev.mysql.com/doc/refman/8.0/en/create-table.html
989
+ *Gannon McGibbon*
1032
990
 
1033
- *Ryuta Kamizono*
991
+ * Find orphans by looking for missing relations through chaining `where.missing`:
1034
992
 
1035
- * Support expression indexes for MySQL.
993
+ Before:
1036
994
 
1037
- MySQL 8.0.13 and higher supports functional key parts that index
1038
- expression values rather than column or column prefix values.
995
+ ```ruby
996
+ Post.left_joins(:author).where(authors: { id: nil })
997
+ ```
1039
998
 
1040
- https://dev.mysql.com/doc/refman/8.0/en/create-index.html
999
+ After:
1041
1000
 
1042
- *Ryuta Kamizono*
1001
+ ```ruby
1002
+ Post.where.missing(:author)
1003
+ ```
1043
1004
 
1044
- * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
1005
+ *Tom Rossi*
1045
1006
 
1046
- Fixes #33056.
1007
+ * Ensure `:reading` connections always raise if a write is attempted.
1047
1008
 
1048
- *Federico Martinez*
1009
+ Now Rails will raise an `ActiveRecord::ReadOnlyError` if any connection on the reading handler attempts to make a write. If your reading role needs to write you should name the role something other than `:reading`.
1049
1010
 
1050
- * Add basic API for connection switching to support multiple databases.
1011
+ *Eileen M. Uchitelle*
1051
1012
 
1052
- 1) Adds a `connects_to` method for models to connect to multiple databases. Example:
1013
+ * Deprecate `"primary"` as the `connection_specification_name` for `ActiveRecord::Base`.
1053
1014
 
1054
- ```
1055
- class AnimalsModel < ApplicationRecord
1056
- self.abstract_class = true
1015
+ `"primary"` has been deprecated as the `connection_specification_name` for `ActiveRecord::Base` in favor of using `"ActiveRecord::Base"`. This change affects calls to `ActiveRecord::Base.connection_handler.retrieve_connection` and `ActiveRecord::Base.connection_handler.remove_connection`. If you're calling these methods with `"primary"`, please switch to `"ActiveRecord::Base"`.
1057
1016
 
1058
- connects_to database: { writing: :animals_primary, reading: :animals_replica }
1059
- end
1017
+ *Eileen M. Uchitelle*, *John Crepezzi*
1060
1018
 
1061
- class Dog < AnimalsModel
1062
- # connected to both the animals_primary db for writing and the animals_replica for reading
1063
- end
1064
- ```
1019
+ * Add `ActiveRecord::Validations::NumericalityValidator` with
1020
+ support for casting floats using a database columns' precision value.
1065
1021
 
1066
- 2) Adds a `connected_to` block method for switching connection roles or connecting to
1067
- a database that the model didn't connect to. Connecting to the database in this block is
1068
- useful when you have another defined connection, for example `slow_replica` that you don't
1069
- want to connect to by default but need in the console, or a specific code block.
1022
+ *Gannon McGibbon*
1070
1023
 
1071
- ```
1072
- ActiveRecord::Base.connected_to(role: :reading) do
1073
- Dog.first # finds dog from replica connected to AnimalsBase
1074
- Book.first # doesn't have a reading connection, will raise an error
1075
- end
1076
- ```
1024
+ * Enforce fresh ETag header after a collection's contents change by adding
1025
+ ActiveRecord::Relation#cache_key_with_version. This method will be used by
1026
+ ActionController::ConditionalGet to ensure that when collection cache versioning
1027
+ is enabled, requests using ConditionalGet don't return the same ETag header
1028
+ after a collection is modified.
1077
1029
 
1078
- ```
1079
- ActiveRecord::Base.connected_to(database: :slow_replica) do
1080
- SlowReplicaModel.first # if the db config has a slow_replica configuration this will be used to do the lookup, otherwise this will throw an exception
1081
- end
1082
- ```
1030
+ Fixes #38078.
1083
1031
 
1084
- *Eileen M. Uchitelle*
1032
+ *Aaron Lipman*
1085
1033
 
1086
- * Enum raises on invalid definition values
1034
+ * Skip test database when running `db:create` or `db:drop` in development
1035
+ with `DATABASE_URL` set.
1087
1036
 
1088
- When defining a Hash enum it can be easy to use `[]` instead of `{}`. This
1089
- commit checks that only valid definition values are provided, those can
1090
- be a Hash, an array of Symbols or an array of Strings. Otherwise it
1091
- raises an `ArgumentError`.
1037
+ *Brian Buchalter*
1092
1038
 
1093
- Fixes #33961
1039
+ * Don't allow mutations on the database configurations hash.
1094
1040
 
1095
- *Alberto Almagro*
1041
+ Freeze the configurations hash to disallow directly changing it. If applications need to change the hash, for example to create databases for parallelization, they should use the `DatabaseConfig` object directly.
1096
1042
 
1097
- * Reloading associations now clears the Query Cache like `Persistence#reload` does.
1043
+ Before:
1098
1044
 
1045
+ ```ruby
1046
+ @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
1047
+ @db_config.configuration_hash.merge!(idle_timeout: "0.02")
1099
1048
  ```
1100
- class Post < ActiveRecord::Base
1101
- has_one :category
1102
- belongs_to :author
1103
- has_many :comments
1104
- end
1105
1049
 
1106
- # Each of the following will now clear the query cache.
1107
- post.reload_category
1108
- post.reload_author
1109
- post.comments.reload
1050
+ After:
1051
+
1052
+ ```ruby
1053
+ @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
1054
+ config = @db_config.configuration_hash.merge(idle_timeout: "0.02")
1055
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(@db_config.env_name, @db_config.spec_name, config)
1110
1056
  ```
1111
1057
 
1112
- *Christophe Maximin*
1058
+ *Eileen M. Uchitelle*, *John Crepezzi*
1113
1059
 
1114
- * Added `index` option for `change_table` migration helpers.
1115
- With this change you can create indexes while adding new
1116
- columns into the existing tables.
1060
+ * Remove `:connection_id` from the `sql.active_record` notification.
1117
1061
 
1118
- Example:
1062
+ *Aaron Patterson*, *Rafael Mendonça França*
1119
1063
 
1120
- change_table(:languages) do |t|
1121
- t.string :country_code, index: true
1122
- end
1064
+ * The `:name` key will no longer be returned as part of `DatabaseConfig#configuration_hash`. Please use `DatabaseConfig#owner_name` instead.
1123
1065
 
1124
- *Mehmet Emin İNAÇ*
1066
+ *Eileen M. Uchitelle*, *John Crepezzi*
1125
1067
 
1126
- * Fix `transaction` reverting for migrations.
1068
+ * ActiveRecord's `belongs_to_required_by_default` flag can now be set per model.
1127
1069
 
1128
- Before: Commands inside a `transaction` in a reverted migration ran uninverted.
1129
- Now: This change fixes that by reverting commands inside `transaction` block.
1070
+ You can now opt-out/opt-in specific models from having their associations required
1071
+ by default.
1130
1072
 
1131
- *fatkodima*, *David Verhasselt*
1073
+ This change is meant to ease the process of migrating all your models to have
1074
+ their association required.
1132
1075
 
1133
- * Raise an error instead of scanning the filesystem root when `fixture_path` is blank.
1076
+ *Edouard Chin*
1134
1077
 
1135
- *Gannon McGibbon*, *Max Albrecht*
1078
+ * The `connection_config` method has been deprecated, please use `connection_db_config` instead which will return a `DatabaseConfigurations::DatabaseConfig` instead of a `Hash`.
1136
1079
 
1137
- * Allow `ActiveRecord::Base.configurations=` to be set with a symbolized hash.
1080
+ *Eileen M. Uchitelle*, *John Crepezzi*
1138
1081
 
1139
- *Gannon McGibbon*
1082
+ * Retain explicit selections on the base model after applying `includes` and `joins`.
1140
1083
 
1141
- * Don't update counter cache unless the record is actually saved.
1084
+ Resolves #34889.
1142
1085
 
1143
- Fixes #31493, #33113, #33117.
1086
+ *Patrick Rebsch*
1144
1087
 
1145
- *Ryuta Kamizono*
1088
+ * The `database` kwarg is deprecated without replacement because it can't be used for sharding and creates an issue if it's used during a request. Applications that need to create new connections should use `connects_to` instead.
1146
1089
 
1147
- * Deprecate `ActiveRecord::Result#to_hash` in favor of `ActiveRecord::Result#to_a`.
1090
+ *Eileen M. Uchitelle*, *John Crepezzi*
1148
1091
 
1149
- *Gannon McGibbon*, *Kevin Cheng*
1092
+ * Allow attributes to be fetched from Arel node groupings.
1150
1093
 
1151
- * SQLite3 adapter supports expression indexes.
1094
+ *Jeff Emminger*, *Gannon McGibbon*
1152
1095
 
1153
- ```
1154
- create_table :users do |t|
1155
- t.string :email
1156
- end
1096
+ * A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgreSQL `options`.
1157
1097
 
1158
- add_index :users, 'lower(email)', name: 'index_users_on_email', unique: true
1159
- ```
1098
+ *Joshua Flanagan*
1160
1099
 
1161
- *Gray Kemmey*
1100
+ * Calling methods like `establish_connection` with a `Hash` which is invalid (eg: no `adapter`) will now raise an error the same way as connections defined in `config/database.yml`.
1162
1101
 
1163
- * Allow subclasses to redefine autosave callbacks for associated records.
1102
+ *John Crepezzi*
1164
1103
 
1165
- Fixes #33305.
1104
+ * Specifying `implicit_order_column` now subsorts the records by primary key if available to ensure deterministic results.
1166
1105
 
1167
- *Andrey Subbota*
1106
+ *Paweł Urbanek*
1168
1107
 
1169
- * Bump minimum MySQL version to 5.5.8.
1108
+ * `where(attr => [])` now loads an empty result without making a query.
1170
1109
 
1171
- *Yasuo Honda*
1110
+ *John Hawthorn*
1172
1111
 
1173
- * Use MySQL utf8mb4 character set by default.
1112
+ * Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
1174
1113
 
1175
- `utf8mb4` character set with 4-Byte encoding supports supplementary characters including emoji.
1176
- The previous default 3-Byte encoding character set `utf8` is not enough to support them.
1114
+ *Hiroyuki Ishii*
1177
1115
 
1178
- *Yasuo Honda*
1116
+ * Add support for `belongs_to` to `has_many` inversing.
1179
1117
 
1180
- * Fix duplicated record creation when using nested attributes with `create_with`.
1118
+ *Gannon McGibbon*
1181
1119
 
1182
- *Darwin Wu*
1120
+ * Allow length configuration for `has_secure_token` method. The minimum length
1121
+ is set at 24 characters.
1183
1122
 
1184
- * Configuration item `config.filter_parameters` could also filter out
1185
- sensitive values of database columns when calling `#inspect`.
1186
- We also added `ActiveRecord::Base::filter_attributes`/`=` in order to
1187
- specify sensitive attributes to specific model.
1123
+ Before:
1188
1124
 
1125
+ ```ruby
1126
+ has_secure_token :auth_token
1189
1127
  ```
1190
- Rails.application.config.filter_parameters += [:credit_card_number, /phone/]
1191
- Account.last.inspect # => #<Account id: 123, name: "DHH", credit_card_number: [FILTERED], telephone_number: [FILTERED] ...>
1192
- SecureAccount.filter_attributes += [:name]
1193
- SecureAccount.last.inspect # => #<SecureAccount id: 42, name: [FILTERED], credit_card_number: [FILTERED] ...>
1128
+
1129
+ After:
1130
+
1131
+ ```ruby
1132
+ has_secure_token :default_token # 24 characters
1133
+ has_secure_token :auth_token, length: 36 # 36 characters
1134
+ has_secure_token :invalid_token, length: 12 # => ActiveRecord::SecureToken::MinimumLengthError
1194
1135
  ```
1195
1136
 
1196
- *Zhang Kang*, *Yoshiyuki Kinjo*
1137
+ *Bernardo de Araujo*
1197
1138
 
1198
- * Deprecate `column_name_length`, `table_name_length`, `columns_per_table`,
1199
- `indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
1200
- and `joins_per_query` methods in `DatabaseLimits`.
1139
+ * Deprecate `DatabaseConfigurations#to_h`. These connection hashes are still available via `ActiveRecord::Base.configurations.configs_for`.
1201
1140
 
1202
- *Ryuta Kamizono*
1141
+ *Eileen Uchitelle*, *John Crepezzi*
1203
1142
 
1204
- * `ActiveRecord::Base.configurations` now returns an object.
1143
+ * Add `DatabaseConfig#configuration_hash` to return database configuration hashes with symbol keys, and use all symbol-key configuration hashes internally. Deprecate `DatabaseConfig#config` which returns a String-keyed `Hash` with the same values.
1205
1144
 
1206
- `ActiveRecord::Base.configurations` used to return a hash, but this
1207
- is an inflexible data model. In order to improve multiple-database
1208
- handling in Rails, we've changed this to return an object. Some methods
1209
- are provided to make the object behave hash-like in order to ease the
1210
- transition process. Since most applications don't manipulate the hash
1211
- we've decided to add backwards-compatible functionality that will throw
1212
- a deprecation warning if used, however calling `ActiveRecord::Base.configurations`
1213
- will use the new version internally and externally.
1145
+ *John Crepezzi*, *Eileen Uchitelle*
1214
1146
 
1215
- For example, the following `database.yml`:
1147
+ * Allow column names to be passed to `remove_index` positionally along with other options.
1216
1148
 
1217
- ```
1218
- development:
1219
- adapter: sqlite3
1220
- database: db/development.sqlite3
1221
- ```
1149
+ Passing other options can be necessary to make `remove_index` correctly reversible.
1222
1150
 
1223
- Used to become a hash:
1151
+ Before:
1224
1152
 
1225
- ```
1226
- { "development" => { "adapter" => "sqlite3", "database" => "db/development.sqlite3" } }
1227
- ```
1153
+ add_index :reports, :report_id # => works
1154
+ add_index :reports, :report_id, unique: true # => works
1155
+ remove_index :reports, :report_id # => works
1156
+ remove_index :reports, :report_id, unique: true # => ArgumentError
1157
+
1158
+ After:
1228
1159
 
1229
- Is now converted into the following object:
1160
+ remove_index :reports, :report_id, unique: true # => works
1230
1161
 
1231
- ```
1232
- #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
1233
- #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
1234
- @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
1235
- ]
1236
- ```
1162
+ *Eugene Kenny*
1237
1163
 
1238
- Iterating over the database configurations has also changed. Instead of
1239
- calling hash methods on the `configurations` hash directly, a new method `configs_for` has
1240
- been provided that allows you to select the correct configuration. `env_name` and
1241
- `spec_name` arguments are optional. For example, these return an array of
1242
- database config objects for the requested environment and a single database config object
1243
- will be returned for the requested environment and specification name respectively.
1164
+ * Allow bulk `ALTER` statements to drop and recreate indexes with the same name.
1244
1165
 
1245
- ```
1246
- ActiveRecord::Base.configurations.configs_for(env_name: "development")
1247
- ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
1248
- ```
1166
+ *Eugene Kenny*
1249
1167
 
1250
- *Eileen M. Uchitelle*, *Aaron Patterson*
1168
+ * `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
1251
1169
 
1252
- * Add database configuration to disable advisory locks.
1170
+ *Eugene Kenny*
1253
1171
 
1254
- ```
1255
- production:
1256
- adapter: postgresql
1257
- advisory_locks: false
1258
- ```
1172
+ * Call `while_preventing_writes` directly from `connected_to`.
1259
1173
 
1260
- *Guo Xiang*
1174
+ In some cases application authors want to use the database switching middleware and make explicit calls with `connected_to`. It's possible for an app to turn off writes and not turn them back on by the time we call `connected_to(role: :writing)`.
1261
1175
 
1262
- * SQLite3 adapter `alter_table` method restores foreign keys.
1176
+ This change allows apps to fix this by assuming if a role is writing we want to allow writes, except in the case it's explicitly turned off.
1263
1177
 
1264
- *Yasuo Honda*
1178
+ *Eileen M. Uchitelle*
1265
1179
 
1266
- * Allow `:to_table` option to `invert_remove_foreign_key`.
1180
+ * Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
1267
1181
 
1268
- Example:
1182
+ *Kir Shatrov*
1269
1183
 
1270
- remove_foreign_key :accounts, to_table: :owners
1184
+ * Stop trying to read yaml file fixtures when loading Active Record fixtures.
1271
1185
 
1272
- *Nikolay Epifanov*, *Rich Chen*
1186
+ *Gannon McGibbon*
1273
1187
 
1274
- * Add environment & load_config dependency to `bin/rake db:seed` to enable
1275
- seed load in environments without Rails and custom DB configuration
1188
+ * Deprecate `.reorder(nil)` with `.first` / `.first!` taking non-deterministic result.
1276
1189
 
1277
- *Tobias Bielohlawek*
1190
+ To continue taking non-deterministic result, use `.take` / `.take!` instead.
1278
1191
 
1279
- * Fix default value for mysql time types with specified precision.
1192
+ *Ryuta Kamizono*
1280
1193
 
1281
- *Nikolay Kondratyev*
1194
+ * Preserve user supplied joins order as much as possible.
1282
1195
 
1283
- * Fix `touch` option to behave consistently with `Persistence#touch` method.
1196
+ Fixes #36761, #34328, #24281, #12953.
1284
1197
 
1285
1198
  *Ryuta Kamizono*
1286
1199
 
1287
- * Migrations raise when duplicate column definition.
1200
+ * Allow `matches_regex` and `does_not_match_regexp` on the MySQL Arel visitor.
1201
+
1202
+ *James Pearson*
1288
1203
 
1289
- Fixes #33024.
1204
+ * Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section.
1290
1205
 
1291
- *Federico Martinez*
1206
+ *Tongfei Gao*
1207
+
1208
+ * Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
1292
1209
 
1293
- * Bump minimum SQLite version to 3.8
1210
+ *John Crepezzi*, *Eileen Uchitelle*
1294
1211
 
1295
- *Yasuo Honda*
1212
+ * Add a warning for enum elements with 'not_' prefix.
1296
1213
 
1297
- * Fix parent record should not get saved with duplicate children records.
1214
+ class Foo
1215
+ enum status: [:sent, :not_sent]
1216
+ end
1298
1217
 
1299
- Fixes #32940.
1218
+ *Edu Depetris*
1300
1219
 
1301
- *Santosh Wadghule*
1220
+ * Make currency symbols optional for money column type in PostgreSQL.
1302
1221
 
1303
- * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
1222
+ *Joel Schneider*
1304
1223
 
1305
- *Brian Durand*
1224
+ * Add support for beginless ranges, introduced in Ruby 2.7.
1306
1225
 
1307
- * Ensure `Associations::CollectionAssociation#size` and `Associations::CollectionAssociation#empty?`
1308
- use loaded association ids if present.
1226
+ *Josh Goodall*
1309
1227
 
1310
- *Graham Turner*
1228
+ * Add `database_exists?` method to connection adapters to check if a database exists.
1311
1229
 
1312
- * Add support to preload associations of polymorphic associations when not all the records have the requested associations.
1230
+ *Guilherme Mansur*
1313
1231
 
1314
- *Dana Sherson*
1232
+ * Loading the schema for a model that has no `table_name` raises a `TableNotSpecified` error.
1315
1233
 
1316
- * Add `touch_all` method to `ActiveRecord::Relation`.
1234
+ *Guilherme Mansur*, *Eugene Kenny*
1317
1235
 
1318
- Example:
1236
+ * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
1319
1237
 
1320
- Person.where(name: "David").touch_all(time: Time.new(2020, 5, 16, 0, 0, 0))
1238
+ Fixes #36022.
1239
+
1240
+ *Ryuta Kamizono*
1241
+
1242
+ * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
1321
1243
 
1322
- *fatkodima*, *duggiefresh*
1244
+ Fixes #36465.
1323
1245
 
1324
- * Add `ActiveRecord::Base.base_class?` predicate.
1246
+ *Jeff Doering*
1325
1247
 
1326
- *Bogdan Gusiev*
1248
+ * Add support for multiple databases to `rails db:abort_if_pending_migrations`.
1327
1249
 
1328
- * Add custom prefix/suffix options to `ActiveRecord::Store.store_accessor`.
1250
+ *Mark Lee*
1329
1251
 
1330
- *Tan Huynh*, *Yukio Mizuta*
1252
+ * Fix sqlite3 collation parsing when using decimal columns.
1331
1253
 
1332
- * Rails 6 requires Ruby 2.5.0 or newer.
1254
+ *Martin R. Schuster*
1333
1255
 
1334
- *Jeremy Daer*, *Kasper Timm Hansen*
1256
+ * Fix invalid schema when primary key column has a comment.
1335
1257
 
1336
- * Deprecate `update_attributes`/`!` in favor of `update`/`!`.
1258
+ Fixes #29966.
1337
1259
 
1338
- *Eddie Lebow*
1260
+ *Guilherme Goettems Schneider*
1339
1261
 
1340
- * Add `ActiveRecord::Base.create_or_find_by`/`!` to deal with the SELECT/INSERT race condition in
1341
- `ActiveRecord::Base.find_or_create_by`/`!` by leaning on unique constraints in the database.
1262
+ * Fix table comment also being applied to the primary key column.
1342
1263
 
1343
- *DHH*
1264
+ *Guilherme Goettems Schneider*
1344
1265
 
1345
- * Add `Relation#pick` as short-hand for single-value plucks.
1266
+ * Allow generated `create_table` migrations to include or skip timestamps.
1346
1267
 
1347
- *DHH*
1268
+ *Michael Duchemin*
1348
1269
 
1349
1270
 
1350
- Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activerecord/CHANGELOG.md) for previous changes.
1271
+ Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activerecord/CHANGELOG.md) for previous changes.