activerecord 5.2.8.1 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +849 -630
  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 +5 -4
  7. data/lib/active_record/association_relation.rb +22 -12
  8. data/lib/active_record/associations/alias_tracker.rb +19 -16
  9. data/lib/active_record/associations/association.rb +95 -42
  10. data/lib/active_record/associations/association_scope.rb +21 -21
  11. data/lib/active_record/associations/belongs_to_association.rb +50 -46
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -5
  13. data/lib/active_record/associations/builder/association.rb +23 -21
  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 +31 -29
  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 +41 -20
  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 +71 -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 +133 -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 +45 -8
  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 +2 -15
  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 +98 -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 +203 -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 +381 -146
  61. data/lib/active_record/connection_adapters/abstract/transaction.rb +155 -68
  62. data/lib/active_record/connection_adapters/abstract_adapter.rb +229 -98
  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 +31 -0
  67. data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
  68. data/lib/active_record/connection_adapters/mysql/database_statements.rb +86 -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 +44 -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 +14 -6
  74. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +139 -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 +63 -0
  78. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  79. data/lib/active_record/connection_adapters/postgresql/column.rb +37 -28
  80. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +38 -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/money.rb +2 -2
  92. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +3 -4
  94. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +25 -7
  95. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  96. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
  97. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +15 -3
  98. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  99. data/lib/active_record/connection_adapters/postgresql/quoting.rb +47 -10
  100. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
  101. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +19 -4
  102. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
  103. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
  104. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +120 -100
  105. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +31 -26
  106. data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
  107. data/lib/active_record/connection_adapters/postgresql_adapter.rb +222 -112
  108. data/lib/active_record/connection_adapters/schema_cache.rb +127 -21
  109. data/lib/active_record/connection_adapters/sql_type_metadata.rb +19 -6
  110. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
  111. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -7
  112. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  113. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +77 -13
  114. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +174 -186
  115. data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
  116. data/lib/active_record/connection_adapters.rb +50 -0
  117. data/lib/active_record/connection_handling.rb +285 -33
  118. data/lib/active_record/core.rb +304 -106
  119. data/lib/active_record/counter_cache.rb +8 -30
  120. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  121. data/lib/active_record/database_configurations/database_config.rb +80 -0
  122. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  123. data/lib/active_record/database_configurations/url_config.rb +53 -0
  124. data/lib/active_record/database_configurations.rb +272 -0
  125. data/lib/active_record/delegated_type.rb +209 -0
  126. data/lib/active_record/destroy_association_async_job.rb +36 -0
  127. data/lib/active_record/dynamic_matchers.rb +3 -4
  128. data/lib/active_record/enum.rb +71 -17
  129. data/lib/active_record/errors.rb +62 -19
  130. data/lib/active_record/explain.rb +10 -6
  131. data/lib/active_record/explain_subscriber.rb +1 -1
  132. data/lib/active_record/fixture_set/file.rb +10 -17
  133. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  134. data/lib/active_record/fixture_set/render_context.rb +17 -0
  135. data/lib/active_record/fixture_set/table_row.rb +152 -0
  136. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  137. data/lib/active_record/fixtures.rb +197 -481
  138. data/lib/active_record/gem_version.rb +4 -4
  139. data/lib/active_record/inheritance.rb +53 -24
  140. data/lib/active_record/insert_all.rb +208 -0
  141. data/lib/active_record/integration.rb +67 -17
  142. data/lib/active_record/internal_metadata.rb +26 -9
  143. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  144. data/lib/active_record/locking/optimistic.rb +26 -22
  145. data/lib/active_record/locking/pessimistic.rb +9 -5
  146. data/lib/active_record/log_subscriber.rb +34 -35
  147. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  148. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  149. data/lib/active_record/middleware/database_selector.rb +77 -0
  150. data/lib/active_record/migration/command_recorder.rb +96 -44
  151. data/lib/active_record/migration/compatibility.rb +141 -64
  152. data/lib/active_record/migration/join_table.rb +0 -1
  153. data/lib/active_record/migration.rb +205 -156
  154. data/lib/active_record/model_schema.rb +148 -22
  155. data/lib/active_record/nested_attributes.rb +4 -7
  156. data/lib/active_record/no_touching.rb +8 -1
  157. data/lib/active_record/null_relation.rb +0 -1
  158. data/lib/active_record/persistence.rb +267 -59
  159. data/lib/active_record/query_cache.rb +21 -4
  160. data/lib/active_record/querying.rb +40 -23
  161. data/lib/active_record/railtie.rb +113 -74
  162. data/lib/active_record/railties/controller_runtime.rb +30 -35
  163. data/lib/active_record/railties/databases.rake +402 -78
  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 +153 -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 +4 -7
  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 +58 -40
  180. data/lib/active_record/relation/query_attribute.rb +13 -8
  181. data/lib/active_record/relation/query_methods.rb +472 -186
  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 +108 -58
  185. data/lib/active_record/relation.rb +375 -104
  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 -6
  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 +88 -9
  200. data/lib/active_record/suppressor.rb +2 -2
  201. data/lib/active_record/table_metadata.rb +39 -43
  202. data/lib/active_record/tasks/database_tasks.rb +276 -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 +246 -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 +58 -116
  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 +72 -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 +120 -35
  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,1084 +1,1303 @@
1
- ## Rails 5.2.8.1 (July 12, 2022) ##
2
-
3
- * Change ActiveRecord::Coders::YAMLColumn default to safe_load
4
-
5
- This adds two new configuration options The configuration options are as
6
- follows:
7
-
8
- * `config.active_storage.use_yaml_unsafe_load`
9
-
10
- When set to true, this configuration option tells Rails to use the old
11
- "unsafe" YAML loading strategy, maintaining the existing behavior but leaving
12
- the possible escalation vulnerability in place. Setting this option to true
13
- is *not* recommended, but can aid in upgrading.
14
-
15
- * `config.active_record.yaml_column_permitted_classes`
16
-
17
- The "safe YAML" loading method does not allow all classes to be deserialized
18
- by default. This option allows you to specify classes deemed "safe" in your
19
- application. For example, if your application uses Symbol and Time in
20
- serialized data, you can add Symbol and Time to the allowed list as follows:
21
-
22
- ```
23
- config.active_record.yaml_column_permitted_classes = [Symbol, Date, Time]
24
- ```
1
+ ## Rails 6.1.0 (December 09, 2020) ##
25
2
 
26
- [CVE-2022-32224]
3
+ * Only warn about negative enums if a positive form that would cause conflicts exists.
27
4
 
5
+ Fixes #39065.
28
6
 
29
- ## Rails 5.2.8 (May 09, 2022) ##
7
+ *Alex Ghiculescu*
30
8
 
31
- * No changes.
9
+ * Change `attribute_for_inspect` to take `filter_attributes` in consideration.
32
10
 
11
+ *Rafael Mendonça França*
33
12
 
34
- ## Rails 5.2.7.1 (April 26, 2022) ##
13
+ * Fix odd behavior of inverse_of with multiple belongs_to to same class.
35
14
 
36
- * No changes.
15
+ Fixes #35204.
37
16
 
17
+ *Tomoyuki Kai*
38
18
 
39
- ## Rails 5.2.7 (March 10, 2022) ##
19
+ * Build predicate conditions with objects that delegate `#id` and primary key:
40
20
 
41
- * No changes.
21
+ ```ruby
22
+ class AdminAuthor
23
+ delegate_missing_to :@author
42
24
 
25
+ def initialize(author)
26
+ @author = author
27
+ end
28
+ end
43
29
 
44
- ## Rails 5.2.6.3 (March 08, 2022) ##
30
+ Post.where(author: AdminAuthor.new(author))
31
+ ```
45
32
 
46
- * No changes.
33
+ *Sean Doyle*
47
34
 
35
+ * Add `connected_to_many` API.
48
36
 
49
- ## Rails 5.2.6.2 (February 11, 2022) ##
37
+ This API allows applications to connect to multiple databases at once without switching all of them or implementing a deeply nested stack.
50
38
 
51
- * No changes.
39
+ Before:
52
40
 
41
+ AnimalsRecord.connected_to(role: :reading) do
42
+ MealsRecord.connected_to(role: :reading) do
43
+ Dog.first # read from animals replica
44
+ Dinner.first # read from meals replica
45
+ Person.first # read from primary writer
46
+ end
47
+ end
53
48
 
54
- ## Rails 5.2.6.1 (February 11, 2022) ##
49
+ After:
55
50
 
56
- * No changes.
51
+ ActiveRecord::Base.connected_to_many([AnimalsRecord, MealsRecord], role: :reading) do
52
+ Dog.first # read from animals replica
53
+ Dinner.first # read from meals replica
54
+ Person.first # read from primary writer
55
+ end
57
56
 
57
+ *Eileen M. Uchitelle*, *John Crepezzi*
58
58
 
59
- ## Rails 5.2.6 (May 05, 2021) ##
59
+ * Add option to raise or log for `ActiveRecord::StrictLoadingViolationError`.
60
60
 
61
- * No changes.
61
+ Some applications may not want to raise an error in production if using `strict_loading`. This would allow an application to set strict loading to log for the production environment while still raising in development and test environments.
62
62
 
63
+ Set `config.active_record.action_on_strict_loading_violation` to `:log` errors instead of raising.
63
64
 
64
- ## Rails 5.2.5 (March 26, 2021) ##
65
+ *Eileen M. Uchitelle*
65
66
 
66
- * No changes.
67
+ * Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
67
68
 
69
+ Fixes #34255.
68
70
 
69
- ## Rails 5.2.4.6 (May 05, 2021) ##
71
+ *Steven Weber*
70
72
 
71
- * No changes.
73
+ * Optimise the length of index names for polymorphic references by using the reference name rather than the type and id column names.
72
74
 
75
+ Because the default behaviour when adding an index with multiple columns is to use all column names in the index name, this could frequently lead to overly long index names for polymorphic references which would fail the migration if it exceeded the database limit.
73
76
 
74
- ## Rails 5.2.4.5 (February 10, 2021) ##
77
+ This change reduces the chance of that happening by using the reference name, e.g. `index_my_table_on_my_reference`.
75
78
 
76
- * Fix possible DoS vector in PostgreSQL money type
79
+ Fixes #38655.
77
80
 
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.
81
+ *Luke Redpath*
81
82
 
82
- Thanks to @dee-see from Hackerone for this patch!
83
+ * MySQL: Uniqueness validator now respects default database collation,
84
+ no longer enforce case sensitive comparison by default.
83
85
 
84
- [CVE-2021-22880]
86
+ *Ryuta Kamizono*
85
87
 
86
- *Aaron Patterson*
88
+ * Remove deprecated methods from `ActiveRecord::ConnectionAdapters::DatabaseLimits`.
87
89
 
90
+ `column_name_length`
91
+ `table_name_length`
92
+ `columns_per_table`
93
+ `indexes_per_table`
94
+ `columns_per_multicolumn_index`
95
+ `sql_query_length`
96
+ `joins_per_query`
88
97
 
89
- ## Rails 5.2.4.4 (September 09, 2020) ##
98
+ *Rafael Mendonça França*
90
99
 
91
- * No changes.
100
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?`.
92
101
 
102
+ *Rafael Mendonça França*
93
103
 
94
- ## Rails 5.2.4.3 (May 18, 2020) ##
104
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?`.
95
105
 
96
- * No changes.
106
+ *Rafael Mendonça França*
97
107
 
98
- ## Rails 5.2.4.2 (March 19, 2020) ##
108
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?`.
99
109
 
100
- * No changes.
110
+ *Rafael Mendonça França*
101
111
 
112
+ * Remove deprecated `ActiveRecord::Base#update_attributes` and `ActiveRecord::Base#update_attributes!`.
102
113
 
103
- ## Rails 5.2.4.1 (December 18, 2019) ##
114
+ *Rafael Mendonça França*
104
115
 
105
- * No changes.
116
+ * Remove deprecated `migrations_path` argument in `ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version`.
106
117
 
118
+ *Rafael Mendonça França*
107
119
 
108
- ## Rails 5.2.4 (November 27, 2019) ##
120
+ * Remove deprecated `config.active_record.sqlite3.represent_boolean_as_integer`.
109
121
 
110
- * Fix circular `autosave: true` causes invalid records to be saved.
122
+ *Rafael Mendonça França*
111
123
 
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`.
124
+ * `relation.create` does no longer leak scope to class level querying methods
125
+ in initialization block and callbacks.
119
126
 
120
- Fixes #28080.
127
+ Before:
121
128
 
122
- *Larry Reid*
129
+ User.where(name: "John").create do |john|
130
+ User.find_by(name: "David") # => nil
131
+ end
123
132
 
124
- * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
133
+ After:
125
134
 
126
- Fixes #36022.
135
+ User.where(name: "John").create do |john|
136
+ User.find_by(name: "David") # => #<User name: "David", ...>
137
+ end
127
138
 
128
139
  *Ryuta Kamizono*
129
140
 
130
- * Fix sqlite3 collation parsing when using decimal columns.
141
+ * Named scope chain does no longer leak scope to class level querying methods.
131
142
 
132
- *Martin R. Schuster*
133
-
134
- * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
143
+ class User < ActiveRecord::Base
144
+ scope :david, -> { User.where(name: "David") }
145
+ end
135
146
 
136
- Fixes #36465.
147
+ Before:
137
148
 
138
- *Jeff Doering*
149
+ User.where(name: "John").david
150
+ # SELECT * FROM users WHERE name = 'John' AND name = 'David'
139
151
 
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.
152
+ After:
142
153
 
143
- Fixes #33249.
154
+ User.where(name: "John").david
155
+ # SELECT * FROM users WHERE name = 'David'
144
156
 
145
- *Ryan H. Kerr*
157
+ *Ryuta Kamizono*
146
158
 
159
+ * Remove deprecated methods from `ActiveRecord::DatabaseConfigurations`.
147
160
 
148
- ## Rails 5.2.3 (March 27, 2019) ##
161
+ `fetch`
162
+ `each`
163
+ `first`
164
+ `values`
165
+ `[]=`
149
166
 
150
- * Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
167
+ *Rafael Mendonça França*
151
168
 
152
- Fixes #35214.
169
+ * `where.not` now generates NAND predicates instead of NOR.
153
170
 
154
- *Juani Villarejo*
171
+ Before:
155
172
 
156
- * Fix prepared statements caching to be enabled even when query caching is enabled.
173
+ User.where.not(name: "Jon", role: "admin")
174
+ # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
157
175
 
158
- *Ryuta Kamizono*
176
+ After:
159
177
 
160
- * Don't allow `where` with invalid value matches to nil values.
178
+ User.where.not(name: "Jon", role: "admin")
179
+ # SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
161
180
 
162
- Fixes #33624.
181
+ *Rafael Mendonça França*
163
182
 
164
- *Ryuta Kamizono*
183
+ * Remove deprecated `ActiveRecord::Result#to_hash` method.
165
184
 
166
- * Restore an ability that class level `update` without giving ids.
185
+ *Rafael Mendonça França*
167
186
 
168
- Fixes #34743.
187
+ * Deprecate `ActiveRecord::Base.allow_unsafe_raw_sql`.
169
188
 
170
- *Ryuta Kamizono*
189
+ *Rafael Mendonça França*
171
190
 
172
- * Fix join table column quoting with SQLite.
191
+ * Remove deprecated support for using unsafe raw SQL in `ActiveRecord::Relation` methods.
173
192
 
174
- *Gannon McGibbon*
193
+ *Rafael Mendonça França*
175
194
 
176
- * Ensure that `delete_all` on collection proxy returns affected count.
195
+ * Allow users to silence the "Rails couldn't infer whether you are using multiple databases..."
196
+ message using `config.active_record.suppress_multiple_database_warning`.
177
197
 
178
- *Ryuta Kamizono*
198
+ *Omri Gabay*
179
199
 
180
- * Reset scope after delete on collection association to clear stale offsets of removed records.
200
+ * Connections can be granularly switched for abstract classes when `connected_to` is called.
181
201
 
182
- *Gannon McGibbon*
202
+ This change allows `connected_to` to switch a `role` and/or `shard` for a single abstract class instead of all classes globally. Applications that want to use the new feature need to set `config.active_record.legacy_connection_handling` to `false` in their application configuration.
183
203
 
204
+ Example usage:
184
205
 
185
- ## Rails 5.2.2.1 (March 11, 2019) ##
206
+ Given an application we have a `User` model that inherits from `ApplicationRecord` and a `Dog` model that inherits from `AnimalsRecord`. `AnimalsRecord` and `ApplicationRecord` have writing and reading connections as well as shard `default`, `one`, and `two`.
186
207
 
187
- * No changes.
208
+ ```ruby
209
+ ActiveRecord::Base.connected_to(role: :reading) do
210
+ User.first # reads from default replica
211
+ Dog.first # reads from default replica
188
212
 
213
+ AnimalsRecord.connected_to(role: :writing, shard: :one) do
214
+ User.first # reads from default replica
215
+ Dog.first # reads from shard one primary
216
+ end
189
217
 
190
- ## Rails 5.2.2 (December 04, 2018) ##
218
+ User.first # reads from default replica
219
+ Dog.first # reads from default replica
191
220
 
192
- * Do not ignore the scoping with query methods in the scope block.
221
+ ApplicationRecord.connected_to(role: :writing, shard: :two) do
222
+ User.first # reads from shard two primary
223
+ Dog.first # reads from default replica
224
+ end
225
+ end
226
+ ```
193
227
 
194
- *Ryuta Kamizono*
228
+ *Eileen M. Uchitelle*, *John Crepezzi*
195
229
 
196
- * Allow aliased attributes to be used in `#update_columns` and `#update`.
230
+ * Allow double-dash comment syntax when querying read-only databases
197
231
 
198
- *Gannon McGibbon*
232
+ *James Adam*
199
233
 
200
- * Allow spaces in postgres table names.
234
+ * Add `values_at` method.
201
235
 
202
- Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres
203
- adapter.
236
+ Returns an array containing the values associated with the given methods.
204
237
 
205
- *Gannon McGibbon*
238
+ ```ruby
239
+ topic = Topic.first
240
+ topic.values_at(:title, :author_name)
241
+ # => ["Budget", "Jason"]
242
+ ```
206
243
 
207
- * Cached columns_hash fields should be excluded from ResultSet#column_types
244
+ Similar to `Hash#values_at` but on an Active Record instance.
208
245
 
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:
246
+ *Guillaume Briday*
211
247
 
212
- ```ruby
213
- class DeveloperName < ActiveRecord::Type::String
214
- def deserialize(value)
215
- "Developer: #{value}"
216
- end
217
- end
248
+ * Fix `read_attribute_before_type_cast` to consider attribute aliases.
218
249
 
219
- class AttributedDeveloper < ActiveRecord::Base
220
- self.table_name = "developers"
250
+ *Marcelo Lauxen*
221
251
 
222
- attribute :name, DeveloperName.new
252
+ * Support passing record to uniqueness validator `:conditions` callable:
223
253
 
224
- self.ignored_columns += ["name"]
254
+ ```ruby
255
+ class Article < ApplicationRecord
256
+ validates_uniqueness_of :title, conditions: ->(article) {
257
+ published_at = article.published_at
258
+ where(published_at: published_at.beginning_of_year..published_at.end_of_year)
259
+ }
225
260
  end
261
+ ```
262
+
263
+ *Eliot Sykes*
226
264
 
227
- developer = AttributedDeveloper.create
228
- developer.update_column :name, "name"
265
+ * `BatchEnumerator#update_all` and `BatchEnumerator#delete_all` now return the
266
+ total number of rows affected, just like their non-batched counterparts.
229
267
 
230
- loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
231
- puts loaded_developer.name # should be "Developer: name" but it's just "name"
268
+ ```ruby
269
+ Person.in_batches.update_all("first_name = 'Eugene'") # => 42
270
+ Person.in_batches.delete_all # => 42
232
271
  ```
233
272
 
234
- *Dmitry Tsepelev*
273
+ Fixes #40287.
235
274
 
236
- * Values of enum are frozen, raising an error when attempting to modify them.
275
+ *Eugene Kenny*
237
276
 
238
- *Emmanuel Byrd*
277
+ * Add support for PostgreSQL `interval` data type with conversion to
278
+ `ActiveSupport::Duration` when loading records from database and
279
+ serialization to ISO 8601 formatted duration string on save.
280
+ Add support to define a column in migrations and get it in a schema dump.
281
+ Optional column precision is supported.
239
282
 
240
- * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
241
- if the attribute does not exist.
283
+ To use this in 6.1, you need to place the next string to your model file:
242
284
 
243
- *Sean Griffin*
285
+ attribute :duration, :interval
244
286
 
245
- * Do not use prepared statement in queries that have a large number of binds.
287
+ To keep old behavior until 6.2 is released:
246
288
 
247
- *Ryuta Kamizono*
289
+ attribute :duration, :string
248
290
 
249
- * Fix query cache to load before first request.
291
+ Example:
250
292
 
251
- *Eileen M. Uchitelle*
293
+ create_table :events do |t|
294
+ t.string :name
295
+ t.interval :duration
296
+ end
252
297
 
253
- * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
298
+ class Event < ApplicationRecord
299
+ attribute :duration, :interval
300
+ end
254
301
 
255
- Fixes #33056.
302
+ Event.create!(name: 'Rock Fest', duration: 2.days)
303
+ Event.last.duration # => 2 days
304
+ Event.last.duration.iso8601 # => "P2D"
305
+ Event.new(duration: 'P1DT12H3S').duration # => 1 day, 12 hours, and 3 seconds
306
+ Event.new(duration: '1 day') # Unknown value will be ignored and NULL will be written to database
256
307
 
257
- *Federico Martinez*
308
+ *Andrey Novikov*
258
309
 
259
- * Fix duplicated record creation when using nested attributes with `create_with`.
310
+ * Allow associations supporting the `dependent:` key to take `dependent: :destroy_async`.
260
311
 
261
- *Darwin Wu*
312
+ ```ruby
313
+ class Account < ActiveRecord::Base
314
+ belongs_to :supplier, dependent: :destroy_async
315
+ end
316
+ ```
262
317
 
263
- * Fix regression setting children record in parent `before_save` callback.
318
+ `:destroy_async` will enqueue a job to destroy associated records in the background.
264
319
 
265
- *Guo Xiang Tan*
320
+ *DHH*, *George Claghorn*, *Cory Gwin*, *Rafael Mendonça França*, *Adrianna Chang*
266
321
 
267
- * Prevent leaking of user's DB credentials on `rails db:create` failure.
322
+ * Add `SKIP_TEST_DATABASE` environment variable to disable modifying the test database when `rails db:create` and `rails db:drop` are called.
268
323
 
269
- *bogdanvlviv*
324
+ *Jason Schweier*
270
325
 
271
- * Clear mutation tracker before continuing the around callbacks.
326
+ * `connects_to` can only be called on `ActiveRecord::Base` or abstract classes.
272
327
 
273
- *Yuya Tanaka*
328
+ Ensure that `connects_to` can only be called from `ActiveRecord::Base` or abstract classes. This protects the application from opening duplicate or too many connections.
274
329
 
275
- * Prevent deadlocks when waiting for connection from pool.
330
+ *Eileen M. Uchitelle*, *John Crepezzi*
276
331
 
277
- *Brent Wheeldon*
332
+ * All connection adapters `execute` now raises `ActiveRecord::ConnectionNotEstablished` rather than
333
+ `ActiveRecord::StatementInvalid` when they encounter a connection error.
278
334
 
279
- * Avoid extra scoping when using `Relation#update` that was causing this method to change the current scope.
335
+ *Jean Boussier*
280
336
 
281
- *Ryuta Kamizono*
337
+ * `Mysql2Adapter#quote_string` now raises `ActiveRecord::ConnectionNotEstablished` rather than
338
+ `ActiveRecord::StatementInvalid` when it can't connect to the MySQL server.
282
339
 
283
- * Fix numericality validator not to be affected by custom getter.
340
+ *Jean Boussier*
284
341
 
285
- *Ryuta Kamizono*
342
+ * Add support for check constraints that are `NOT VALID` via `validate: false` (PostgreSQL-only).
286
343
 
287
- * Fix bulk change table ignores comment option on PostgreSQL.
344
+ *Alex Robbin*
288
345
 
289
- *Yoshiyuki Kinjo*
346
+ * Ensure the default configuration is considered primary or first for an environment
290
347
 
348
+ If a multiple database application provides a configuration named primary, that will be treated as default. In applications that do not have a primary entry, the default database configuration will be the first configuration for an environment.
291
349
 
292
- ## Rails 5.2.1.1 (November 27, 2018) ##
350
+ *Eileen M. Uchitelle*
293
351
 
294
- * No changes.
352
+ * Allow `where` references association names as joined table name aliases.
295
353
 
354
+ ```ruby
355
+ class Comment < ActiveRecord::Base
356
+ enum label: [:default, :child]
357
+ has_many :children, class_name: "Comment", foreign_key: :parent_id
358
+ end
296
359
 
297
- ## Rails 5.2.1 (August 07, 2018) ##
360
+ # ... FROM comments LEFT OUTER JOIN comments children ON ... WHERE children.label = 1
361
+ Comment.includes(:children).where("children.label": "child")
362
+ ```
298
363
 
299
- * PostgreSQL: Support new relkind for partitioned tables.
364
+ *Ryuta Kamizono*
300
365
 
301
- Fixes #33008.
366
+ * Support storing demodulized class name for polymorphic type.
302
367
 
303
- *Yannick Schutz*
368
+ Before Rails 6.1, storing demodulized class name is supported only for STI type
369
+ by `store_full_sti_class` class attribute.
304
370
 
305
- * Rollback parent transaction when children fails to update.
371
+ Now `store_full_class_name` class attribute can handle both STI and polymorphic types.
306
372
 
307
- *Guillaume Malette*
373
+ *Ryuta Kamizono*
308
374
 
309
- * Fix default value for MySQL time types with specified precision.
375
+ * Deprecate `rails db:structure:{load, dump}` tasks and extend
376
+ `rails db:schema:{load, dump}` tasks to work with either `:ruby` or `:sql` format,
377
+ depending on `config.active_record.schema_format` configuration value.
310
378
 
311
- *Nikolay Kondratyev*
379
+ *fatkodima*
380
+
381
+ * Respect the `select` values for eager loading.
312
382
 
313
- * Fix `touch` option to behave consistently with `Persistence#touch` method.
383
+ ```ruby
384
+ post = Post.select("UPPER(title) AS title").first
385
+ post.title # => "WELCOME TO THE WEBLOG"
386
+ post.body # => ActiveModel::MissingAttributeError
387
+
388
+ # Rails 6.0 (ignore the `select` values)
389
+ post = Post.select("UPPER(title) AS title").eager_load(:comments).first
390
+ post.title # => "Welcome to the weblog"
391
+ post.body # => "Such a lovely day"
392
+
393
+ # Rails 6.1 (respect the `select` values)
394
+ post = Post.select("UPPER(title) AS title").eager_load(:comments).first
395
+ post.title # => "WELCOME TO THE WEBLOG"
396
+ post.body # => ActiveModel::MissingAttributeError
397
+ ```
314
398
 
315
399
  *Ryuta Kamizono*
316
400
 
317
- * Fix `save` in `after_create_commit` won't invoke extra `after_create_commit`.
401
+ * Allow attribute's default to be configured but keeping its own type.
318
402
 
319
- Fixes #32831.
403
+ ```ruby
404
+ class Post < ActiveRecord::Base
405
+ attribute :written_at, default: -> { Time.now.utc }
406
+ end
320
407
 
321
- *Ryuta Kamizono*
408
+ # Rails 6.0
409
+ Post.type_for_attribute(:written_at) # => #<Type::Value ... precision: nil, ...>
322
410
 
323
- * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
411
+ # Rails 6.1
412
+ Post.type_for_attribute(:written_at) # => #<Type::DateTime ... precision: 6, ...>
413
+ ```
324
414
 
325
- *Brian Durand*
415
+ *Ryuta Kamizono*
326
416
 
327
- * Fix parent record should not get saved with duplicate children records.
417
+ * Allow default to be configured for Enum.
328
418
 
329
- Fixes #32940.
419
+ ```ruby
420
+ class Book < ActiveRecord::Base
421
+ enum status: [:proposed, :written, :published], _default: :published
422
+ end
330
423
 
331
- *Santosh Wadghule*
424
+ Book.new.status # => "published"
425
+ ```
332
426
 
333
- * Fix that association's after_touch is not called with counter cache.
427
+ *Ryuta Kamizono*
334
428
 
335
- Fixes #31559.
429
+ * Deprecate YAML loading from legacy format older than Rails 5.0.
336
430
 
337
431
  *Ryuta Kamizono*
338
432
 
339
- * `becomes` should clear the mutation tracker which is created in `after_initialize`.
433
+ * Added the setting `ActiveRecord::Base.immutable_strings_by_default`, which
434
+ allows you to specify that all string columns should be frozen unless
435
+ otherwise specified. This will reduce memory pressure for applications which
436
+ do not generally mutate string properties of Active Record objects.
437
+
438
+ *Sean Griffin*, *Ryuta Kamizono*
340
439
 
341
- Fixes #32867.
440
+ * Deprecate `map!` and `collect!` on `ActiveRecord::Result`.
342
441
 
343
442
  *Ryuta Kamizono*
344
443
 
345
- * Allow a belonging to parent object to be created from a new record.
444
+ * Support `relation.and` for intersection as Set theory.
346
445
 
347
- *Jolyon Pawlyn*
446
+ ```ruby
447
+ david_and_mary = Author.where(id: [david, mary])
448
+ mary_and_bob = Author.where(id: [mary, bob])
348
449
 
349
- * Fix that building record with assigning multiple has_one associations
350
- wrongly persists through record.
450
+ david_and_mary.merge(mary_and_bob) # => [mary, bob]
351
451
 
352
- Fixes #32511.
452
+ david_and_mary.and(mary_and_bob) # => [mary]
453
+ david_and_mary.or(mary_and_bob) # => [david, mary, bob]
454
+ ```
353
455
 
354
- *Sam DeCesare*
456
+ *Ryuta Kamizono*
355
457
 
356
- * Fix relation merging when one of the relations is going to skip the
357
- query cache.
458
+ * Merging conditions on the same column no longer maintain both conditions,
459
+ and will be consistently replaced by the latter condition in Rails 6.2.
460
+ To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
358
461
 
359
- *James Williams*
462
+ ```ruby
463
+ # Rails 6.1 (IN clause is replaced by merger side equality condition)
464
+ Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
360
465
 
466
+ # Rails 6.1 (both conflict conditions exists, deprecated)
467
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
361
468
 
362
- ## Rails 5.2.0 (April 09, 2018) ##
469
+ # Rails 6.1 with rewhere to migrate to Rails 6.2's behavior
470
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
363
471
 
364
- * MySQL: Support mysql2 0.5.x.
472
+ # Rails 6.2 (same behavior with IN clause, mergee side condition is consistently replaced)
473
+ Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
474
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
475
+ ```
365
476
 
366
- *Aaron Stone*
477
+ *Ryuta Kamizono*
367
478
 
368
- * Apply time column precision on assignment.
479
+ * Do not mark Postgresql MAC address and UUID attributes as changed when the assigned value only varies by case.
369
480
 
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.
481
+ *Peter Fry*
373
482
 
374
- Fixes #30301.
483
+ * Resolve issue with insert_all unique_by option when used with expression index.
375
484
 
376
- *Andrew White*
485
+ When the `:unique_by` option of `ActiveRecord::Persistence.insert_all` and
486
+ `ActiveRecord::Persistence.upsert_all` was used with the name of an expression index, an error
487
+ was raised. Adding a guard around the formatting behavior for the `:unique_by` corrects this.
377
488
 
378
- * Normalize time column values for SQLite database.
489
+ Usage:
379
490
 
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.
491
+ ```ruby
492
+ create_table :books, id: :integer, force: true do |t|
493
+ t.column :name, :string
494
+ t.index "lower(name)", unique: true
495
+ end
384
496
 
385
- *Andrew White*
497
+ Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
498
+ ```
386
499
 
387
- * Ensure that the date component is removed when quoting times.
500
+ Fixes #39516.
388
501
 
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.
502
+ *Austen Madden*
392
503
 
393
- *Andrew White*
504
+ * Add basic support for CHECK constraints to database migrations.
394
505
 
395
- * Fix `dependent: :destroy` issue for has_one/belongs_to relationship where
396
- the parent class was getting deleted when the child was not.
506
+ Usage:
397
507
 
398
- Fixes #32022.
508
+ ```ruby
509
+ add_check_constraint :products, "price > 0", name: "price_check"
510
+ remove_check_constraint :products, name: "price_check"
511
+ ```
399
512
 
400
- *Fernando Gorodscy*
513
+ *fatkodima*
401
514
 
402
- * Whitelist `NULLS FIRST` and `NULLS LAST` in order clauses too.
515
+ * Add `ActiveRecord::Base.strict_loading_by_default` and `ActiveRecord::Base.strict_loading_by_default=`
516
+ to enable/disable strict_loading mode by default for a model. The configuration's value is
517
+ inheritable by subclasses, but they can override that value and it will not impact parent class.
403
518
 
404
- *Xavier Noria*
519
+ Usage:
405
520
 
406
- * Fix that after commit callbacks on update does not triggered when optimistic locking is enabled.
521
+ ```ruby
522
+ class Developer < ApplicationRecord
523
+ self.strict_loading_by_default = true
407
524
 
408
- *Ryuta Kamizono*
525
+ has_many :projects
526
+ end
409
527
 
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.
528
+ dev = Developer.first
529
+ dev.projects.first
530
+ # => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.
531
+ ```
413
532
 
414
- Fixes #28364.
533
+ *bogdanvlviv*
415
534
 
416
- *Takumi Kagiyama*
535
+ * Deprecate passing an Active Record object to `quote`/`type_cast` directly.
417
536
 
418
- * Make `reflection.klass` raise if `polymorphic?` not to be misused.
537
+ *Ryuta Kamizono*
419
538
 
420
- Fixes #31876.
539
+ * Default engine `ENGINE=InnoDB` is no longer dumped to make schema more agnostic.
421
540
 
422
- *Ryuta Kamizono*
541
+ Before:
423
542
 
424
- * PostgreSQL: Allow pg-1.0 gem to be used with Active Record.
543
+ ```ruby
544
+ create_table "accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
545
+ end
546
+ ```
425
547
 
426
- *Lars Kanis*
548
+ After:
427
549
 
428
- * Deprecate `expand_hash_conditions_for_aggregates` without replacement.
429
- Using a `Relation` for performing queries is the prefered API.
550
+ ```ruby
551
+ create_table "accounts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
552
+ end
553
+ ```
430
554
 
431
555
  *Ryuta Kamizono*
432
556
 
433
- * Fix not expanded problem when passing an Array object as argument to the where method using `composed_of` column.
557
+ * Added delegated type as an alternative to single-table inheritance for representing class hierarchies.
558
+ See ActiveRecord::DelegatedType for the full description.
434
559
 
435
- ```
436
- david_balance = customers(:david).balance
437
- Customer.where(balance: [david_balance]).to_sql
560
+ *DHH*
561
+
562
+ * Deprecate aggregations with group by duplicated fields.
563
+
564
+ To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
438
565
 
439
- # Before: WHERE `customers`.`balance` = NULL
440
- # After : WHERE `customers`.`balance` = 50
566
+ ```ruby
567
+ accounts = Account.group(:firm_id)
568
+
569
+ # duplicated group fields, deprecated.
570
+ accounts.merge(accounts.where.not(credit_limit: nil)).sum(:credit_limit)
571
+ # => {
572
+ # [1, 1] => 50,
573
+ # [2, 2] => 60
574
+ # }
575
+
576
+ # use `uniq!(:group)` to deduplicate group fields.
577
+ accounts.merge(accounts.where.not(credit_limit: nil)).uniq!(:group).sum(:credit_limit)
578
+ # => {
579
+ # 1 => 50,
580
+ # 2 => 60
581
+ # }
441
582
  ```
442
583
 
443
- Fixes #31723.
584
+ *Ryuta Kamizono*
444
585
 
445
- *Yutaro Kanagawa*
586
+ * Deprecate duplicated query annotations.
446
587
 
447
- * Fix `count(:all)` with eager loading and having an order other than the driving table.
588
+ To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
448
589
 
449
- Fixes #31783.
590
+ ```ruby
591
+ accounts = Account.where(id: [1, 2]).annotate("david and mary")
592
+
593
+ # duplicated annotations, deprecated.
594
+ accounts.merge(accounts.rewhere(id: 3))
595
+ # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */ /* david and mary */
596
+
597
+ # use `uniq!(:annotate)` to deduplicate annotations.
598
+ accounts.merge(accounts.rewhere(id: 3)).uniq!(:annotate)
599
+ # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */
600
+ ```
450
601
 
451
602
  *Ryuta Kamizono*
452
603
 
453
- * Clear the transaction state when an Active Record object is duped.
604
+ * Resolve conflict between counter cache and optimistic locking.
454
605
 
455
- Fixes #31670.
606
+ Bump an Active Record instance's lock version after updating its counter
607
+ cache. This avoids raising an unnecessary `ActiveRecord::StaleObjectError`
608
+ upon subsequent transactions by maintaining parity with the corresponding
609
+ database record's `lock_version` column.
456
610
 
457
- *Yuriy Ustushenko*
611
+ Fixes #16449.
458
612
 
459
- * Support for PostgreSQL foreign tables.
613
+ *Aaron Lipman*
460
614
 
461
- *fatkodima*
615
+ * Support merging option `:rewhere` to allow mergee side condition to be replaced exactly.
462
616
 
463
- * Fix relation merger issue with `left_outer_joins`.
617
+ ```ruby
618
+ david_and_mary = Author.where(id: david.id..mary.id)
464
619
 
465
- *Mehmet Emin İNAÇ*
620
+ # both conflict conditions exists
621
+ david_and_mary.merge(Author.where(id: bob)) # => []
466
622
 
467
- * Don't allow destroyed object mutation after `save` or `save!` is called.
623
+ # mergee side condition is replaced by rewhere
624
+ david_and_mary.merge(Author.rewhere(id: bob)) # => [bob]
625
+
626
+ # mergee side condition is replaced by rewhere option
627
+ david_and_mary.merge(Author.where(id: bob), rewhere: true) # => [bob]
628
+ ```
468
629
 
469
630
  *Ryuta Kamizono*
470
631
 
471
- * Take into account association conditions when deleting through records.
632
+ * Add support for finding records based on signed ids, which are tamper-proof, verified ids that can be
633
+ set to expire and scoped with a purpose. This is particularly useful for things like password reset
634
+ or email verification, where you want the bearer of the signed id to be able to interact with the
635
+ underlying record, but usually only within a certain time period.
472
636
 
473
- Fixes #18424.
637
+ ```ruby
638
+ signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset
474
639
 
475
- *Piotr Jakubowski*
640
+ User.find_signed signed_id # => nil, since the purpose does not match
476
641
 
477
- * Fix nested `has_many :through` associations on unpersisted parent instances.
642
+ travel 16.minutes
643
+ User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired
478
644
 
479
- For example, if you have
645
+ travel_back
646
+ User.find_signed signed_id, purpose: :password_reset # => User.first
480
647
 
481
- class Post < ActiveRecord::Base
482
- belongs_to :author
483
- has_many :books, through: :author
484
- has_many :subscriptions, through: :books
485
- end
648
+ User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
649
+ ```
486
650
 
487
- class Author < ActiveRecord::Base
488
- has_one :post
489
- has_many :books
490
- has_many :subscriptions, through: :books
491
- end
651
+ *DHH*
492
652
 
493
- class Book < ActiveRecord::Base
494
- belongs_to :author
495
- has_many :subscriptions
496
- end
653
+ * Support `ALGORITHM = INSTANT` DDL option for index operations on MySQL.
497
654
 
498
- class Subscription < ActiveRecord::Base
499
- belongs_to :book
500
- end
655
+ *Ryuta Kamizono*
501
656
 
502
- Before:
657
+ * Fix index creation to preserve index comment in bulk change table on MySQL.
503
658
 
504
- If `post` is not persisted, then `post.subscriptions` will be empty.
659
+ *Ryuta Kamizono*
505
660
 
506
- After:
661
+ * Allow `unscope` to be aware of table name qualified values.
507
662
 
508
- If `post` is not persisted, then `post.subscriptions` can be set and used
509
- just like it would if `post` were persisted.
663
+ It is possible to unscope only the column in the specified table.
510
664
 
511
- Fixes #16313.
665
+ ```ruby
666
+ posts = Post.joins(:comments).group(:"posts.hidden")
667
+ posts = posts.where("posts.hidden": false, "comments.hidden": false)
512
668
 
513
- *Zoltan Kiss*
669
+ posts.count
670
+ # => { false => 10 }
514
671
 
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)`.
672
+ # unscope both hidden columns
673
+ posts.unscope(where: :hidden).count
674
+ # => { false => 11, true => 1 }
518
675
 
519
- Fixes #23979.
676
+ # unscope only comments.hidden column
677
+ posts.unscope(where: :"comments.hidden").count
678
+ # => { false => 11 }
679
+ ```
520
680
 
521
- *Brian Christian*
681
+ *Ryuta Kamizono*, *Slava Korolev*
522
682
 
523
- * Use `count(:all)` in `HasManyAssociation#count_records` to prevent invalid
524
- SQL queries for association counting.
683
+ * Fix `rewhere` to truly overwrite collided where clause by new where clause.
525
684
 
526
- *Klas Eskilson*
685
+ ```ruby
686
+ steve = Person.find_by(name: "Steve")
687
+ david = Author.find_by(name: "David")
527
688
 
528
- * Fix to invoke callbacks when using `update_attribute`.
689
+ relation = Essay.where(writer: steve)
529
690
 
530
- *Mike Busch*
691
+ # Before
692
+ relation.rewhere(writer: david).to_a # => []
531
693
 
532
- * Fix `count(:all)` to correctly work `distinct` with custom SELECT list.
694
+ # After
695
+ relation.rewhere(writer: david).to_a # => [david]
696
+ ```
533
697
 
534
698
  *Ryuta Kamizono*
535
699
 
536
- * Using subselect for `delete_all` with `limit` or `offset`.
700
+ * Inspect time attributes with subsec and time zone offset.
701
+
702
+ ```ruby
703
+ p Knot.create
704
+ => #<Knot id: 1, created_at: "2016-05-05 01:29:47.116928000 +0000">
705
+ ```
706
+
707
+ *akinomaeni*, *Jonathan Hefner*
708
+
709
+ * Deprecate passing a column to `type_cast`.
537
710
 
538
711
  *Ryuta Kamizono*
539
712
 
540
- * Undefine attribute methods on descendants when resetting column
541
- information.
713
+ * Deprecate `in_clause_length` and `allowed_index_name_length` in `DatabaseLimits`.
542
714
 
543
- *Chris Salzberg*
715
+ *Ryuta Kamizono*
544
716
 
545
- * Log database query callers.
717
+ * Support bulk insert/upsert on relation to preserve scope values.
546
718
 
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.
719
+ *Josef Šimánek*, *Ryuta Kamizono*
550
720
 
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.
721
+ * Preserve column comment value on changing column name on MySQL.
554
722
 
555
- *Olivier Lacan*
723
+ *Islam Taha*
556
724
 
557
- * Fix conflicts `counter_cache` with `touch: true` by optimistic locking.
725
+ * Add support for `if_exists` option for removing an index.
558
726
 
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
727
+ The `remove_index` method can take an `if_exists` option. If this is set to true an error won't be raised if the index doesn't exist.
567
728
 
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
- ```
729
+ *Eileen M. Uchitelle*
575
730
 
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
- ```
731
+ * Remove ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base.
608
732
 
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
- ```
733
+ *Ryuta Kamizono*
635
734
 
636
- Fixes #31199.
735
+ * Prevent `build_association` from `touching` a parent record if the record isn't persisted for `has_one` associations.
637
736
 
638
- *bogdanvlviv*
737
+ Fixes #38219.
639
738
 
640
- * Add support for PostgreSQL operator classes to `add_index`.
739
+ *Josh Brody*
641
740
 
642
- Example:
741
+ * Add support for `if_not_exists` option for adding index.
643
742
 
644
- add_index :users, :name, using: :gist, opclass: { name: :gist_trgm_ops }
743
+ The `add_index` method respects `if_not_exists` option. If it is set to true
744
+ index won't be added.
645
745
 
646
- *Greg Navis*
746
+ Usage:
647
747
 
648
- * Don't allow scopes to be defined which conflict with instance methods on `Relation`.
748
+ ```ruby
749
+ add_index :users, :account_id, if_not_exists: true
750
+ ```
649
751
 
650
- Fixes #31120.
752
+ The `if_not_exists` option passed to `create_table` also gets propagated to indexes
753
+ created within that migration so that if table and its indexes exist then there is no
754
+ attempt to create them again.
651
755
 
652
- *kinnrot*
756
+ *Prathamesh Sonpatki*
653
757
 
654
- * Add new error class `QueryCanceled` which will be raised
655
- when canceling statement due to user request.
758
+ * Add `ActiveRecord::Base#previously_new_record?` to show if a record was new before the last save.
656
759
 
657
- *Ryuta Kamizono*
760
+ *Tom Ward*
658
761
 
659
- * Add `#up_only` to database migrations for code that is only relevant when
660
- migrating up, e.g. populating a new column.
762
+ * Support descending order for `find_each`, `find_in_batches`, and `in_batches`.
661
763
 
662
- *Rich Daley*
764
+ Batch processing methods allow you to work with the records in batches, greatly reducing memory consumption, but records are always batched from oldest id to newest.
663
765
 
664
- * Require raw SQL fragments to be explicitly marked when used in
665
- relation query methods.
766
+ This change allows reversing the order, batching from newest to oldest. This is useful when you need to process newer batches of records first.
666
767
 
667
- Before:
668
- ```
669
- Article.order("LENGTH(title)")
670
- ```
768
+ Pass `order: :desc` to yield batches in descending order. The default remains `order: :asc`.
671
769
 
672
- After:
673
- ```
674
- Article.order(Arel.sql("LENGTH(title)"))
770
+ ```ruby
771
+ Person.find_each(order: :desc) do |person|
772
+ person.party_all_night!
773
+ end
675
774
  ```
676
775
 
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.
776
+ *Alexey Vasiliev*
680
777
 
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`.
778
+ * Fix `insert_all` with enum values.
685
779
 
686
- Common and judged-safe string values (such as simple column
687
- references) are unaffected:
688
- ```
689
- Article.order("title DESC")
690
- ```
780
+ Fixes #38716.
691
781
 
692
- *Ben Toews*
782
+ *Joel Blum*
693
783
 
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.
784
+ * Add support for `db:rollback:name` for multiple database applications.
697
785
 
698
- *Sean Griffin*
786
+ Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
699
787
 
700
- * Add new error class `StatementTimeout` which will be raised
701
- when statement timeout exceeded.
788
+ *Eileen M. Uchitelle*
702
789
 
703
- *Ryuta Kamizono*
790
+ * `Relation#pick` now uses already loaded results instead of making another query.
704
791
 
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.
792
+ *Eugene Kenny*
710
793
 
711
- *bogdanvlviv*
794
+ * Deprecate using `return`, `break` or `throw` to exit a transaction block after writes.
712
795
 
713
- * Fixed a bug where column orders for an index weren't written to
714
- `db/schema.rb` when using the sqlite adapter.
796
+ *Dylan Thacker-Smith*
715
797
 
716
- Fixes #30902.
798
+ * Dump the schema or structure of a database when calling `db:migrate:name`.
717
799
 
718
- *Paul Kuruvilla*
800
+ In previous versions of Rails, `rails db:migrate` would dump the schema of the database. In Rails 6, that holds true (`rails db:migrate` dumps all databases' schemas), but `rails db:migrate:name` does not share that behavior.
719
801
 
720
- * Remove deprecated method `#sanitize_conditions`.
802
+ Going forward, calls to `rails db:migrate:name` will dump the schema (or structure) of the database being migrated.
721
803
 
722
- *Rafael Mendonça França*
804
+ *Kyle Thompson*
723
805
 
724
- * Remove deprecated method `#scope_chain`.
806
+ * Reset the `ActiveRecord::Base` connection after `rails db:migrate:name`.
725
807
 
726
- *Rafael Mendonça França*
808
+ When `rails db:migrate` has finished, it ensures the `ActiveRecord::Base` connection is reset to its original configuration. Going forward, `rails db:migrate:name` will have the same behavior.
727
809
 
728
- * Remove deprecated configuration `.error_on_ignored_order_or_limit`.
810
+ *Kyle Thompson*
729
811
 
730
- *Rafael Mendonça França*
812
+ * Disallow calling `connected_to` on subclasses of `ActiveRecord::Base`.
731
813
 
732
- * Remove deprecated arguments from `#verify!`.
814
+ Behavior has not changed here but the previous API could be misleading to people who thought it would switch connections for only that class. `connected_to` switches the context from which we are getting connections, not the connections themselves.
733
815
 
734
- *Rafael Mendonça França*
816
+ *Eileen M. Uchitelle*, *John Crepezzi*
735
817
 
736
- * Remove deprecated argument `name` from `#indexes`.
818
+ * Add support for horizontal sharding to `connects_to` and `connected_to`.
737
819
 
738
- *Rafael Mendonça França*
820
+ Applications can now connect to multiple shards and switch between their shards in an application. Note that the shard swapping is still a manual process as this change does not include an API for automatic shard swapping.
739
821
 
740
- * Remove deprecated method `ActiveRecord::Migrator.schema_migrations_table_name`.
822
+ Usage:
741
823
 
742
- *Rafael Mendonça França*
824
+ Given the following configuration:
743
825
 
744
- * Remove deprecated method `supports_primary_key?`.
826
+ ```yaml
827
+ # config/database.yml
828
+ production:
829
+ primary:
830
+ database: my_database
831
+ primary_shard_one:
832
+ database: my_database_shard_one
833
+ ```
745
834
 
746
- *Rafael Mendonça França*
835
+ Connect to multiple shards:
747
836
 
748
- * Remove deprecated method `supports_migrations?`.
837
+ ```ruby
838
+ class ApplicationRecord < ActiveRecord::Base
839
+ self.abstract_class = true
749
840
 
750
- *Rafael Mendonça França*
841
+ connects_to shards: {
842
+ default: { writing: :primary },
843
+ shard_one: { writing: :primary_shard_one }
844
+ }
845
+ ```
751
846
 
752
- * Remove deprecated methods `initialize_schema_migrations_table` and `initialize_internal_metadata_table`.
847
+ Swap between shards in your controller / model code:
753
848
 
754
- *Rafael Mendonça França*
849
+ ```ruby
850
+ ActiveRecord::Base.connected_to(shard: :shard_one) do
851
+ # Read from shard one
852
+ end
853
+ ```
755
854
 
756
- * Raises when calling `lock!` in a dirty record.
855
+ The horizontal sharding API also supports read replicas. See guides for more details.
757
856
 
758
- *Rafael Mendonça França*
857
+ *Eileen M. Uchitelle*, *John Crepezzi*
759
858
 
760
- * Remove deprecated support to passing a class to `:class_name` on associations.
859
+ * Deprecate `spec_name` in favor of `name` on database configurations.
761
860
 
762
- *Rafael Mendonça França*
861
+ The accessors for `spec_name` on `configs_for` and `DatabaseConfig` are deprecated. Please use `name` instead.
763
862
 
764
- * Remove deprecated argument `default` from `index_name_exists?`.
863
+ Deprecated behavior:
765
864
 
766
- *Rafael Mendonça França*
865
+ ```ruby
866
+ db_config = ActiveRecord::Base.configs_for(env_name: "development", spec_name: "primary")
867
+ db_config.spec_name
868
+ ```
767
869
 
768
- * Remove deprecated support to `quoted_id` when typecasting an Active Record object.
870
+ New behavior:
769
871
 
770
- *Rafael Mendonça França*
872
+ ```ruby
873
+ db_config = ActiveRecord::Base.configs_for(env_name: "development", name: "primary")
874
+ db_config.name
875
+ ```
771
876
 
772
- * Fix `bin/rails db:setup` and `bin/rails db:test:prepare` create wrong
773
- ar_internal_metadata's data for a test database.
877
+ *Eileen M. Uchitelle*
878
+
879
+ * Add additional database-specific rake tasks for multi-database users.
880
+
881
+ Previously, `rails db:create`, `rails db:drop`, and `rails db:migrate` were the only rails tasks that could operate on a single
882
+ database. For example:
774
883
 
775
- Before:
776
884
  ```
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
885
+ rails db:create
886
+ rails db:create:primary
887
+ rails db:create:animals
888
+ rails db:drop
889
+ rails db:drop:primary
890
+ rails db:drop:animals
891
+ rails db:migrate
892
+ rails db:migrate:primary
893
+ rails db:migrate:animals
781
894
  ```
782
895
 
783
- After:
896
+ With these changes, `rails db:schema:dump`, `rails db:schema:load`, `rails db:structure:dump`, `rails db:structure:load` and
897
+ `rails db:test:prepare` can additionally operate on a single database. For example:
898
+
784
899
  ```
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
900
+ rails db:schema:dump
901
+ rails db:schema:dump:primary
902
+ rails db:schema:dump:animals
903
+ rails db:schema:load
904
+ rails db:schema:load:primary
905
+ rails db:schema:load:animals
906
+ rails db:structure:dump
907
+ rails db:structure:dump:primary
908
+ rails db:structure:dump:animals
909
+ rails db:structure:load
910
+ rails db:structure:load:primary
911
+ rails db:structure:load:animals
912
+ rails db:test:prepare
913
+ rails db:test:prepare:primary
914
+ rails db:test:prepare:animals
789
915
  ```
790
916
 
791
- Fixes #26731.
917
+ *Kyle Thompson*
792
918
 
793
- *bogdanvlviv*
919
+ * Add support for `strict_loading` mode on association declarations.
794
920
 
795
- * Fix longer sequence name detection for serial columns.
921
+ Raise an error if attempting to load a record from an association that has been marked as `strict_loading` unless it was explicitly eager loaded.
796
922
 
797
- Fixes #28332.
923
+ Usage:
798
924
 
799
- *Ryuta Kamizono*
925
+ ```ruby
926
+ class Developer < ApplicationRecord
927
+ has_many :projects, strict_loading: true
928
+ end
800
929
 
801
- * MySQL: Don't lose `auto_increment: true` in the `db/schema.rb`.
930
+ dev = Developer.first
931
+ dev.projects.first
932
+ # => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.
933
+ ```
802
934
 
803
- Fixes #30894.
935
+ *Kevin Deisz*
804
936
 
805
- *Ryuta Kamizono*
937
+ * Add support for `strict_loading` mode to prevent lazy loading of records.
806
938
 
807
- * Fix `COUNT(DISTINCT ...)` for `GROUP BY` with `ORDER BY` and `LIMIT`.
939
+ Raise an error if a parent record is marked as `strict_loading` and attempts to lazily load its associations. This is useful for finding places you may want to preload an association and avoid additional queries.
808
940
 
809
- Fixes #30886.
941
+ Usage:
810
942
 
811
- *Ryuta Kamizono*
943
+ ```ruby
944
+ dev = Developer.strict_loading.first
945
+ dev.audit_logs.to_a
946
+ # => ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.
947
+ ```
812
948
 
813
- * PostgreSQL `tsrange` now preserves subsecond precision.
949
+ *Eileen M. Uchitelle*, *Aaron Patterson*
814
950
 
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:
951
+ * Add support for PostgreSQL 11+ partitioned indexes when using `upsert_all`.
820
952
 
821
- Before:
953
+ *Sebastián Palma*
822
954
 
823
- connection.type_cast(tsrange.serialize(range_value))
824
- # => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
955
+ * Adds support for `if_not_exists` to `add_column` and `if_exists` to `remove_column`.
825
956
 
826
- Now:
957
+ Applications can set their migrations to ignore exceptions raised when adding a column that already exists or when removing a column that does not exist.
827
958
 
828
- connection.type_cast(tsrange.serialize(range_value))
829
- # => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
959
+ Example Usage:
830
960
 
831
- *Thomas Cannon*
961
+ ```ruby
962
+ class AddColumnTitle < ActiveRecord::Migration[6.1]
963
+ def change
964
+ add_column :posts, :title, :string, if_not_exists: true
965
+ end
966
+ end
967
+ ```
832
968
 
833
- * Passing a `Set` to `Relation#where` now behaves the same as passing an
834
- array.
969
+ ```ruby
970
+ class RemoveColumnTitle < ActiveRecord::Migration[6.1]
971
+ def change
972
+ remove_column :posts, :title, if_exists: true
973
+ end
974
+ end
975
+ ```
835
976
 
836
- *Sean Griffin*
977
+ *Eileen M. Uchitelle*
837
978
 
838
- * Use given algorithm while removing index from database.
979
+ * Regexp-escape table name for MS SQL Server.
839
980
 
840
- Fixes #24190.
981
+ Add `Regexp.escape` to one method in ActiveRecord, so that table names with regular expression characters in them work as expected. Since MS SQL Server uses "[" and "]" to quote table and column names, and those characters are regular expression characters, methods like `pluck` and `select` fail in certain cases when used with the MS SQL Server adapter.
841
982
 
842
- *Mehmet Emin İNAÇ*
983
+ *Larry Reid*
843
984
 
844
- * Update payload names for `sql.active_record` instrumentation to be
845
- more descriptive.
985
+ * Store advisory locks on their own named connection.
846
986
 
847
- Fixes #30586.
987
+ Previously advisory locks were taken out against a connection when a migration started. This works fine in single database applications but doesn't work well when migrations need to open new connections which results in the lock getting dropped.
848
988
 
849
- *Jeremy Green*
989
+ In order to fix this we are storing the advisory lock on a new connection with the connection specification name `AdvisoryLockBase`. The caveat is that we need to maintain at least 2 connections to a database while migrations are running in order to do this.
850
990
 
851
- * Add new error class `LockWaitTimeout` which will be raised
852
- when lock wait timeout exceeded.
991
+ *Eileen M. Uchitelle*, *John Crepezzi*
853
992
 
854
- *Gabriel Courtemanche*
993
+ * Allow schema cache path to be defined in the database configuration file.
855
994
 
856
- * Remove deprecated `#migration_keys`.
995
+ For example:
857
996
 
858
- *Ryuta Kamizono*
997
+ ```yaml
998
+ development:
999
+ adapter: postgresql
1000
+ database: blog_development
1001
+ pool: 5
1002
+ schema_cache_path: tmp/schema/main.yml
1003
+ ```
859
1004
 
860
- * Automatically guess the inverse associations for STI.
1005
+ *Katrina Owen*
861
1006
 
862
- *Yuichiro Kaneko*
1007
+ * Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
863
1008
 
864
- * Ensure `sum` honors `distinct` on `has_many :through` associations.
1009
+ `#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in 6.2.
865
1010
 
866
- Fixes #16791.
1011
+ *Eileen M. Uchitelle*, *John Crepezzi*
867
1012
 
868
- *Aaron Wortham*
1013
+ * Deprecate `#default_hash` and it's alias `#[]` on database configurations.
869
1014
 
870
- * Add `binary` fixture helper method.
1015
+ Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
871
1016
 
872
- *Atsushi Yoshida*
1017
+ *Eileen M. Uchitelle*, *John Crepezzi*
873
1018
 
874
- * When using `Relation#or`, extract the common conditions and put them before the OR condition.
1019
+ * Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
875
1020
 
876
- *Maxime Handfield Lapointe*
1021
+ *Gannon McGibbon*
877
1022
 
878
- * `Relation#or` now accepts two relations who have different values for
879
- `references` only, as `references` can be implicitly called by `where`.
1023
+ * Find orphans by looking for missing relations through chaining `where.missing`:
880
1024
 
881
- Fixes #29411.
1025
+ Before:
882
1026
 
883
- *Sean Griffin*
1027
+ ```ruby
1028
+ Post.left_joins(:author).where(authors: { id: nil })
1029
+ ```
884
1030
 
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`.
1031
+ After:
887
1032
 
888
- *Lisa Ugray*
1033
+ ```ruby
1034
+ Post.where.missing(:author)
1035
+ ```
889
1036
 
890
- * Fix `COUNT(DISTINCT ...)` with `ORDER BY` and `LIMIT` to keep the existing select list.
1037
+ *Tom Rossi*
891
1038
 
892
- *Ryuta Kamizono*
1039
+ * Ensure `:reading` connections always raise if a write is attempted.
893
1040
 
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.
1041
+ Now Rails will raise an `ActiveRecord::ReadOnlyError` if any connection on the reading handler attempts to make a write. If your reading role needs to write you should name the role something other than `:reading`.
897
1042
 
898
- *Lisa Ugray*
1043
+ *Eileen M. Uchitelle*
899
1044
 
900
- * Fix `unscoped(where: [columns])` removing the wrong bind values.
1045
+ * Deprecate `"primary"` as the `connection_specification_name` for `ActiveRecord::Base`.
901
1046
 
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)
1047
+ `"primary"` has been deprecated as the `connection_specification_name` for `ActiveRecord::Base` in favor of using `"ActiveRecord::Base"`. This change affects calls to `ActiveRecord::Base.connection_handler.retrieve_connection` and `ActiveRecord::Base.connection_handler.remove_connection`. If you're calling these methods with `"primary"`, please switch to `"ActiveRecord::Base"`.
904
1048
 
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)
1049
+ *Eileen M. Uchitelle*, *John Crepezzi*
1050
+
1051
+ * Add `ActiveRecord::Validations::NumericalityValidator` with
1052
+ support for casting floats using a database columns' precision value.
1053
+
1054
+ *Gannon McGibbon*
1055
+
1056
+ * Enforce fresh ETag header after a collection's contents change by adding
1057
+ ActiveRecord::Relation#cache_key_with_version. This method will be used by
1058
+ ActionController::ConditionalGet to ensure that when collection cache versioning
1059
+ is enabled, requests using ConditionalGet don't return the same ETag header
1060
+ after a collection is modified.
1061
+
1062
+ Fixes #38078.
1063
+
1064
+ *Aaron Lipman*
1065
+
1066
+ * Skip test database when running `db:create` or `db:drop` in development
1067
+ with `DATABASE_URL` set.
1068
+
1069
+ *Brian Buchalter*
1070
+
1071
+ * Don't allow mutations on the database configurations hash.
1072
+
1073
+ Freeze the configurations hash to disallow directly changing it. If applications need to change the hash, for example to create databases for parallelization, they should use the `DatabaseConfig` object directly.
1074
+
1075
+ Before:
1076
+
1077
+ ```ruby
1078
+ @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
1079
+ @db_config.configuration_hash.merge!(idle_timeout: "0.02")
911
1080
  ```
912
1081
 
913
- *Maxime Handfield Lapointe*
1082
+ After:
914
1083
 
915
- * Values constructed using multi-parameter assignment will now use the
916
- post-type-cast value for rendering in single-field form inputs.
1084
+ ```ruby
1085
+ @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
1086
+ config = @db_config.configuration_hash.merge(idle_timeout: "0.02")
1087
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(@db_config.env_name, @db_config.spec_name, config)
1088
+ ```
917
1089
 
918
- *Sean Griffin*
1090
+ *Eileen M. Uchitelle*, *John Crepezzi*
919
1091
 
920
- * `Relation#joins` is no longer affected by the target model's
921
- `current_scope`, with the exception of `unscoped`.
1092
+ * Remove `:connection_id` from the `sql.active_record` notification.
922
1093
 
923
- Fixes #29338.
1094
+ *Aaron Patterson*, *Rafael Mendonça França*
924
1095
 
925
- *Sean Griffin*
1096
+ * The `:name` key will no longer be returned as part of `DatabaseConfig#configuration_hash`. Please use `DatabaseConfig#owner_name` instead.
926
1097
 
927
- * Change sqlite3 boolean serialization to use 1 and 0.
1098
+ *Eileen M. Uchitelle*, *John Crepezzi*
928
1099
 
929
- SQLite natively recognizes 1 and 0 as true and false, but does not natively
930
- recognize 't' and 'f' as was previously serialized.
1100
+ * ActiveRecord's `belongs_to_required_by_default` flag can now be set per model.
931
1101
 
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.
1102
+ You can now opt-out/opt-in specific models from having their associations required
1103
+ by default.
935
1104
 
936
- *Lisa Ugray*
1105
+ This change is meant to ease the process of migrating all your models to have
1106
+ their association required.
937
1107
 
938
- * Skip query caching when working with batches of records (`find_each`, `find_in_batches`,
939
- `in_batches`).
1108
+ *Edouard Chin*
940
1109
 
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.
1110
+ * The `connection_config` method has been deprecated, please use `connection_db_config` instead which will return a `DatabaseConfigurations::DatabaseConfig` instead of a `Hash`.
943
1111
 
944
- *Eugene Kenny*
1112
+ *Eileen M. Uchitelle*, *John Crepezzi*
945
1113
 
946
- * Prevent errors raised by `sql.active_record` notification subscribers from being converted into
947
- `ActiveRecord::StatementInvalid` exceptions.
1114
+ * Retain explicit selections on the base model after applying `includes` and `joins`.
948
1115
 
949
- *Dennis Taylor*
1116
+ Resolves #34889.
950
1117
 
951
- * Fix eager loading/preloading association with scope including joins.
1118
+ *Patrick Rebsch*
952
1119
 
953
- Fixes #28324.
1120
+ * The `database` kwarg is deprecated without replacement because it can't be used for sharding and creates an issue if it's used during a request. Applications that need to create new connections should use `connects_to` instead.
954
1121
 
955
- *Ryuta Kamizono*
1122
+ *Eileen M. Uchitelle*, *John Crepezzi*
956
1123
 
957
- * Fix transactions to apply state to child transactions.
1124
+ * Allow attributes to be fetched from Arel node groupings.
958
1125
 
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.
1126
+ *Jeff Emminger*, *Gannon McGibbon*
961
1127
 
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.
1128
+ * A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgreSQL `options`.
964
1129
 
965
- *Eileen M. Uchitelle*, *Aaron Patterson*
1130
+ *Joshua Flanagan*
966
1131
 
967
- * Deprecate `set_state` method in `TransactionState`.
1132
+ * Calling methods like `establish_connection` with a `Hash` which is invalid (eg: no `adapter`) will now raise an error the same way as connections defined in `config/database.yml`.
968
1133
 
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)`.
1134
+ *John Crepezzi*
972
1135
 
973
- *Eileen M. Uchitelle*, *Aaron Patterson*
1136
+ * Specifying `implicit_order_column` now subsorts the records by primary key if available to ensure deterministic results.
974
1137
 
975
- * Deprecate delegating to `arel` in `Relation`.
1138
+ *Paweł Urbanek*
976
1139
 
977
- *Ryuta Kamizono*
1140
+ * `where(attr => [])` now loads an empty result without making a query.
978
1141
 
979
- * Query cache was unavailable when entering the `ActiveRecord::Base.cache` block
980
- without being connected.
1142
+ *John Hawthorn*
981
1143
 
982
- *Tsukasa Oishi*
1144
+ * Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
983
1145
 
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.
1146
+ *Hiroyuki Ishii*
988
1147
 
989
- *Tobias Kraze*
1148
+ * Add support for `belongs_to` to `has_many` inversing.
990
1149
 
991
- * Merging two relations representing nested joins no longer transforms the joins of
992
- the merged relation into LEFT OUTER JOIN.
1150
+ *Gannon McGibbon*
993
1151
 
994
- Example:
1152
+ * Allow length configuration for `has_secure_token` method. The minimum length
1153
+ is set at 24 characters.
995
1154
 
1155
+ Before:
1156
+
1157
+ ```ruby
1158
+ has_secure_token :auth_token
996
1159
  ```
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
1160
 
1001
- # After the change:
1002
- #=> SELECT ... FROM authors INNER JOIN posts ON ... INNER JOIN comments ON...
1161
+ After:
1162
+
1163
+ ```ruby
1164
+ has_secure_token :default_token # 24 characters
1165
+ has_secure_token :auth_token, length: 36 # 36 characters
1166
+ has_secure_token :invalid_token, length: 12 # => ActiveRecord::SecureToken::MinimumLengthError
1003
1167
  ```
1004
1168
 
1005
- *Maxime Handfield Lapointe*
1169
+ *Bernardo de Araujo*
1006
1170
 
1007
- * `ActiveRecord::Persistence#touch` does not work well when optimistic locking enabled and
1008
- `locking_column`, without default value, is null in the database.
1171
+ * Deprecate `DatabaseConfigurations#to_h`. These connection hashes are still available via `ActiveRecord::Base.configurations.configs_for`.
1009
1172
 
1010
- *bogdanvlviv*
1173
+ *Eileen Uchitelle*, *John Crepezzi*
1011
1174
 
1012
- * Fix destroying existing object does not work well when optimistic locking enabled and
1013
- `locking_column` is null in the database.
1175
+ * Add `DatabaseConfig#configuration_hash` to return database configuration hashes with symbol keys, and use all symbol-key configuration hashes internally. Deprecate `DatabaseConfig#config` which returns a String-keyed `Hash` with the same values.
1014
1176
 
1015
- *bogdanvlviv*
1177
+ *John Crepezzi*, *Eileen Uchitelle*
1178
+
1179
+ * Allow column names to be passed to `remove_index` positionally along with other options.
1180
+
1181
+ Passing other options can be necessary to make `remove_index` correctly reversible.
1182
+
1183
+ Before:
1184
+
1185
+ add_index :reports, :report_id # => works
1186
+ add_index :reports, :report_id, unique: true # => works
1187
+ remove_index :reports, :report_id # => works
1188
+ remove_index :reports, :report_id, unique: true # => ArgumentError
1016
1189
 
1017
- * Use bulk INSERT to insert fixtures for better performance.
1190
+ After:
1191
+
1192
+ remove_index :reports, :report_id, unique: true # => works
1193
+
1194
+ *Eugene Kenny*
1195
+
1196
+ * Allow bulk `ALTER` statements to drop and recreate indexes with the same name.
1197
+
1198
+ *Eugene Kenny*
1199
+
1200
+ * `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
1201
+
1202
+ *Eugene Kenny*
1203
+
1204
+ * Call `while_preventing_writes` directly from `connected_to`.
1205
+
1206
+ In some cases application authors want to use the database switching middleware and make explicit calls with `connected_to`. It's possible for an app to turn off writes and not turn them back on by the time we call `connected_to(role: :writing)`.
1207
+
1208
+ This change allows apps to fix this by assuming if a role is writing we want to allow writes, except in the case it's explicitly turned off.
1209
+
1210
+ *Eileen M. Uchitelle*
1211
+
1212
+ * Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
1018
1213
 
1019
1214
  *Kir Shatrov*
1020
1215
 
1021
- * Prevent creation of bind param if casted value is nil.
1216
+ * Stop trying to read yaml file fixtures when loading Active Record fixtures.
1217
+
1218
+ *Gannon McGibbon*
1219
+
1220
+ * Deprecate `.reorder(nil)` with `.first` / `.first!` taking non-deterministic result.
1221
+
1222
+ To continue taking non-deterministic result, use `.take` / `.take!` instead.
1022
1223
 
1023
1224
  *Ryuta Kamizono*
1024
1225
 
1025
- * Deprecate passing arguments and block at the same time to `count` and `sum` in `ActiveRecord::Calculations`.
1226
+ * Preserve user supplied joins order as much as possible.
1227
+
1228
+ Fixes #36761, #34328, #24281, #12953.
1026
1229
 
1027
1230
  *Ryuta Kamizono*
1028
1231
 
1029
- * Loading model schema from database is now thread-safe.
1232
+ * Allow `matches_regex` and `does_not_match_regexp` on the MySQL Arel visitor.
1030
1233
 
1031
- Fixes #28589.
1234
+ *James Pearson*
1032
1235
 
1033
- *Vikrant Chaudhary*, *David Abdemoulaie*
1236
+ * Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section.
1034
1237
 
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.
1238
+ *Tongfei Gao*
1038
1239
 
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+
1240
+ * Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
1041
1241
 
1042
- *DHH*
1242
+ *John Crepezzi*, *Eileen Uchitelle*
1043
1243
 
1044
- * Respect `SchemaDumper.ignore_tables` in rake tasks for databases structure dump.
1244
+ * Add a warning for enum elements with 'not_' prefix.
1045
1245
 
1046
- *Rusty Geldmacher*, *Guillermo Iguaran*
1246
+ class Foo
1247
+ enum status: [:sent, :not_sent]
1248
+ end
1047
1249
 
1048
- * Add type caster to `RuntimeReflection#alias_name`.
1250
+ *Edu Depetris*
1049
1251
 
1050
- Fixes #28959.
1252
+ * Make currency symbols optional for money column type in PostgreSQL.
1051
1253
 
1052
- *Jon Moss*
1254
+ *Joel Schneider*
1053
1255
 
1054
- * Deprecate `supports_statement_cache?`.
1256
+ * Add support for beginless ranges, introduced in Ruby 2.7.
1055
1257
 
1056
- *Ryuta Kamizono*
1258
+ *Josh Goodall*
1057
1259
 
1058
- * Raise error `UnknownMigrationVersionError` on the movement of migrations
1059
- when the current migration does not exist.
1260
+ * Add `database_exists?` method to connection adapters to check if a database exists.
1060
1261
 
1061
- *bogdanvlviv*
1262
+ *Guilherme Mansur*
1062
1263
 
1063
- * Fix `bin/rails db:forward` first migration.
1264
+ * Loading the schema for a model that has no `table_name` raises a `TableNotSpecified` error.
1064
1265
 
1065
- *bogdanvlviv*
1266
+ *Guilherme Mansur*, *Eugene Kenny*
1066
1267
 
1067
- * Support Descending Indexes for MySQL.
1268
+ * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
1068
1269
 
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.
1270
+ Fixes #36022.
1071
1271
 
1072
1272
  *Ryuta Kamizono*
1073
1273
 
1074
- * Fix inconsistency with changed attributes when overriding Active Record attribute reader.
1274
+ * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
1275
+
1276
+ Fixes #36465.
1075
1277
 
1076
- *bogdanvlviv*
1278
+ *Jeff Doering*
1279
+
1280
+ * Add support for multiple databases to `rails db:abort_if_pending_migrations`.
1281
+
1282
+ *Mark Lee*
1283
+
1284
+ * Fix sqlite3 collation parsing when using decimal columns.
1285
+
1286
+ *Martin R. Schuster*
1287
+
1288
+ * Fix invalid schema when primary key column has a comment.
1289
+
1290
+ Fixes #29966.
1291
+
1292
+ *Guilherme Goettems Schneider*
1293
+
1294
+ * Fix table comment also being applied to the primary key column.
1295
+
1296
+ *Guilherme Goettems Schneider*
1077
1297
 
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.
1298
+ * Allow generated `create_table` migrations to include or skip timestamps.
1080
1299
 
1081
- *Kevin McPhillips*
1300
+ *Michael Duchemin*
1082
1301
 
1083
1302
 
1084
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activerecord/CHANGELOG.md) for previous changes.
1303
+ Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activerecord/CHANGELOG.md) for previous changes.