activerecord 6.0.5.1 → 6.1.7.4

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