activerecord 6.0.4.7 → 6.1.7.3

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