activerecord 5.2.8.1 → 6.1.7.3

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