activerecord 6.0.6.1 → 6.1.0

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