activerecord 6.0.0 → 6.1.7.4

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