activerecord 5.2.3 → 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 +898 -532
  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 +10 -19
  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 +27 -28
  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 +54 -12
  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 +48 -35
  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 +76 -47
  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 +1 -2
  51. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +293 -132
  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 +21 -17
  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 +175 -187
  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 +308 -100
  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 +3 -3
  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 +115 -58
  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 +113 -101
  166. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  167. data/lib/active_record/relation/batches.rb +44 -35
  168. data/lib/active_record/relation/calculations.rb +157 -93
  169. data/lib/active_record/relation/delegation.rb +35 -50
  170. data/lib/active_record/relation/finder_methods.rb +65 -40
  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 +487 -199
  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 +6 -8
  193. data/lib/active_record/scoping/named.rb +17 -24
  194. data/lib/active_record/scoping.rb +8 -9
  195. data/lib/active_record/secure_token.rb +16 -8
  196. data/lib/active_record/serialization.rb +5 -3
  197. data/lib/active_record/signed_id.rb +116 -0
  198. data/lib/active_record/statement_cache.rb +51 -8
  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 +59 -117
  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 +117 -32
  310. data/lib/active_record/attribute_decorators.rb +0 -90
  311. data/lib/active_record/collection_cache_key.rb +0 -53
  312. data/lib/active_record/connection_adapters/connection_specification.rb +0 -287
  313. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -33
  314. data/lib/active_record/define_callbacks.rb +0 -22
  315. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -19
  316. data/lib/active_record/relation/where_clause_factory.rb +0 -34
data/CHANGELOG.md CHANGED
@@ -1,937 +1,1303 @@
1
- ## Rails 5.2.3 (March 27, 2019) ##
1
+ ## Rails 6.1.0 (December 09, 2020) ##
2
2
 
3
- * Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
3
+ * Only warn about negative enums if a positive form that would cause conflicts exists.
4
4
 
5
- Fixes #35214.
5
+ Fixes #39065.
6
6
 
7
- *Juani Villarejo*
7
+ *Alex Ghiculescu*
8
8
 
9
- * Fix prepared statements caching to be enabled even when query caching is enabled.
9
+ * Change `attribute_for_inspect` to take `filter_attributes` in consideration.
10
10
 
11
- *Ryuta Kamizono*
11
+ *Rafael Mendonça França*
12
12
 
13
- * Don't allow `where` with invalid value matches to nil values.
13
+ * Fix odd behavior of inverse_of with multiple belongs_to to same class.
14
14
 
15
- Fixes #33624.
15
+ Fixes #35204.
16
16
 
17
- *Ryuta Kamizono*
17
+ *Tomoyuki Kai*
18
18
 
19
- * Restore an ability that class level `update` without giving ids.
19
+ * Build predicate conditions with objects that delegate `#id` and primary key:
20
20
 
21
- Fixes #34743.
21
+ ```ruby
22
+ class AdminAuthor
23
+ delegate_missing_to :@author
22
24
 
23
- *Ryuta Kamizono*
25
+ def initialize(author)
26
+ @author = author
27
+ end
28
+ end
24
29
 
25
- * Fix join table column quoting with SQLite.
30
+ Post.where(author: AdminAuthor.new(author))
31
+ ```
26
32
 
27
- *Gannon McGibbon*
33
+ *Sean Doyle*
28
34
 
29
- * Ensure that `delete_all` on collection proxy returns affected count.
35
+ * Add `connected_to_many` API.
30
36
 
31
- *Ryuta Kamizono*
37
+ This API allows applications to connect to multiple databases at once without switching all of them or implementing a deeply nested stack.
32
38
 
33
- * Reset scope after delete on collection association to clear stale offsets of removed records.
39
+ Before:
34
40
 
35
- *Gannon McGibbon*
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
36
48
 
49
+ After:
37
50
 
38
- ## Rails 5.2.2.1 (March 11, 2019) ##
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
39
56
 
40
- * No changes.
57
+ *Eileen M. Uchitelle*, *John Crepezzi*
41
58
 
59
+ * Add option to raise or log for `ActiveRecord::StrictLoadingViolationError`.
42
60
 
43
- ## Rails 5.2.2 (December 04, 2018) ##
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.
44
62
 
45
- * Do not ignore the scoping with query methods in the scope block.
63
+ Set `config.active_record.action_on_strict_loading_violation` to `:log` errors instead of raising.
46
64
 
47
- *Ryuta Kamizono*
65
+ *Eileen M. Uchitelle*
48
66
 
49
- * Allow aliased attributes to be used in `#update_columns` and `#update`.
67
+ * Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
50
68
 
51
- *Gannon McGibbon*
69
+ Fixes #34255.
52
70
 
53
- * Allow spaces in postgres table names.
71
+ *Steven Weber*
54
72
 
55
- Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres
56
- adapter.
73
+ * Optimise the length of index names for polymorphic references by using the reference name rather than the type and id column names.
57
74
 
58
- *Gannon McGibbon*
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.
59
76
 
60
- * Cached columns_hash fields should be excluded from ResultSet#column_types
77
+ This change reduces the chance of that happening by using the reference name, e.g. `index_my_table_on_my_reference`.
61
78
 
62
- PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test
63
- was passing for SQLite and MySQL, but failed for PostgreSQL:
79
+ Fixes #38655.
64
80
 
65
- ```ruby
66
- class DeveloperName < ActiveRecord::Type::String
67
- def deserialize(value)
68
- "Developer: #{value}"
69
- end
70
- end
81
+ *Luke Redpath*
71
82
 
72
- class AttributedDeveloper < ActiveRecord::Base
73
- self.table_name = "developers"
83
+ * MySQL: Uniqueness validator now respects default database collation,
84
+ no longer enforce case sensitive comparison by default.
74
85
 
75
- attribute :name, DeveloperName.new
86
+ *Ryuta Kamizono*
76
87
 
77
- self.ignored_columns += ["name"]
78
- end
88
+ * Remove deprecated methods from `ActiveRecord::ConnectionAdapters::DatabaseLimits`.
79
89
 
80
- developer = AttributedDeveloper.create
81
- developer.update_column :name, "name"
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`
82
97
 
83
- loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
84
- puts loaded_developer.name # should be "Developer: name" but it's just "name"
85
- ```
98
+ *Rafael Mendonça França*
86
99
 
87
- *Dmitry Tsepelev*
100
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?`.
88
101
 
89
- * Values of enum are frozen, raising an error when attempting to modify them.
102
+ *Rafael Mendonça França*
90
103
 
91
- *Emmanuel Byrd*
104
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?`.
92
105
 
93
- * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
94
- if the attribute does not exist.
106
+ *Rafael Mendonça França*
95
107
 
96
- *Sean Griffin*
108
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?`.
97
109
 
98
- * Do not use prepared statement in queries that have a large number of binds.
110
+ *Rafael Mendonça França*
99
111
 
100
- *Ryuta Kamizono*
112
+ * Remove deprecated `ActiveRecord::Base#update_attributes` and `ActiveRecord::Base#update_attributes!`.
101
113
 
102
- * Fix query cache to load before first request.
114
+ *Rafael Mendonça França*
103
115
 
104
- *Eileen M. Uchitelle*
116
+ * Remove deprecated `migrations_path` argument in `ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version`.
117
+
118
+ *Rafael Mendonça França*
105
119
 
106
- * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
120
+ * Remove deprecated `config.active_record.sqlite3.represent_boolean_as_integer`.
107
121
 
108
- Fixes #33056.
122
+ *Rafael Mendonça França*
109
123
 
110
- *Federico Martinez*
124
+ * `relation.create` does no longer leak scope to class level querying methods
125
+ in initialization block and callbacks.
111
126
 
112
- * Fix duplicated record creation when using nested attributes with `create_with`.
127
+ Before:
113
128
 
114
- *Darwin Wu*
129
+ User.where(name: "John").create do |john|
130
+ User.find_by(name: "David") # => nil
131
+ end
115
132
 
116
- * Fix regression setting children record in parent `before_save` callback.
133
+ After:
117
134
 
118
- *Guo Xiang Tan*
135
+ User.where(name: "John").create do |john|
136
+ User.find_by(name: "David") # => #<User name: "David", ...>
137
+ end
119
138
 
120
- * Prevent leaking of user's DB credentials on `rails db:create` failure.
139
+ *Ryuta Kamizono*
121
140
 
122
- *bogdanvlviv*
141
+ * Named scope chain does no longer leak scope to class level querying methods.
123
142
 
124
- * Clear mutation tracker before continuing the around callbacks.
143
+ class User < ActiveRecord::Base
144
+ scope :david, -> { User.where(name: "David") }
145
+ end
125
146
 
126
- *Yuya Tanaka*
147
+ Before:
127
148
 
128
- * Prevent deadlocks when waiting for connection from pool.
149
+ User.where(name: "John").david
150
+ # SELECT * FROM users WHERE name = 'John' AND name = 'David'
129
151
 
130
- *Brent Wheeldon*
152
+ After:
131
153
 
132
- * Avoid extra scoping when using `Relation#update` that was causing this method to change the current scope.
154
+ User.where(name: "John").david
155
+ # SELECT * FROM users WHERE name = 'David'
133
156
 
134
157
  *Ryuta Kamizono*
135
158
 
136
- * Fix numericality validator not to be affected by custom getter.
159
+ * Remove deprecated methods from `ActiveRecord::DatabaseConfigurations`.
137
160
 
138
- *Ryuta Kamizono*
161
+ `fetch`
162
+ `each`
163
+ `first`
164
+ `values`
165
+ `[]=`
139
166
 
140
- * Fix bulk change table ignores comment option on PostgreSQL.
167
+ *Rafael Mendonça França*
141
168
 
142
- *Yoshiyuki Kinjo*
169
+ * `where.not` now generates NAND predicates instead of NOR.
143
170
 
171
+ Before:
144
172
 
145
- ## Rails 5.2.1.1 (November 27, 2018) ##
173
+ User.where.not(name: "Jon", role: "admin")
174
+ # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
146
175
 
147
- * No changes.
176
+ After:
148
177
 
178
+ User.where.not(name: "Jon", role: "admin")
179
+ # SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
149
180
 
150
- ## Rails 5.2.1 (August 07, 2018) ##
181
+ *Rafael Mendonça França*
151
182
 
152
- * PostgreSQL: Support new relkind for partitioned tables.
183
+ * Remove deprecated `ActiveRecord::Result#to_hash` method.
153
184
 
154
- Fixes #33008.
185
+ *Rafael Mendonça França*
155
186
 
156
- *Yannick Schutz*
187
+ * Deprecate `ActiveRecord::Base.allow_unsafe_raw_sql`.
157
188
 
158
- * Rollback parent transaction when children fails to update.
189
+ *Rafael Mendonça França*
159
190
 
160
- *Guillaume Malette*
191
+ * Remove deprecated support for using unsafe raw SQL in `ActiveRecord::Relation` methods.
161
192
 
162
- * Fix default value for MySQL time types with specified precision.
193
+ *Rafael Mendonça França*
163
194
 
164
- *Nikolay Kondratyev*
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`.
165
197
 
166
- * Fix `touch` option to behave consistently with `Persistence#touch` method.
198
+ *Omri Gabay*
167
199
 
168
- *Ryuta Kamizono*
200
+ * Connections can be granularly switched for abstract classes when `connected_to` is called.
169
201
 
170
- * Fix `save` in `after_create_commit` won't invoke extra `after_create_commit`.
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.
171
203
 
172
- Fixes #32831.
204
+ Example usage:
173
205
 
174
- *Ryuta Kamizono*
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`.
175
207
 
176
- * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
208
+ ```ruby
209
+ ActiveRecord::Base.connected_to(role: :reading) do
210
+ User.first # reads from default replica
211
+ Dog.first # reads from default replica
177
212
 
178
- *Brian Durand*
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
179
217
 
180
- * Fix parent record should not get saved with duplicate children records.
218
+ User.first # reads from default replica
219
+ Dog.first # reads from default replica
181
220
 
182
- Fixes #32940.
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
+ ```
183
227
 
184
- *Santosh Wadghule*
228
+ *Eileen M. Uchitelle*, *John Crepezzi*
185
229
 
186
- * Fix that association's after_touch is not called with counter cache.
230
+ * Allow double-dash comment syntax when querying read-only databases
187
231
 
188
- Fixes #31559.
232
+ *James Adam*
189
233
 
190
- *Ryuta Kamizono*
234
+ * Add `values_at` method.
191
235
 
192
- * `becomes` should clear the mutation tracker which is created in `after_initialize`.
236
+ Returns an array containing the values associated with the given methods.
193
237
 
194
- Fixes #32867.
238
+ ```ruby
239
+ topic = Topic.first
240
+ topic.values_at(:title, :author_name)
241
+ # => ["Budget", "Jason"]
242
+ ```
195
243
 
196
- *Ryuta Kamizono*
244
+ Similar to `Hash#values_at` but on an Active Record instance.
197
245
 
198
- * Allow a belonging to parent object to be created from a new record.
246
+ *Guillaume Briday*
199
247
 
200
- *Jolyon Pawlyn*
248
+ * Fix `read_attribute_before_type_cast` to consider attribute aliases.
201
249
 
202
- * Fix that building record with assigning multiple has_one associations
203
- wrongly persists through record.
250
+ *Marcelo Lauxen*
204
251
 
205
- Fixes #32511.
252
+ * Support passing record to uniqueness validator `:conditions` callable:
206
253
 
207
- *Sam DeCesare*
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
+ }
260
+ end
261
+ ```
208
262
 
209
- * Fix relation merging when one of the relations is going to skip the
210
- query cache.
263
+ *Eliot Sykes*
211
264
 
212
- *James Williams*
265
+ * `BatchEnumerator#update_all` and `BatchEnumerator#delete_all` now return the
266
+ total number of rows affected, just like their non-batched counterparts.
213
267
 
268
+ ```ruby
269
+ Person.in_batches.update_all("first_name = 'Eugene'") # => 42
270
+ Person.in_batches.delete_all # => 42
271
+ ```
214
272
 
215
- ## Rails 5.2.0 (April 09, 2018) ##
273
+ Fixes #40287.
216
274
 
217
- * MySQL: Support mysql2 0.5.x.
275
+ *Eugene Kenny*
218
276
 
219
- *Aaron Stone*
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.
220
282
 
221
- * Apply time column precision on assignment.
283
+ To use this in 6.1, you need to place the next string to your model file:
222
284
 
223
- PR #20317 changed the behavior of datetime columns so that when they
224
- have a specified precision then on assignment the value is rounded to
225
- that precision. This behavior is now applied to time columns as well.
285
+ attribute :duration, :interval
226
286
 
227
- Fixes #30301.
287
+ To keep old behavior until 6.2 is released:
228
288
 
229
- *Andrew White*
289
+ attribute :duration, :string
230
290
 
231
- * Normalize time column values for SQLite database.
291
+ Example:
232
292
 
233
- For legacy reasons, time columns in SQLite are stored as full datetimes
234
- because until #24542 the quoting for time columns didn't remove the date
235
- component. To ensure that values are consistent we now normalize the
236
- date component to 2001-01-01 on reading and writing.
293
+ create_table :events do |t|
294
+ t.string :name
295
+ t.interval :duration
296
+ end
237
297
 
238
- *Andrew White*
298
+ class Event < ApplicationRecord
299
+ attribute :duration, :interval
300
+ end
239
301
 
240
- * Ensure that the date component is removed when quoting times.
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
241
307
 
242
- PR #24542 altered the quoting for time columns so that the date component
243
- was removed however it only removed it when it was 2001-01-01. Now the
244
- date component is removed irrespective of what the date is.
308
+ *Andrey Novikov*
245
309
 
246
- *Andrew White*
310
+ * Allow associations supporting the `dependent:` key to take `dependent: :destroy_async`.
247
311
 
248
- * Fix `dependent: :destroy` issue for has_one/belongs_to relationship where
249
- the parent class was getting deleted when the child was not.
312
+ ```ruby
313
+ class Account < ActiveRecord::Base
314
+ belongs_to :supplier, dependent: :destroy_async
315
+ end
316
+ ```
250
317
 
251
- Fixes #32022.
318
+ `:destroy_async` will enqueue a job to destroy associated records in the background.
252
319
 
253
- *Fernando Gorodscy*
320
+ *DHH*, *George Claghorn*, *Cory Gwin*, *Rafael Mendonça França*, *Adrianna Chang*
254
321
 
255
- * Whitelist `NULLS FIRST` and `NULLS LAST` in order clauses too.
322
+ * Add `SKIP_TEST_DATABASE` environment variable to disable modifying the test database when `rails db:create` and `rails db:drop` are called.
256
323
 
257
- *Xavier Noria*
324
+ *Jason Schweier*
258
325
 
259
- * Fix that after commit callbacks on update does not triggered when optimistic locking is enabled.
326
+ * `connects_to` can only be called on `ActiveRecord::Base` or abstract classes.
260
327
 
261
- *Ryuta Kamizono*
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.
329
+
330
+ *Eileen M. Uchitelle*, *John Crepezzi*
331
+
332
+ * All connection adapters `execute` now raises `ActiveRecord::ConnectionNotEstablished` rather than
333
+ `ActiveRecord::StatementInvalid` when they encounter a connection error.
334
+
335
+ *Jean Boussier*
336
+
337
+ * `Mysql2Adapter#quote_string` now raises `ActiveRecord::ConnectionNotEstablished` rather than
338
+ `ActiveRecord::StatementInvalid` when it can't connect to the MySQL server.
262
339
 
263
- * Fix `#columns_for_distinct` of MySQL and PostgreSQL to make
264
- `ActiveRecord::FinderMethods#limited_ids_for` use correct primary key values
265
- even if `ORDER BY` columns include other table's primary key.
340
+ *Jean Boussier*
266
341
 
267
- Fixes #28364.
342
+ * Add support for check constraints that are `NOT VALID` via `validate: false` (PostgreSQL-only).
268
343
 
269
- *Takumi Kagiyama*
344
+ *Alex Robbin*
270
345
 
271
- * Make `reflection.klass` raise if `polymorphic?` not to be misused.
346
+ * Ensure the default configuration is considered primary or first for an environment
272
347
 
273
- Fixes #31876.
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.
349
+
350
+ *Eileen M. Uchitelle*
351
+
352
+ * Allow `where` references association names as joined table name aliases.
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
359
+
360
+ # ... FROM comments LEFT OUTER JOIN comments children ON ... WHERE children.label = 1
361
+ Comment.includes(:children).where("children.label": "child")
362
+ ```
274
363
 
275
364
  *Ryuta Kamizono*
276
365
 
277
- * PostgreSQL: Allow pg-1.0 gem to be used with Active Record.
366
+ * Support storing demodulized class name for polymorphic type.
278
367
 
279
- *Lars Kanis*
368
+ Before Rails 6.1, storing demodulized class name is supported only for STI type
369
+ by `store_full_sti_class` class attribute.
280
370
 
281
- * Deprecate `expand_hash_conditions_for_aggregates` without replacement.
282
- Using a `Relation` for performing queries is the prefered API.
371
+ Now `store_full_class_name` class attribute can handle both STI and polymorphic types.
283
372
 
284
373
  *Ryuta Kamizono*
285
374
 
286
- * Fix not expanded problem when passing an Array object as argument to the where method using `composed_of` column.
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.
287
378
 
288
- ```
289
- david_balance = customers(:david).balance
290
- Customer.where(balance: [david_balance]).to_sql
379
+ *fatkodima*
380
+
381
+ * Respect the `select` values for eager loading.
291
382
 
292
- # Before: WHERE `customers`.`balance` = NULL
293
- # After : WHERE `customers`.`balance` = 50
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
294
397
  ```
295
398
 
296
- Fixes #31723.
399
+ *Ryuta Kamizono*
400
+
401
+ * Allow attribute's default to be configured but keeping its own type.
297
402
 
298
- *Yutaro Kanagawa*
403
+ ```ruby
404
+ class Post < ActiveRecord::Base
405
+ attribute :written_at, default: -> { Time.now.utc }
406
+ end
299
407
 
300
- * Fix `count(:all)` with eager loading and having an order other than the driving table.
408
+ # Rails 6.0
409
+ Post.type_for_attribute(:written_at) # => #<Type::Value ... precision: nil, ...>
301
410
 
302
- Fixes #31783.
411
+ # Rails 6.1
412
+ Post.type_for_attribute(:written_at) # => #<Type::DateTime ... precision: 6, ...>
413
+ ```
303
414
 
304
415
  *Ryuta Kamizono*
305
416
 
306
- * Clear the transaction state when an Active Record object is duped.
417
+ * Allow default to be configured for Enum.
307
418
 
308
- Fixes #31670.
419
+ ```ruby
420
+ class Book < ActiveRecord::Base
421
+ enum status: [:proposed, :written, :published], _default: :published
422
+ end
309
423
 
310
- *Yuriy Ustushenko*
424
+ Book.new.status # => "published"
425
+ ```
311
426
 
312
- * Support for PostgreSQL foreign tables.
427
+ *Ryuta Kamizono*
313
428
 
314
- *fatkodima*
429
+ * Deprecate YAML loading from legacy format older than Rails 5.0.
315
430
 
316
- * Fix relation merger issue with `left_outer_joins`.
431
+ *Ryuta Kamizono*
317
432
 
318
- *Mehmet Emin İNAÇ*
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.
319
437
 
320
- * Don't allow destroyed object mutation after `save` or `save!` is called.
438
+ *Sean Griffin*, *Ryuta Kamizono*
439
+
440
+ * Deprecate `map!` and `collect!` on `ActiveRecord::Result`.
321
441
 
322
442
  *Ryuta Kamizono*
323
443
 
324
- * Take into account association conditions when deleting through records.
444
+ * Support `relation.and` for intersection as Set theory.
325
445
 
326
- Fixes #18424.
446
+ ```ruby
447
+ david_and_mary = Author.where(id: [david, mary])
448
+ mary_and_bob = Author.where(id: [mary, bob])
327
449
 
328
- *Piotr Jakubowski*
450
+ david_and_mary.merge(mary_and_bob) # => [mary, bob]
329
451
 
330
- * Fix nested `has_many :through` associations on unpersisted parent instances.
452
+ david_and_mary.and(mary_and_bob) # => [mary]
453
+ david_and_mary.or(mary_and_bob) # => [david, mary, bob]
454
+ ```
331
455
 
332
- For example, if you have
456
+ *Ryuta Kamizono*
333
457
 
334
- class Post < ActiveRecord::Base
335
- belongs_to :author
336
- has_many :books, through: :author
337
- has_many :subscriptions, through: :books
338
- end
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)`.
339
461
 
340
- class Author < ActiveRecord::Base
341
- has_one :post
342
- has_many :books
343
- has_many :subscriptions, through: :books
344
- end
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]
345
465
 
346
- class Book < ActiveRecord::Base
347
- belongs_to :author
348
- has_many :subscriptions
349
- end
466
+ # Rails 6.1 (both conflict conditions exists, deprecated)
467
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
350
468
 
351
- class Subscription < ActiveRecord::Base
352
- belongs_to :book
353
- end
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]
354
471
 
355
- Before:
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
+ ```
356
476
 
357
- If `post` is not persisted, then `post.subscriptions` will be empty.
477
+ *Ryuta Kamizono*
358
478
 
359
- After:
479
+ * Do not mark Postgresql MAC address and UUID attributes as changed when the assigned value only varies by case.
360
480
 
361
- If `post` is not persisted, then `post.subscriptions` can be set and used
362
- just like it would if `post` were persisted.
481
+ *Peter Fry*
363
482
 
364
- Fixes #16313.
483
+ * Resolve issue with insert_all unique_by option when used with expression index.
365
484
 
366
- *Zoltan Kiss*
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.
367
488
 
368
- * Fixed inconsistency with `first(n)` when used with `limit()`.
369
- The `first(n)` finder now respects the `limit()`, making it consistent
370
- with `relation.to_a.first(n)`, and also with the behavior of `last(n)`.
489
+ Usage:
371
490
 
372
- Fixes #23979.
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
373
496
 
374
- *Brian Christian*
497
+ Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
498
+ ```
375
499
 
376
- * Use `count(:all)` in `HasManyAssociation#count_records` to prevent invalid
377
- SQL queries for association counting.
500
+ Fixes #39516.
378
501
 
379
- *Klas Eskilson*
502
+ *Austen Madden*
380
503
 
381
- * Fix to invoke callbacks when using `update_attribute`.
504
+ * Add basic support for CHECK constraints to database migrations.
382
505
 
383
- *Mike Busch*
506
+ Usage:
384
507
 
385
- * Fix `count(:all)` to correctly work `distinct` with custom SELECT list.
508
+ ```ruby
509
+ add_check_constraint :products, "price > 0", name: "price_check"
510
+ remove_check_constraint :products, name: "price_check"
511
+ ```
386
512
 
387
- *Ryuta Kamizono*
513
+ *fatkodima*
388
514
 
389
- * Using subselect for `delete_all` with `limit` or `offset`.
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.
390
518
 
391
- *Ryuta Kamizono*
519
+ Usage:
392
520
 
393
- * Undefine attribute methods on descendants when resetting column
394
- information.
521
+ ```ruby
522
+ class Developer < ApplicationRecord
523
+ self.strict_loading_by_default = true
395
524
 
396
- *Chris Salzberg*
525
+ has_many :projects
526
+ end
397
527
 
398
- * Log database query callers.
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
+ ```
399
532
 
400
- Add `verbose_query_logs` configuration option to display the caller
401
- of database queries in the log to facilitate N+1 query resolution
402
- and other debugging.
533
+ *bogdanvlviv*
403
534
 
404
- Enabled in development only for new and upgraded applications. Not
405
- recommended for use in the production environment since it relies
406
- on Ruby's `Kernel#caller_locations` which is fairly slow.
535
+ * Deprecate passing an Active Record object to `quote`/`type_cast` directly.
407
536
 
408
- *Olivier Lacan*
537
+ *Ryuta Kamizono*
409
538
 
410
- * Fix conflicts `counter_cache` with `touch: true` by optimistic locking.
539
+ * Default engine `ENGINE=InnoDB` is no longer dumped to make schema more agnostic.
411
540
 
412
- ```
413
- # create_table :posts do |t|
414
- # t.integer :comments_count, default: 0
415
- # t.integer :lock_version
416
- # t.timestamps
417
- # end
418
- class Post < ApplicationRecord
419
- end
541
+ Before:
420
542
 
421
- # create_table :comments do |t|
422
- # t.belongs_to :post
423
- # end
424
- class Comment < ApplicationRecord
425
- belongs_to :post, touch: true, counter_cache: true
543
+ ```ruby
544
+ create_table "accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
426
545
  end
427
546
  ```
428
547
 
429
- Before:
548
+ After:
549
+
550
+ ```ruby
551
+ create_table "accounts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
552
+ end
430
553
  ```
431
- post = Post.create!
432
- # => begin transaction
433
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
434
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
435
- commit transaction
436
554
 
437
- comment = Comment.create!(post: post)
438
- # => begin transaction
439
- INSERT INTO "comments" ("post_id") VALUES (1)
555
+ *Ryuta Kamizono*
440
556
 
441
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
442
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
557
+ * Added delegated type as an alternative to single-table inheritance for representing class hierarchies.
558
+ See ActiveRecord::DelegatedType for the full description.
443
559
 
444
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:27:11.398330',
445
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
446
- rollback transaction
447
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
560
+ *DHH*
448
561
 
449
- Comment.take.destroy!
450
- # => begin transaction
451
- DELETE FROM "comments" WHERE "comments"."id" = 1
562
+ * Deprecate aggregations with group by duplicated fields.
452
563
 
453
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
454
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
564
+ To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
455
565
 
456
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:42:47.785901',
457
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
458
- rollback transaction
459
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
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
+ # }
460
582
  ```
461
583
 
462
- After:
463
- ```
464
- post = Post.create!
465
- # => begin transaction
466
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
467
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
468
- commit transaction
584
+ *Ryuta Kamizono*
469
585
 
470
- comment = Comment.create!(post: post)
471
- # => begin transaction
472
- INSERT INTO "comments" ("post_id") VALUES (1)
586
+ * Deprecate duplicated query annotations.
473
587
 
474
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
475
- "lock_version" = COALESCE("lock_version", 0) + 1,
476
- "updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
477
- commit transaction
588
+ To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
478
589
 
479
- comment.destroy!
480
- # => begin transaction
481
- DELETE FROM "comments" WHERE "comments"."id" = 1
590
+ ```ruby
591
+ accounts = Account.where(id: [1, 2]).annotate("david and mary")
482
592
 
483
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
484
- "lock_version" = COALESCE("lock_version", 0) + 1,
485
- "updated_at" = '2017-12-11 21:39:02.685520' WHERE "posts"."id" = 1
486
- commit transaction
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 */
487
600
  ```
488
601
 
489
- Fixes #31199.
602
+ *Ryuta Kamizono*
490
603
 
491
- *bogdanvlviv*
604
+ * Resolve conflict between counter cache and optimistic locking.
492
605
 
493
- * Add support for PostgreSQL operator classes to `add_index`.
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.
494
610
 
495
- Example:
611
+ Fixes #16449.
496
612
 
497
- add_index :users, :name, using: :gist, opclass: { name: :gist_trgm_ops }
613
+ *Aaron Lipman*
498
614
 
499
- *Greg Navis*
615
+ * Support merging option `:rewhere` to allow mergee side condition to be replaced exactly.
500
616
 
501
- * Don't allow scopes to be defined which conflict with instance methods on `Relation`.
617
+ ```ruby
618
+ david_and_mary = Author.where(id: david.id..mary.id)
502
619
 
503
- Fixes #31120.
620
+ # both conflict conditions exists
621
+ david_and_mary.merge(Author.where(id: bob)) # => []
504
622
 
505
- *kinnrot*
623
+ # mergee side condition is replaced by rewhere
624
+ david_and_mary.merge(Author.rewhere(id: bob)) # => [bob]
506
625
 
507
- * Add new error class `QueryCanceled` which will be raised
508
- when canceling statement due to user request.
626
+ # mergee side condition is replaced by rewhere option
627
+ david_and_mary.merge(Author.where(id: bob), rewhere: true) # => [bob]
628
+ ```
509
629
 
510
630
  *Ryuta Kamizono*
511
631
 
512
- * Add `#up_only` to database migrations for code that is only relevant when
513
- migrating up, e.g. populating a new column.
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.
514
636
 
515
- *Rich Daley*
637
+ ```ruby
638
+ signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset
516
639
 
517
- * Require raw SQL fragments to be explicitly marked when used in
518
- relation query methods.
640
+ User.find_signed signed_id # => nil, since the purpose does not match
519
641
 
520
- Before:
521
- ```
522
- Article.order("LENGTH(title)")
523
- ```
642
+ travel 16.minutes
643
+ User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired
524
644
 
525
- After:
645
+ travel_back
646
+ User.find_signed signed_id, purpose: :password_reset # => User.first
647
+
648
+ User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
526
649
  ```
527
- Article.order(Arel.sql("LENGTH(title)"))
650
+
651
+ *DHH*
652
+
653
+ * Support `ALGORITHM = INSTANT` DDL option for index operations on MySQL.
654
+
655
+ *Ryuta Kamizono*
656
+
657
+ * Fix index creation to preserve index comment in bulk change table on MySQL.
658
+
659
+ *Ryuta Kamizono*
660
+
661
+ * Allow `unscope` to be aware of table name qualified values.
662
+
663
+ It is possible to unscope only the column in the specified table.
664
+
665
+ ```ruby
666
+ posts = Post.joins(:comments).group(:"posts.hidden")
667
+ posts = posts.where("posts.hidden": false, "comments.hidden": false)
668
+
669
+ posts.count
670
+ # => { false => 10 }
671
+
672
+ # unscope both hidden columns
673
+ posts.unscope(where: :hidden).count
674
+ # => { false => 11, true => 1 }
675
+
676
+ # unscope only comments.hidden column
677
+ posts.unscope(where: :"comments.hidden").count
678
+ # => { false => 11 }
528
679
  ```
529
680
 
530
- This prevents SQL injection if applications use the [strongly
531
- discouraged] form `Article.order(params[:my_order])`, under the
532
- mistaken belief that only column names will be accepted.
681
+ *Ryuta Kamizono*, *Slava Korolev*
682
+
683
+ * Fix `rewhere` to truly overwrite collided where clause by new where clause.
684
+
685
+ ```ruby
686
+ steve = Person.find_by(name: "Steve")
687
+ david = Author.find_by(name: "David")
533
688
 
534
- Raw SQL strings will now cause a deprecation warning, which will
535
- become an UnknownAttributeReference error in Rails 6.0. Applications
536
- can opt in to the future behavior by setting `allow_unsafe_raw_sql`
537
- to `:disabled`.
689
+ relation = Essay.where(writer: steve)
538
690
 
539
- Common and judged-safe string values (such as simple column
540
- references) are unaffected:
691
+ # Before
692
+ relation.rewhere(writer: david).to_a # => []
693
+
694
+ # After
695
+ relation.rewhere(writer: david).to_a # => [david]
541
696
  ```
542
- Article.order("title DESC")
697
+
698
+ *Ryuta Kamizono*
699
+
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">
543
705
  ```
544
706
 
545
- *Ben Toews*
707
+ *akinomaeni*, *Jonathan Hefner*
546
708
 
547
- * `update_all` will now pass its values to `Type#cast` before passing them to
548
- `Type#serialize`. This means that `update_all(foo: 'true')` will properly
549
- persist a boolean.
709
+ * Deprecate passing a column to `type_cast`.
550
710
 
551
- *Sean Griffin*
711
+ *Ryuta Kamizono*
552
712
 
553
- * Add new error class `StatementTimeout` which will be raised
554
- when statement timeout exceeded.
713
+ * Deprecate `in_clause_length` and `allowed_index_name_length` in `DatabaseLimits`.
555
714
 
556
715
  *Ryuta Kamizono*
557
716
 
558
- * Fix `bin/rails db:migrate` with specified `VERSION`.
559
- `bin/rails db:migrate` with empty VERSION behaves as without `VERSION`.
560
- Check a format of `VERSION`: Allow a migration version number
561
- or name of a migration file. Raise error if format of `VERSION` is invalid.
562
- Raise error if target migration doesn't exist.
717
+ * Support bulk insert/upsert on relation to preserve scope values.
563
718
 
564
- *bogdanvlviv*
719
+ *Josef Šimánek*, *Ryuta Kamizono*
565
720
 
566
- * Fixed a bug where column orders for an index weren't written to
567
- `db/schema.rb` when using the sqlite adapter.
721
+ * Preserve column comment value on changing column name on MySQL.
568
722
 
569
- Fixes #30902.
723
+ *Islam Taha*
570
724
 
571
- *Paul Kuruvilla*
725
+ * Add support for `if_exists` option for removing an index.
572
726
 
573
- * Remove deprecated method `#sanitize_conditions`.
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.
574
728
 
575
- *Rafael Mendonça França*
729
+ *Eileen M. Uchitelle*
576
730
 
577
- * Remove deprecated method `#scope_chain`.
731
+ * Remove ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base.
578
732
 
579
- *Rafael Mendonça França*
733
+ *Ryuta Kamizono*
580
734
 
581
- * Remove deprecated configuration `.error_on_ignored_order_or_limit`.
735
+ * Prevent `build_association` from `touching` a parent record if the record isn't persisted for `has_one` associations.
582
736
 
583
- *Rafael Mendonça França*
737
+ Fixes #38219.
584
738
 
585
- * Remove deprecated arguments from `#verify!`.
739
+ *Josh Brody*
586
740
 
587
- *Rafael Mendonça França*
741
+ * Add support for `if_not_exists` option for adding index.
588
742
 
589
- * Remove deprecated argument `name` from `#indexes`.
743
+ The `add_index` method respects `if_not_exists` option. If it is set to true
744
+ index won't be added.
590
745
 
591
- *Rafael Mendonça França*
746
+ Usage:
592
747
 
593
- * Remove deprecated method `ActiveRecord::Migrator.schema_migrations_table_name`.
748
+ ```ruby
749
+ add_index :users, :account_id, if_not_exists: true
750
+ ```
594
751
 
595
- *Rafael Mendonça França*
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.
596
755
 
597
- * Remove deprecated method `supports_primary_key?`.
756
+ *Prathamesh Sonpatki*
598
757
 
599
- *Rafael Mendonça França*
758
+ * Add `ActiveRecord::Base#previously_new_record?` to show if a record was new before the last save.
600
759
 
601
- * Remove deprecated method `supports_migrations?`.
760
+ *Tom Ward*
602
761
 
603
- *Rafael Mendonça França*
762
+ * Support descending order for `find_each`, `find_in_batches`, and `in_batches`.
604
763
 
605
- * Remove deprecated methods `initialize_schema_migrations_table` and `initialize_internal_metadata_table`.
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.
606
765
 
607
- *Rafael Mendonça França*
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.
608
767
 
609
- * Raises when calling `lock!` in a dirty record.
768
+ Pass `order: :desc` to yield batches in descending order. The default remains `order: :asc`.
610
769
 
611
- *Rafael Mendonça França*
770
+ ```ruby
771
+ Person.find_each(order: :desc) do |person|
772
+ person.party_all_night!
773
+ end
774
+ ```
612
775
 
613
- * Remove deprecated support to passing a class to `:class_name` on associations.
776
+ *Alexey Vasiliev*
614
777
 
615
- *Rafael Mendonça França*
778
+ * Fix `insert_all` with enum values.
616
779
 
617
- * Remove deprecated argument `default` from `index_name_exists?`.
780
+ Fixes #38716.
618
781
 
619
- *Rafael Mendonça França*
782
+ *Joel Blum*
620
783
 
621
- * Remove deprecated support to `quoted_id` when typecasting an Active Record object.
784
+ * Add support for `db:rollback:name` for multiple database applications.
622
785
 
623
- *Rafael Mendonça França*
786
+ Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
624
787
 
625
- * Fix `bin/rails db:setup` and `bin/rails db:test:prepare` create wrong
626
- ar_internal_metadata's data for a test database.
788
+ *Eileen M. Uchitelle*
627
789
 
628
- Before:
790
+ * `Relation#pick` now uses already loaded results instead of making another query.
791
+
792
+ *Eugene Kenny*
793
+
794
+ * Deprecate using `return`, `break` or `throw` to exit a transaction block after writes.
795
+
796
+ *Dylan Thacker-Smith*
797
+
798
+ * Dump the schema or structure of a database when calling `db:migrate:name`.
799
+
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.
801
+
802
+ Going forward, calls to `rails db:migrate:name` will dump the schema (or structure) of the database being migrated.
803
+
804
+ *Kyle Thompson*
805
+
806
+ * Reset the `ActiveRecord::Base` connection after `rails db:migrate:name`.
807
+
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.
809
+
810
+ *Kyle Thompson*
811
+
812
+ * Disallow calling `connected_to` on subclasses of `ActiveRecord::Base`.
813
+
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.
815
+
816
+ *Eileen M. Uchitelle*, *John Crepezzi*
817
+
818
+ * Add support for horizontal sharding to `connects_to` and `connected_to`.
819
+
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.
821
+
822
+ Usage:
823
+
824
+ Given the following configuration:
825
+
826
+ ```yaml
827
+ # config/database.yml
828
+ production:
829
+ primary:
830
+ database: my_database
831
+ primary_shard_one:
832
+ database: my_database_shard_one
629
833
  ```
630
- $ RAILS_ENV=test rails dbconsole
631
- > SELECT * FROM ar_internal_metadata;
632
- key|value|created_at|updated_at
633
- environment|development|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
834
+
835
+ Connect to multiple shards:
836
+
837
+ ```ruby
838
+ class ApplicationRecord < ActiveRecord::Base
839
+ self.abstract_class = true
840
+
841
+ connects_to shards: {
842
+ default: { writing: :primary },
843
+ shard_one: { writing: :primary_shard_one }
844
+ }
634
845
  ```
635
846
 
636
- After:
847
+ Swap between shards in your controller / model code:
848
+
849
+ ```ruby
850
+ ActiveRecord::Base.connected_to(shard: :shard_one) do
851
+ # Read from shard one
852
+ end
637
853
  ```
638
- $ RAILS_ENV=test rails dbconsole
639
- > SELECT * FROM ar_internal_metadata;
640
- key|value|created_at|updated_at
641
- environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
854
+
855
+ The horizontal sharding API also supports read replicas. See guides for more details.
856
+
857
+ *Eileen M. Uchitelle*, *John Crepezzi*
858
+
859
+ * Deprecate `spec_name` in favor of `name` on database configurations.
860
+
861
+ The accessors for `spec_name` on `configs_for` and `DatabaseConfig` are deprecated. Please use `name` instead.
862
+
863
+ Deprecated behavior:
864
+
865
+ ```ruby
866
+ db_config = ActiveRecord::Base.configs_for(env_name: "development", spec_name: "primary")
867
+ db_config.spec_name
642
868
  ```
643
869
 
644
- Fixes #26731.
870
+ New behavior:
645
871
 
646
- *bogdanvlviv*
872
+ ```ruby
873
+ db_config = ActiveRecord::Base.configs_for(env_name: "development", name: "primary")
874
+ db_config.name
875
+ ```
647
876
 
648
- * Fix longer sequence name detection for serial columns.
877
+ *Eileen M. Uchitelle*
649
878
 
650
- Fixes #28332.
879
+ * Add additional database-specific rake tasks for multi-database users.
651
880
 
652
- *Ryuta Kamizono*
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:
653
883
 
654
- * MySQL: Don't lose `auto_increment: true` in the `db/schema.rb`.
884
+ ```
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
894
+ ```
655
895
 
656
- Fixes #30894.
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:
657
898
 
658
- *Ryuta Kamizono*
899
+ ```
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
915
+ ```
659
916
 
660
- * Fix `COUNT(DISTINCT ...)` for `GROUP BY` with `ORDER BY` and `LIMIT`.
917
+ *Kyle Thompson*
661
918
 
662
- Fixes #30886.
919
+ * Add support for `strict_loading` mode on association declarations.
663
920
 
664
- *Ryuta Kamizono*
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.
665
922
 
666
- * PostgreSQL `tsrange` now preserves subsecond precision.
923
+ Usage:
667
924
 
668
- PostgreSQL 9.1+ introduced range types, and Rails added support for using
669
- this datatype in Active Record. However, the serialization of
670
- `PostgreSQL::OID::Range` was incomplete, because it did not properly
671
- cast the bounds that make up the range. This led to subseconds being
672
- dropped in SQL commands:
925
+ ```ruby
926
+ class Developer < ApplicationRecord
927
+ has_many :projects, strict_loading: true
928
+ end
673
929
 
674
- Before:
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
+ ```
675
934
 
676
- connection.type_cast(tsrange.serialize(range_value))
677
- # => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
935
+ *Kevin Deisz*
678
936
 
679
- Now:
937
+ * Add support for `strict_loading` mode to prevent lazy loading of records.
680
938
 
681
- connection.type_cast(tsrange.serialize(range_value))
682
- # => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
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.
683
940
 
684
- *Thomas Cannon*
941
+ Usage:
685
942
 
686
- * Passing a `Set` to `Relation#where` now behaves the same as passing an
687
- array.
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
+ ```
688
948
 
689
- *Sean Griffin*
949
+ *Eileen M. Uchitelle*, *Aaron Patterson*
690
950
 
691
- * Use given algorithm while removing index from database.
951
+ * Add support for PostgreSQL 11+ partitioned indexes when using `upsert_all`.
692
952
 
693
- Fixes #24190.
953
+ *Sebastián Palma*
694
954
 
695
- *Mehmet Emin İNAÇ*
955
+ * Adds support for `if_not_exists` to `add_column` and `if_exists` to `remove_column`.
696
956
 
697
- * Update payload names for `sql.active_record` instrumentation to be
698
- more descriptive.
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.
699
958
 
700
- Fixes #30586.
959
+ Example Usage:
701
960
 
702
- *Jeremy Green*
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
+ ```
703
968
 
704
- * Add new error class `LockWaitTimeout` which will be raised
705
- when lock wait timeout exceeded.
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
+ ```
706
976
 
707
- *Gabriel Courtemanche*
977
+ *Eileen M. Uchitelle*
708
978
 
709
- * Remove deprecated `#migration_keys`.
979
+ * Regexp-escape table name for MS SQL Server.
710
980
 
711
- *Ryuta Kamizono*
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.
712
982
 
713
- * Automatically guess the inverse associations for STI.
983
+ *Larry Reid*
714
984
 
715
- *Yuichiro Kaneko*
985
+ * Store advisory locks on their own named connection.
716
986
 
717
- * Ensure `sum` honors `distinct` on `has_many :through` associations.
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.
718
988
 
719
- Fixes #16791.
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.
720
990
 
721
- *Aaron Wortham*
991
+ *Eileen M. Uchitelle*, *John Crepezzi*
722
992
 
723
- * Add `binary` fixture helper method.
993
+ * Allow schema cache path to be defined in the database configuration file.
724
994
 
725
- *Atsushi Yoshida*
995
+ For example:
726
996
 
727
- * When using `Relation#or`, extract the common conditions and put them before the OR condition.
997
+ ```yaml
998
+ development:
999
+ adapter: postgresql
1000
+ database: blog_development
1001
+ pool: 5
1002
+ schema_cache_path: tmp/schema/main.yml
1003
+ ```
728
1004
 
729
- *Maxime Handfield Lapointe*
1005
+ *Katrina Owen*
730
1006
 
731
- * `Relation#or` now accepts two relations who have different values for
732
- `references` only, as `references` can be implicitly called by `where`.
1007
+ * Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
733
1008
 
734
- Fixes #29411.
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.
735
1010
 
736
- *Sean Griffin*
1011
+ *Eileen M. Uchitelle*, *John Crepezzi*
737
1012
 
738
- * `ApplicationRecord` is no longer generated when generating models. If you
739
- need to generate it, it can be created with `rails g application_record`.
1013
+ * Deprecate `#default_hash` and it's alias `#[]` on database configurations.
740
1014
 
741
- *Lisa Ugray*
1015
+ Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
742
1016
 
743
- * Fix `COUNT(DISTINCT ...)` with `ORDER BY` and `LIMIT` to keep the existing select list.
1017
+ *Eileen M. Uchitelle*, *John Crepezzi*
744
1018
 
745
- *Ryuta Kamizono*
1019
+ * Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
746
1020
 
747
- * When a `has_one` association is destroyed by `dependent: destroy`,
748
- `destroyed_by_association` will now be set to the reflection, matching the
749
- behaviour of `has_many` associations.
1021
+ *Gannon McGibbon*
1022
+
1023
+ * Find orphans by looking for missing relations through chaining `where.missing`:
750
1024
 
751
- *Lisa Ugray*
1025
+ Before:
752
1026
 
753
- * Fix `unscoped(where: [columns])` removing the wrong bind values.
1027
+ ```ruby
1028
+ Post.left_joins(:author).where(authors: { id: nil })
1029
+ ```
754
1030
 
755
- When the `where` is called on a relation after a `or`, unscoping the column of that later `where` removed
756
- bind values used by the `or` instead. (possibly other cases too)
1031
+ After:
757
1032
 
1033
+ ```ruby
1034
+ Post.where.missing(:author)
758
1035
  ```
759
- Post.where(id: 1).or(Post.where(id: 2)).where(foo: 3).unscope(where: :foo).to_sql
760
- # Currently:
761
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 2 OR "posts"."id" = 3)
762
- # With fix:
763
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1 OR "posts"."id" = 2)
1036
+
1037
+ *Tom Rossi*
1038
+
1039
+ * Ensure `:reading` connections always raise if a write is attempted.
1040
+
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`.
1042
+
1043
+ *Eileen M. Uchitelle*
1044
+
1045
+ * Deprecate `"primary"` as the `connection_specification_name` for `ActiveRecord::Base`.
1046
+
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"`.
1048
+
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")
764
1080
  ```
765
1081
 
766
- *Maxime Handfield Lapointe*
1082
+ After:
767
1083
 
768
- * Values constructed using multi-parameter assignment will now use the
769
- 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
+ ```
770
1089
 
771
- *Sean Griffin*
1090
+ *Eileen M. Uchitelle*, *John Crepezzi*
772
1091
 
773
- * `Relation#joins` is no longer affected by the target model's
774
- `current_scope`, with the exception of `unscoped`.
1092
+ * Remove `:connection_id` from the `sql.active_record` notification.
775
1093
 
776
- Fixes #29338.
1094
+ *Aaron Patterson*, *Rafael Mendonça França*
777
1095
 
778
- *Sean Griffin*
1096
+ * The `:name` key will no longer be returned as part of `DatabaseConfig#configuration_hash`. Please use `DatabaseConfig#owner_name` instead.
779
1097
 
780
- * Change sqlite3 boolean serialization to use 1 and 0.
1098
+ *Eileen M. Uchitelle*, *John Crepezzi*
781
1099
 
782
- SQLite natively recognizes 1 and 0 as true and false, but does not natively
783
- recognize 't' and 'f' as was previously serialized.
1100
+ * ActiveRecord's `belongs_to_required_by_default` flag can now be set per model.
784
1101
 
785
- This change in serialization requires a migration of stored boolean data
786
- for SQLite databases, so it's implemented behind a configuration flag
787
- whose default false value is deprecated.
1102
+ You can now opt-out/opt-in specific models from having their associations required
1103
+ by default.
788
1104
 
789
- *Lisa Ugray*
1105
+ This change is meant to ease the process of migrating all your models to have
1106
+ their association required.
790
1107
 
791
- * Skip query caching when working with batches of records (`find_each`, `find_in_batches`,
792
- `in_batches`).
1108
+ *Edouard Chin*
793
1109
 
794
- Previously, records would be fetched in batches, but all records would be retained in memory
795
- 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`.
796
1111
 
797
- *Eugene Kenny*
1112
+ *Eileen M. Uchitelle*, *John Crepezzi*
798
1113
 
799
- * Prevent errors raised by `sql.active_record` notification subscribers from being converted into
800
- `ActiveRecord::StatementInvalid` exceptions.
1114
+ * Retain explicit selections on the base model after applying `includes` and `joins`.
801
1115
 
802
- *Dennis Taylor*
1116
+ Resolves #34889.
803
1117
 
804
- * Fix eager loading/preloading association with scope including joins.
1118
+ *Patrick Rebsch*
805
1119
 
806
- 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.
807
1121
 
808
- *Ryuta Kamizono*
1122
+ *Eileen M. Uchitelle*, *John Crepezzi*
809
1123
 
810
- * Fix transactions to apply state to child transactions.
1124
+ * Allow attributes to be fetched from Arel node groupings.
811
1125
 
812
- Previously, if you had a nested transaction and the outer transaction was rolledback, the record from the
813
- inner transaction would still be marked as persisted.
1126
+ *Jeff Emminger*, *Gannon McGibbon*
814
1127
 
815
- This change fixes that by applying the state of the parent transaction to the child transaction when the
816
- 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`.
817
1129
 
818
- *Eileen M. Uchitelle*, *Aaron Patterson*
1130
+ *Joshua Flanagan*
819
1131
 
820
- * 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`.
821
1133
 
822
- Deprecated the `set_state` method in favor of setting the state via specific methods. If you need to mark the
823
- state of the transaction you can now use `rollback!`, `commit!` or `nullify!` instead of
824
- `set_state(:rolledback)`, `set_state(:committed)`, or `set_state(nil)`.
1134
+ *John Crepezzi*
825
1135
 
826
- *Eileen M. Uchitelle*, *Aaron Patterson*
1136
+ * Specifying `implicit_order_column` now subsorts the records by primary key if available to ensure deterministic results.
827
1137
 
828
- * Deprecate delegating to `arel` in `Relation`.
1138
+ *Paweł Urbanek*
829
1139
 
830
- *Ryuta Kamizono*
1140
+ * `where(attr => [])` now loads an empty result without making a query.
831
1141
 
832
- * Query cache was unavailable when entering the `ActiveRecord::Base.cache` block
833
- without being connected.
1142
+ *John Hawthorn*
834
1143
 
835
- *Tsukasa Oishi*
1144
+ * Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
836
1145
 
837
- * Previously, when building records using a `has_many :through` association,
838
- if the child records were deleted before the parent was saved, they would
839
- still be persisted. Now, if child records are deleted before the parent is saved
840
- on a `has_many :through` association, the child records will not be persisted.
1146
+ *Hiroyuki Ishii*
841
1147
 
842
- *Tobias Kraze*
1148
+ * Add support for `belongs_to` to `has_many` inversing.
843
1149
 
844
- * Merging two relations representing nested joins no longer transforms the joins of
845
- the merged relation into LEFT OUTER JOIN.
1150
+ *Gannon McGibbon*
846
1151
 
847
- Example:
1152
+ * Allow length configuration for `has_secure_token` method. The minimum length
1153
+ is set at 24 characters.
848
1154
 
1155
+ Before:
1156
+
1157
+ ```ruby
1158
+ has_secure_token :auth_token
849
1159
  ```
850
- Author.joins(:posts).merge(Post.joins(:comments))
851
- # Before the change:
852
- #=> SELECT ... FROM authors INNER JOIN posts ON ... LEFT OUTER JOIN comments ON...
853
1160
 
854
- # After the change:
855
- #=> 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
856
1167
  ```
857
1168
 
858
- *Maxime Handfield Lapointe*
1169
+ *Bernardo de Araujo*
859
1170
 
860
- * `ActiveRecord::Persistence#touch` does not work well when optimistic locking enabled and
861
- `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`.
862
1172
 
863
- *bogdanvlviv*
1173
+ *Eileen Uchitelle*, *John Crepezzi*
864
1174
 
865
- * Fix destroying existing object does not work well when optimistic locking enabled and
866
- `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.
867
1176
 
868
- *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
1189
+
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*
869
1211
 
870
- * Use bulk INSERT to insert fixtures for better performance.
1212
+ * Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
871
1213
 
872
1214
  *Kir Shatrov*
873
1215
 
874
- * 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.
875
1223
 
876
1224
  *Ryuta Kamizono*
877
1225
 
878
- * 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.
879
1229
 
880
1230
  *Ryuta Kamizono*
881
1231
 
882
- * Loading model schema from database is now thread-safe.
1232
+ * Allow `matches_regex` and `does_not_match_regexp` on the MySQL Arel visitor.
883
1233
 
884
- Fixes #28589.
1234
+ *James Pearson*
885
1235
 
886
- *Vikrant Chaudhary*, *David Abdemoulaie*
1236
+ * Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section.
887
1237
 
888
- * Add `ActiveRecord::Base#cache_version` to support recyclable cache keys via the new versioned entries
889
- in `ActiveSupport::Cache`. This also means that `ActiveRecord::Base#cache_key` will now return a stable key
890
- that does not include a timestamp any more.
1238
+ *Tongfei Gao*
891
1239
 
892
- NOTE: This feature is turned off by default, and `#cache_key` will still return cache keys with timestamps
893
- 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.
894
1241
 
895
- *DHH*
1242
+ *John Crepezzi*, *Eileen Uchitelle*
896
1243
 
897
- * Respect `SchemaDumper.ignore_tables` in rake tasks for databases structure dump.
1244
+ * Add a warning for enum elements with 'not_' prefix.
898
1245
 
899
- *Rusty Geldmacher*, *Guillermo Iguaran*
1246
+ class Foo
1247
+ enum status: [:sent, :not_sent]
1248
+ end
900
1249
 
901
- * Add type caster to `RuntimeReflection#alias_name`.
1250
+ *Edu Depetris*
902
1251
 
903
- Fixes #28959.
1252
+ * Make currency symbols optional for money column type in PostgreSQL.
904
1253
 
905
- *Jon Moss*
1254
+ *Joel Schneider*
906
1255
 
907
- * Deprecate `supports_statement_cache?`.
1256
+ * Add support for beginless ranges, introduced in Ruby 2.7.
908
1257
 
909
- *Ryuta Kamizono*
1258
+ *Josh Goodall*
910
1259
 
911
- * Raise error `UnknownMigrationVersionError` on the movement of migrations
912
- when the current migration does not exist.
1260
+ * Add `database_exists?` method to connection adapters to check if a database exists.
913
1261
 
914
- *bogdanvlviv*
1262
+ *Guilherme Mansur*
915
1263
 
916
- * Fix `bin/rails db:forward` first migration.
1264
+ * Loading the schema for a model that has no `table_name` raises a `TableNotSpecified` error.
917
1265
 
918
- *bogdanvlviv*
1266
+ *Guilherme Mansur*, *Eugene Kenny*
919
1267
 
920
- * Support Descending Indexes for MySQL.
1268
+ * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
921
1269
 
922
- MySQL 8.0.1 and higher supports descending indexes: `DESC` in an index definition is no longer ignored.
923
- See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
1270
+ Fixes #36022.
924
1271
 
925
1272
  *Ryuta Kamizono*
926
1273
 
927
- * Fix inconsistency with changed attributes when overriding Active Record attribute reader.
1274
+ * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
928
1275
 
929
- *bogdanvlviv*
1276
+ Fixes #36465.
1277
+
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*
930
1297
 
931
- * When calling the dynamic fixture accessor method with no arguments, it now returns all fixtures of this type.
932
- Previously this method always returned an empty array.
1298
+ * Allow generated `create_table` migrations to include or skip timestamps.
933
1299
 
934
- *Kevin McPhillips*
1300
+ *Michael Duchemin*
935
1301
 
936
1302
 
937
- 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.