activerecord 5.2.1.1 → 6.0.1

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 (270) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +738 -445
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +4 -2
  5. data/examples/performance.rb +1 -1
  6. data/lib/active_record.rb +9 -2
  7. data/lib/active_record/aggregations.rb +4 -2
  8. data/lib/active_record/association_relation.rb +18 -9
  9. data/lib/active_record/associations.rb +20 -15
  10. data/lib/active_record/associations/association.rb +69 -20
  11. data/lib/active_record/associations/association_scope.rb +4 -6
  12. data/lib/active_record/associations/belongs_to_association.rb +36 -42
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +0 -4
  14. data/lib/active_record/associations/builder/association.rb +14 -18
  15. data/lib/active_record/associations/builder/belongs_to.rb +19 -52
  16. data/lib/active_record/associations/builder/collection_association.rb +5 -15
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -38
  18. data/lib/active_record/associations/builder/has_many.rb +2 -0
  19. data/lib/active_record/associations/builder/has_one.rb +35 -1
  20. data/lib/active_record/associations/builder/singular_association.rb +2 -0
  21. data/lib/active_record/associations/collection_association.rb +15 -29
  22. data/lib/active_record/associations/collection_proxy.rb +19 -48
  23. data/lib/active_record/associations/foreign_association.rb +7 -0
  24. data/lib/active_record/associations/has_many_association.rb +11 -10
  25. data/lib/active_record/associations/has_many_through_association.rb +42 -25
  26. data/lib/active_record/associations/has_one_association.rb +28 -30
  27. data/lib/active_record/associations/has_one_through_association.rb +5 -5
  28. data/lib/active_record/associations/join_dependency.rb +28 -28
  29. data/lib/active_record/associations/join_dependency/join_association.rb +27 -7
  30. data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
  31. data/lib/active_record/associations/preloader.rb +39 -31
  32. data/lib/active_record/associations/preloader/association.rb +38 -36
  33. data/lib/active_record/associations/preloader/through_association.rb +48 -39
  34. data/lib/active_record/associations/singular_association.rb +2 -16
  35. data/lib/active_record/attribute_assignment.rb +7 -10
  36. data/lib/active_record/attribute_methods.rb +28 -100
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +4 -1
  38. data/lib/active_record/attribute_methods/dirty.rb +114 -38
  39. data/lib/active_record/attribute_methods/primary_key.rb +15 -22
  40. data/lib/active_record/attribute_methods/query.rb +2 -3
  41. data/lib/active_record/attribute_methods/read.rb +15 -53
  42. data/lib/active_record/attribute_methods/serialization.rb +1 -1
  43. data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -1
  44. data/lib/active_record/attribute_methods/write.rb +17 -24
  45. data/lib/active_record/attributes.rb +13 -0
  46. data/lib/active_record/autosave_association.rb +27 -13
  47. data/lib/active_record/base.rb +2 -3
  48. data/lib/active_record/callbacks.rb +6 -20
  49. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +140 -27
  50. data/lib/active_record/connection_adapters/abstract/database_limits.rb +22 -4
  51. data/lib/active_record/connection_adapters/abstract/database_statements.rb +116 -127
  52. data/lib/active_record/connection_adapters/abstract/query_cache.rb +26 -11
  53. data/lib/active_record/connection_adapters/abstract/quoting.rb +68 -17
  54. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +19 -12
  55. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +76 -48
  56. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -3
  57. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +135 -56
  58. data/lib/active_record/connection_adapters/abstract/transaction.rb +96 -56
  59. data/lib/active_record/connection_adapters/abstract_adapter.rb +189 -43
  60. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +151 -198
  61. data/lib/active_record/connection_adapters/column.rb +17 -13
  62. data/lib/active_record/connection_adapters/connection_specification.rb +55 -45
  63. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +9 -4
  64. data/lib/active_record/connection_adapters/mysql/database_statements.rb +75 -13
  65. data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
  66. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +3 -4
  67. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +40 -32
  68. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +14 -6
  69. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +129 -13
  70. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +6 -10
  71. data/lib/active_record/connection_adapters/mysql2_adapter.rb +26 -9
  72. data/lib/active_record/connection_adapters/postgresql/column.rb +17 -31
  73. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +22 -1
  74. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +8 -2
  75. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
  76. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -1
  77. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +1 -1
  78. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  79. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +1 -1
  80. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +1 -1
  81. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
  82. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +6 -3
  83. data/lib/active_record/connection_adapters/postgresql/quoting.rb +44 -7
  84. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +47 -0
  85. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
  86. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +65 -77
  87. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +24 -27
  88. data/lib/active_record/connection_adapters/postgresql/utils.rb +1 -1
  89. data/lib/active_record/connection_adapters/postgresql_adapter.rb +172 -74
  90. data/lib/active_record/connection_adapters/schema_cache.rb +37 -14
  91. data/lib/active_record/connection_adapters/sql_type_metadata.rb +11 -8
  92. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
  93. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +45 -5
  94. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +42 -11
  95. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +131 -143
  96. data/lib/active_record/connection_handling.rb +155 -26
  97. data/lib/active_record/core.rb +104 -59
  98. data/lib/active_record/counter_cache.rb +4 -29
  99. data/lib/active_record/database_configurations.rb +233 -0
  100. data/lib/active_record/database_configurations/database_config.rb +37 -0
  101. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  102. data/lib/active_record/database_configurations/url_config.rb +79 -0
  103. data/lib/active_record/dynamic_matchers.rb +1 -1
  104. data/lib/active_record/enum.rb +38 -7
  105. data/lib/active_record/errors.rb +30 -16
  106. data/lib/active_record/explain.rb +1 -1
  107. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  108. data/lib/active_record/fixture_set/render_context.rb +17 -0
  109. data/lib/active_record/fixture_set/table_row.rb +153 -0
  110. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  111. data/lib/active_record/fixtures.rb +145 -472
  112. data/lib/active_record/gem_version.rb +3 -3
  113. data/lib/active_record/inheritance.rb +13 -3
  114. data/lib/active_record/insert_all.rb +179 -0
  115. data/lib/active_record/integration.rb +68 -16
  116. data/lib/active_record/internal_metadata.rb +10 -2
  117. data/lib/active_record/locking/optimistic.rb +5 -6
  118. data/lib/active_record/locking/pessimistic.rb +3 -3
  119. data/lib/active_record/log_subscriber.rb +7 -26
  120. data/lib/active_record/middleware/database_selector.rb +75 -0
  121. data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
  122. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  123. data/lib/active_record/migration.rb +100 -81
  124. data/lib/active_record/migration/command_recorder.rb +50 -6
  125. data/lib/active_record/migration/compatibility.rb +91 -64
  126. data/lib/active_record/model_schema.rb +34 -10
  127. data/lib/active_record/nested_attributes.rb +2 -2
  128. data/lib/active_record/no_touching.rb +7 -0
  129. data/lib/active_record/persistence.rb +233 -28
  130. data/lib/active_record/query_cache.rb +11 -4
  131. data/lib/active_record/querying.rb +33 -21
  132. data/lib/active_record/railtie.rb +81 -46
  133. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  134. data/lib/active_record/railties/controller_runtime.rb +30 -35
  135. data/lib/active_record/railties/databases.rake +196 -46
  136. data/lib/active_record/reflection.rb +42 -44
  137. data/lib/active_record/relation.rb +320 -70
  138. data/lib/active_record/relation/batches.rb +13 -10
  139. data/lib/active_record/relation/calculations.rb +67 -57
  140. data/lib/active_record/relation/delegation.rb +48 -35
  141. data/lib/active_record/relation/finder_methods.rb +30 -30
  142. data/lib/active_record/relation/merger.rb +19 -25
  143. data/lib/active_record/relation/predicate_builder.rb +18 -15
  144. data/lib/active_record/relation/predicate_builder/array_handler.rb +7 -6
  145. data/lib/active_record/relation/predicate_builder/association_query_value.rb +1 -4
  146. data/lib/active_record/relation/predicate_builder/base_handler.rb +1 -2
  147. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
  148. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -4
  149. data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
  150. data/lib/active_record/relation/query_attribute.rb +17 -10
  151. data/lib/active_record/relation/query_methods.rb +236 -73
  152. data/lib/active_record/relation/spawn_methods.rb +1 -1
  153. data/lib/active_record/relation/where_clause.rb +14 -10
  154. data/lib/active_record/relation/where_clause_factory.rb +1 -2
  155. data/lib/active_record/result.rb +30 -11
  156. data/lib/active_record/sanitization.rb +32 -40
  157. data/lib/active_record/schema.rb +2 -11
  158. data/lib/active_record/schema_dumper.rb +22 -7
  159. data/lib/active_record/schema_migration.rb +5 -1
  160. data/lib/active_record/scoping.rb +8 -8
  161. data/lib/active_record/scoping/default.rb +6 -7
  162. data/lib/active_record/scoping/named.rb +21 -15
  163. data/lib/active_record/statement_cache.rb +32 -5
  164. data/lib/active_record/store.rb +87 -8
  165. data/lib/active_record/table_metadata.rb +10 -17
  166. data/lib/active_record/tasks/database_tasks.rb +195 -26
  167. data/lib/active_record/tasks/mysql_database_tasks.rb +5 -5
  168. data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -7
  169. data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -8
  170. data/lib/active_record/test_databases.rb +23 -0
  171. data/lib/active_record/test_fixtures.rb +224 -0
  172. data/lib/active_record/timestamp.rb +39 -25
  173. data/lib/active_record/touch_later.rb +4 -2
  174. data/lib/active_record/transactions.rb +57 -66
  175. data/lib/active_record/translation.rb +1 -1
  176. data/lib/active_record/type.rb +3 -4
  177. data/lib/active_record/type/adapter_specific_registry.rb +1 -8
  178. data/lib/active_record/type_caster/connection.rb +15 -14
  179. data/lib/active_record/type_caster/map.rb +1 -4
  180. data/lib/active_record/validations.rb +1 -0
  181. data/lib/active_record/validations/uniqueness.rb +15 -27
  182. data/lib/arel.rb +58 -0
  183. data/lib/arel/alias_predication.rb +9 -0
  184. data/lib/arel/attributes.rb +22 -0
  185. data/lib/arel/attributes/attribute.rb +37 -0
  186. data/lib/arel/collectors/bind.rb +24 -0
  187. data/lib/arel/collectors/composite.rb +31 -0
  188. data/lib/arel/collectors/plain_string.rb +20 -0
  189. data/lib/arel/collectors/sql_string.rb +20 -0
  190. data/lib/arel/collectors/substitute_binds.rb +28 -0
  191. data/lib/arel/crud.rb +42 -0
  192. data/lib/arel/delete_manager.rb +18 -0
  193. data/lib/arel/errors.rb +9 -0
  194. data/lib/arel/expressions.rb +29 -0
  195. data/lib/arel/factory_methods.rb +49 -0
  196. data/lib/arel/insert_manager.rb +49 -0
  197. data/lib/arel/math.rb +45 -0
  198. data/lib/arel/nodes.rb +68 -0
  199. data/lib/arel/nodes/and.rb +32 -0
  200. data/lib/arel/nodes/ascending.rb +23 -0
  201. data/lib/arel/nodes/binary.rb +52 -0
  202. data/lib/arel/nodes/bind_param.rb +36 -0
  203. data/lib/arel/nodes/case.rb +55 -0
  204. data/lib/arel/nodes/casted.rb +50 -0
  205. data/lib/arel/nodes/comment.rb +29 -0
  206. data/lib/arel/nodes/count.rb +12 -0
  207. data/lib/arel/nodes/delete_statement.rb +45 -0
  208. data/lib/arel/nodes/descending.rb +23 -0
  209. data/lib/arel/nodes/equality.rb +18 -0
  210. data/lib/arel/nodes/extract.rb +24 -0
  211. data/lib/arel/nodes/false.rb +16 -0
  212. data/lib/arel/nodes/full_outer_join.rb +8 -0
  213. data/lib/arel/nodes/function.rb +44 -0
  214. data/lib/arel/nodes/grouping.rb +8 -0
  215. data/lib/arel/nodes/in.rb +8 -0
  216. data/lib/arel/nodes/infix_operation.rb +80 -0
  217. data/lib/arel/nodes/inner_join.rb +8 -0
  218. data/lib/arel/nodes/insert_statement.rb +37 -0
  219. data/lib/arel/nodes/join_source.rb +20 -0
  220. data/lib/arel/nodes/matches.rb +18 -0
  221. data/lib/arel/nodes/named_function.rb +23 -0
  222. data/lib/arel/nodes/node.rb +50 -0
  223. data/lib/arel/nodes/node_expression.rb +13 -0
  224. data/lib/arel/nodes/outer_join.rb +8 -0
  225. data/lib/arel/nodes/over.rb +15 -0
  226. data/lib/arel/nodes/regexp.rb +16 -0
  227. data/lib/arel/nodes/right_outer_join.rb +8 -0
  228. data/lib/arel/nodes/select_core.rb +67 -0
  229. data/lib/arel/nodes/select_statement.rb +41 -0
  230. data/lib/arel/nodes/sql_literal.rb +16 -0
  231. data/lib/arel/nodes/string_join.rb +11 -0
  232. data/lib/arel/nodes/table_alias.rb +27 -0
  233. data/lib/arel/nodes/terminal.rb +16 -0
  234. data/lib/arel/nodes/true.rb +16 -0
  235. data/lib/arel/nodes/unary.rb +45 -0
  236. data/lib/arel/nodes/unary_operation.rb +20 -0
  237. data/lib/arel/nodes/unqualified_column.rb +22 -0
  238. data/lib/arel/nodes/update_statement.rb +41 -0
  239. data/lib/arel/nodes/values_list.rb +9 -0
  240. data/lib/arel/nodes/window.rb +126 -0
  241. data/lib/arel/nodes/with.rb +11 -0
  242. data/lib/arel/order_predications.rb +13 -0
  243. data/lib/arel/predications.rb +257 -0
  244. data/lib/arel/select_manager.rb +271 -0
  245. data/lib/arel/table.rb +110 -0
  246. data/lib/arel/tree_manager.rb +72 -0
  247. data/lib/arel/update_manager.rb +34 -0
  248. data/lib/arel/visitors.rb +20 -0
  249. data/lib/arel/visitors/depth_first.rb +204 -0
  250. data/lib/arel/visitors/dot.rb +297 -0
  251. data/lib/arel/visitors/ibm_db.rb +34 -0
  252. data/lib/arel/visitors/informix.rb +62 -0
  253. data/lib/arel/visitors/mssql.rb +157 -0
  254. data/lib/arel/visitors/mysql.rb +83 -0
  255. data/lib/arel/visitors/oracle.rb +159 -0
  256. data/lib/arel/visitors/oracle12.rb +66 -0
  257. data/lib/arel/visitors/postgresql.rb +110 -0
  258. data/lib/arel/visitors/sqlite.rb +39 -0
  259. data/lib/arel/visitors/to_sql.rb +889 -0
  260. data/lib/arel/visitors/visitor.rb +46 -0
  261. data/lib/arel/visitors/where_sql.rb +23 -0
  262. data/lib/arel/window_predications.rb +9 -0
  263. data/lib/rails/generators/active_record/migration.rb +14 -1
  264. data/lib/rails/generators/active_record/migration/migration_generator.rb +2 -5
  265. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +1 -1
  266. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -2
  267. data/lib/rails/generators/active_record/model/model_generator.rb +1 -0
  268. data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
  269. metadata +111 -27
  270. data/lib/active_record/collection_cache_key.rb +0 -53
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 528f4e87bdcf037db5b55d45cfe5d48ac5a2a1258f01cde55e6dac8c372a5a96
4
- data.tar.gz: 0d0bc05118a0aed4f38827d3eef3287f0f9a4450ccbc9d0ea7561965f68d1600
3
+ metadata.gz: 74e749ea0406c6090f479a06ed90ab6d7be8a341b3662329c623d212652ef0d3
4
+ data.tar.gz: 9daac4d5a5f794386f5580724c8a9f27c9a42c3db561d5a37ec314ac5715f0f8
5
5
  SHA512:
6
- metadata.gz: 2110e0799208ec03ab6547bfd3df55d8642a3b029c9c52a82fbb35fe2b9e7a7dee57d90e1670361179dc41a4c51a5906f3a98fc2f42d73d667ab6040c1281b55
7
- data.tar.gz: 7b7b148e1a25fc1f17f92268b67102fa180340ac58a21d2f013d5869ee70207fc2fd80097b745782e0047e0a303cee1ac6a2df647659cde7da34884468e470a3
6
+ metadata.gz: 5ae5468a2a52b707a9f111b1f416d6d3a63ebbfe1658f29f2d64062bbd0cd5408e7b620a4da8cabd8000ea484bbeecd2c70ecb36a94c9a2f91afac32a032ee73
7
+ data.tar.gz: 455c884ff4d115d562aa05df54beda3aea735b6b3fb0e29202280eca45fe9f4fad6d2b34a033fd6175048286fadd3ec90a975b02c54653f5a93fd9ac4a8f2d0b
@@ -1,793 +1,1086 @@
1
- ## Rails 5.2.1.1 (November 27, 2018) ##
1
+ ## Rails 6.0.1 (November 5, 2019) ##
2
2
 
3
- * No changes.
3
+ * Common Table Expressions are allowed on read-only connections.
4
4
 
5
+ *Chris Morris*
5
6
 
6
- ## Rails 5.2.1 (August 07, 2018) ##
7
+ * New record instantiation respects `unscope`.
7
8
 
8
- * PostgreSQL: Support new relkind for partitioned tables.
9
+ *Ryuta Kamizono*
9
10
 
10
- Fixes #33008.
11
+ * Fixed a case where `find_in_batches` could halt too early.
11
12
 
12
- *Yannick Schutz*
13
+ *Takayuki Nakata*
13
14
 
14
- * Rollback parent transaction when children fails to update.
15
+ * Autosaved associations always perform validations when a custom validation
16
+ context is used.
15
17
 
16
- *Guillaume Malette*
18
+ *Tekin Suleyman*
17
19
 
18
- * Fix default value for MySQL time types with specified precision.
20
+ * `sql.active_record` notifications now include the `:connection` in
21
+ their payloads.
19
22
 
20
- *Nikolay Kondratyev*
23
+ *Eugene Kenny*
21
24
 
22
- * Fix `touch` option to behave consistently with `Persistence#touch` method.
25
+ * A rollback encountered in an `after_commit` callback does not reset
26
+ previously-committed record state.
23
27
 
24
- *Ryuta Kamizono*
28
+ *Ryuta Kamizono*
25
29
 
26
- * Fix `save` in `after_create_commit` won't invoke extra `after_create_commit`.
30
+ * Fixed that join order was lost when eager-loading.
27
31
 
28
- Fixes #32831.
32
+ *Ryuta Kamizono*
29
33
 
30
- *Ryuta Kamizono*
34
+ * `DESCRIBE` queries are allowed on read-only connections.
31
35
 
32
- * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
36
+ *Dylan Thacker-Smith*
33
37
 
34
- *Brian Durand*
38
+ * Fixed that records that had been `inspect`ed could not be marshaled.
35
39
 
36
- * Fix parent record should not get saved with duplicate children records.
40
+ *Eugene Kenny*
37
41
 
38
- Fixes #32940.
42
+ * The connection pool reaper thread is respawned in forked processes. This
43
+ fixes that idle connections in forked processes wouldn't be reaped.
39
44
 
40
- *Santosh Wadghule*
45
+ *John Hawthorn*
41
46
 
42
- * Fix that association's after_touch is not called with counter cache.
47
+ * The memoized result of `ActiveRecord::Relation#take` is properly cleared
48
+ when `ActiveRecord::Relation#reset` or `ActiveRecord::Relation#reload`
49
+ is called.
43
50
 
44
- Fixes #31559.
51
+ *Anmol Arora*
45
52
 
46
- *Ryuta Kamizono*
53
+ * Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
47
54
 
48
- * `becomes` should clear the mutation tracker which is created in `after_initialize`.
55
+ *Hiroyuki Ishii*
49
56
 
50
- Fixes #32867.
57
+ * `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
51
58
 
52
- *Ryuta Kamizono*
59
+ *Eugene Kenny*
53
60
 
54
- * Allow a belonging to parent object to be created from a new record.
61
+ * Call `while_preventing_writes` directly from `connected_to`.
55
62
 
56
- *Jolyon Pawlyn*
63
+ 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)`.
57
64
 
58
- * Fix that building record with assigning multiple has_one associations
59
- wrongly persists through record.
65
+ 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.
60
66
 
61
- Fixes #32511.
67
+ *Eileen M. Uchitelle*
62
68
 
63
- *Sam DeCesare*
69
+ * Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
64
70
 
65
- * Fix relation merging when one of the relations is going to skip the
66
- query cache.
71
+ *Kir Shatrov*
67
72
 
68
- *James Williams*
69
73
 
74
+ ## Rails 6.0.0 (August 16, 2019) ##
70
75
 
71
- ## Rails 5.2.0 (April 09, 2018) ##
76
+ * Preserve user supplied joins order as much as possible.
72
77
 
73
- * MySQL: Support mysql2 0.5.x.
78
+ Fixes #36761, #34328, #24281, #12953.
74
79
 
75
- *Aaron Stone*
80
+ *Ryuta Kamizono*
76
81
 
77
- * Apply time column precision on assignment.
82
+ * Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
78
83
 
79
- PR #20317 changed the behavior of datetime columns so that when they
80
- have a specified precision then on assignment the value is rounded to
81
- that precision. This behavior is now applied to time columns as well.
84
+ *John Crepezzi*, *Eileen Uchitelle*
82
85
 
83
- Fixes #30301.
86
+ * Add a warning for enum elements with 'not_' prefix.
84
87
 
85
- *Andrew White*
88
+ class Foo
89
+ enum status: [:sent, :not_sent]
90
+ end
86
91
 
87
- * Normalize time column values for SQLite database.
92
+ *Edu Depetris*
88
93
 
89
- For legacy reasons, time columns in SQLite are stored as full datetimes
90
- because until #24542 the quoting for time columns didn't remove the date
91
- component. To ensure that values are consistent we now normalize the
92
- date component to 2001-01-01 on reading and writing.
94
+ * Make currency symbols optional for money column type in PostgreSQL
93
95
 
94
- *Andrew White*
96
+ *Joel Schneider*
95
97
 
96
- * Ensure that the date component is removed when quoting times.
97
98
 
98
- PR #24542 altered the quoting for time columns so that the date component
99
- was removed however it only removed it when it was 2001-01-01. Now the
100
- date component is removed irrespective of what the date is.
99
+ ## Rails 6.0.0.rc2 (July 22, 2019) ##
101
100
 
102
- *Andrew White*
101
+ * Add database_exists? method to connection adapters to check if a database exists.
103
102
 
104
- * Fix `dependent: :destroy` issue for has_one/belongs_to relationship where
105
- the parent class was getting deleted when the child was not.
103
+ *Guilherme Mansur*
106
104
 
107
- Fixes #32022.
105
+ * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
108
106
 
109
- *Fernando Gorodscy*
107
+ Fixes #36022.
110
108
 
111
- * Whitelist `NULLS FIRST` and `NULLS LAST` in order clauses too.
109
+ *Ryuta Kamizono*
112
110
 
113
- *Xavier Noria*
111
+ * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
114
112
 
115
- * Fix that after commit callbacks on update does not triggered when optimistic locking is enabled.
113
+ Fixes #36465.
116
114
 
117
- *Ryuta Kamizono*
115
+ *Jeff Doering*
118
116
 
119
- * Fix `#columns_for_distinct` of MySQL and PostgreSQL to make
120
- `ActiveRecord::FinderMethods#limited_ids_for` use correct primary key values
121
- even if `ORDER BY` columns include other table's primary key.
117
+ * Fix sqlite3 collation parsing when using decimal columns.
122
118
 
123
- Fixes #28364.
119
+ *Martin R. Schuster*
124
120
 
125
- *Takumi Kagiyama*
121
+ * Fix invalid schema when primary key column has a comment.
126
122
 
127
- * Make `reflection.klass` raise if `polymorphic?` not to be misused.
123
+ Fixes #29966.
128
124
 
129
- Fixes #31876.
125
+ *Guilherme Goettems Schneider*
130
126
 
131
- *Ryuta Kamizono*
127
+ * Fix table comment also being applied to the primary key column.
132
128
 
133
- * PostgreSQL: Allow pg-1.0 gem to be used with Active Record.
129
+ *Guilherme Goettems Schneider*
134
130
 
135
- *Lars Kanis*
131
+ * Fix merging left_joins to maintain its own `join_type` context.
136
132
 
137
- * Deprecate `expand_hash_conditions_for_aggregates` without replacement.
138
- Using a `Relation` for performing queries is the prefered API.
133
+ Fixes #36103.
139
134
 
140
135
  *Ryuta Kamizono*
141
136
 
142
- * Fix not expanded problem when passing an Array object as argument to the where method using `composed_of` column.
143
137
 
138
+ ## Rails 6.0.0.rc1 (April 24, 2019) ##
139
+
140
+ * Add `touch` option to `has_one` association.
141
+
142
+ *Abhay Nikam*
143
+
144
+ * Deprecate `where.not` working as NOR and will be changed to NAND in Rails 6.1.
145
+
146
+ ```ruby
147
+ all = [treasures(:diamond), treasures(:sapphire), cars(:honda), treasures(:sapphire)]
148
+ assert_equal all, PriceEstimate.all.map(&:estimate_of)
144
149
  ```
145
- david_balance = customers(:david).balance
146
- Customer.where(balance: [david_balance]).to_sql
147
150
 
148
- # Before: WHERE `customers`.`balance` = NULL
149
- # After : WHERE `customers`.`balance` = 50
151
+ In Rails 6.0:
152
+
153
+ ```ruby
154
+ sapphire = treasures(:sapphire)
155
+
156
+ nor = all.reject { |e|
157
+ e.estimate_of_type == sapphire.class.polymorphic_name
158
+ }.reject { |e|
159
+ e.estimate_of_id == sapphire.id
160
+ }
161
+ assert_equal [cars(:honda)], nor
162
+
163
+ without_sapphire = PriceEstimate.where.not(
164
+ estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
165
+ )
166
+ assert_equal nor, without_sapphire.map(&:estimate_of)
150
167
  ```
151
168
 
152
- Fixes #31723.
169
+ In Rails 6.1:
153
170
 
154
- *Yutaro Kanagawa*
171
+ ```ruby
172
+ sapphire = treasures(:sapphire)
155
173
 
156
- * Fix `count(:all)` with eager loading and having an order other than the driving table.
174
+ nand = all - [sapphire]
175
+ assert_equal [treasures(:diamond), cars(:honda)], nand
157
176
 
158
- Fixes #31783.
177
+ without_sapphire = PriceEstimate.where.not(
178
+ estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
179
+ )
180
+ assert_equal nand, without_sapphire.map(&:estimate_of)
181
+ ```
159
182
 
160
183
  *Ryuta Kamizono*
161
184
 
162
- * Clear the transaction state when an Active Record object is duped.
185
+ * Fix dirty tracking after rollback.
163
186
 
164
- Fixes #31670.
187
+ Fixes #15018, #30167, #33868.
165
188
 
166
- *Yuriy Ustushenko*
189
+ *Ryuta Kamizono*
167
190
 
168
- * Support for PostgreSQL foreign tables.
191
+ * Add `ActiveRecord::Relation#cache_version` to support recyclable cache keys via
192
+ the versioned entries in `ActiveSupport::Cache`. This also means that
193
+ `ActiveRecord::Relation#cache_key` will now return a stable key that does not
194
+ include the max timestamp or count any more.
169
195
 
170
- *fatkodima*
196
+ NOTE: This feature is turned off by default, and `cache_key` will still return
197
+ cache keys with timestamps until you set `ActiveRecord::Base.collection_cache_versioning = true`.
198
+ That's the setting for all new apps on Rails 6.0+
171
199
 
172
- * Fix relation merger issue with `left_outer_joins`.
200
+ *Lachlan Sylvester*
173
201
 
174
- *Mehmet Emin İNAÇ*
202
+ * Fix dirty tracking for `touch` to track saved changes.
175
203
 
176
- * Don't allow destroyed object mutation after `save` or `save!` is called.
204
+ Fixes #33429.
177
205
 
178
- *Ryuta Kamizono*
206
+ *Ryuta Kamzono*
179
207
 
180
- * Take into account association conditions when deleting through records.
208
+ * `change_column_comment` and `change_table_comment` are invertible only if
209
+ `to` and `from` options are specified.
181
210
 
182
- Fixes #18424.
211
+ *Yoshiyuki Kinjo*
183
212
 
184
- *Piotr Jakubowski*
213
+ * Don't call commit/rollback callbacks when a record isn't saved.
185
214
 
186
- * Fix nested `has_many :through` associations on unpersisted parent instances.
215
+ Fixes #29747.
187
216
 
188
- For example, if you have
217
+ *Ryuta Kamizono*
189
218
 
190
- class Post < ActiveRecord::Base
191
- belongs_to :author
192
- has_many :books, through: :author
193
- has_many :subscriptions, through: :books
194
- end
219
+ * Fix circular `autosave: true` causes invalid records to be saved.
195
220
 
196
- class Author < ActiveRecord::Base
197
- has_one :post
198
- has_many :books
199
- has_many :subscriptions, through: :books
200
- end
221
+ Prior to the fix, when there was a circular series of `autosave: true`
222
+ associations, the callback for a `has_many` association was run while
223
+ another instance of the same callback on the same association hadn't
224
+ finished running. When control returned to the first instance of the
225
+ callback, the instance variable had changed, and subsequent associated
226
+ records weren't saved correctly. Specifically, the ID field for the
227
+ `belongs_to` corresponding to the `has_many` was `nil`.
201
228
 
202
- class Book < ActiveRecord::Base
203
- belongs_to :author
204
- has_many :subscriptions
205
- end
229
+ Fixes #28080.
206
230
 
207
- class Subscription < ActiveRecord::Base
208
- belongs_to :book
209
- end
231
+ *Larry Reid*
232
+
233
+ * Raise `ArgumentError` for invalid `:limit` and `:precision` like as other options.
210
234
 
211
235
  Before:
212
236
 
213
- If `post` is not persisted, then `post.subscriptions` will be empty.
237
+ ```ruby
238
+ add_column :items, :attr1, :binary, size: 10 # => ArgumentError
239
+ add_column :items, :attr2, :decimal, scale: 10 # => ArgumentError
240
+ add_column :items, :attr3, :integer, limit: 10 # => ActiveRecordError
241
+ add_column :items, :attr4, :datetime, precision: 10 # => ActiveRecordError
242
+ ```
214
243
 
215
244
  After:
216
245
 
217
- If `post` is not persisted, then `post.subscriptions` can be set and used
218
- just like it would if `post` were persisted.
246
+ ```ruby
247
+ add_column :items, :attr1, :binary, size: 10 # => ArgumentError
248
+ add_column :items, :attr2, :decimal, scale: 10 # => ArgumentError
249
+ add_column :items, :attr3, :integer, limit: 10 # => ArgumentError
250
+ add_column :items, :attr4, :datetime, precision: 10 # => ArgumentError
251
+ ```
219
252
 
220
- Fixes #16313.
253
+ *Ryuta Kamizono*
221
254
 
222
- *Zoltan Kiss*
255
+ * Association loading isn't to be affected by scoping consistently
256
+ whether preloaded / eager loaded or not, with the exception of `unscoped`.
223
257
 
224
- * Fixed inconsistency with `first(n)` when used with `limit()`.
225
- The `first(n)` finder now respects the `limit()`, making it consistent
226
- with `relation.to_a.first(n)`, and also with the behavior of `last(n)`.
258
+ Before:
227
259
 
228
- Fixes #23979.
260
+ ```ruby
261
+ Post.where("1=0").scoping do
262
+ Comment.find(1).post # => nil
263
+ Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
264
+ Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
265
+ end
266
+ ```
229
267
 
230
- *Brian Christian*
268
+ After:
231
269
 
232
- * Use `count(:all)` in `HasManyAssociation#count_records` to prevent invalid
233
- SQL queries for association counting.
270
+ ```ruby
271
+ Post.where("1=0").scoping do
272
+ Comment.find(1).post # => #<Post id: 1, ...>
273
+ Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
274
+ Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
275
+ end
276
+ ```
234
277
 
235
- *Klas Eskilson*
278
+ Fixes #34638, #35398.
236
279
 
237
- * Fix to invoke callbacks when using `update_attribute`.
280
+ *Ryuta Kamizono*
238
281
 
239
- *Mike Busch*
282
+ * Add `rails db:prepare` to migrate or setup a database.
240
283
 
241
- * Fix `count(:all)` to correctly work `distinct` with custom SELECT list.
284
+ Runs `db:migrate` if the database exists or `db:setup` if it doesn't.
242
285
 
243
- *Ryuta Kamizono*
286
+ *Roberto Miranda*
244
287
 
245
- * Using subselect for `delete_all` with `limit` or `offset`.
288
+ * Add `after_save_commit` callback as shortcut for `after_commit :hook, on: [ :create, :update ]`.
246
289
 
247
- *Ryuta Kamizono*
290
+ *DHH*
248
291
 
249
- * Undefine attribute methods on descendants when resetting column
250
- information.
292
+ * Assign all attributes before calling `build` to ensure the child record is visible in
293
+ `before_add` and `after_add` callbacks for `has_many :through` associations.
251
294
 
252
- *Chris Salzberg*
295
+ Fixes #33249.
253
296
 
254
- * Log database query callers.
297
+ *Ryan H. Kerr*
255
298
 
256
- Add `verbose_query_logs` configuration option to display the caller
257
- of database queries in the log to facilitate N+1 query resolution
258
- and other debugging.
299
+ * Add `ActiveRecord::Relation#extract_associated` for extracting associated records from a relation.
259
300
 
260
- Enabled in development only for new and upgraded applications. Not
261
- recommended for use in the production environment since it relies
262
- on Ruby's `Kernel#caller_locations` which is fairly slow.
301
+ ```
302
+ account.memberships.extract_associated(:user)
303
+ # => Returns collection of User records
304
+ ```
263
305
 
264
- *Olivier Lacan*
306
+ *DHH*
265
307
 
266
- * Fix conflicts `counter_cache` with `touch: true` by optimistic locking.
308
+ * Add `ActiveRecord::Relation#annotate` for adding SQL comments to its queries.
267
309
 
268
- ```
269
- # create_table :posts do |t|
270
- # t.integer :comments_count, default: 0
271
- # t.integer :lock_version
272
- # t.timestamps
273
- # end
274
- class Post < ApplicationRecord
275
- end
310
+ For example:
276
311
 
277
- # create_table :comments do |t|
278
- # t.belongs_to :post
279
- # end
280
- class Comment < ApplicationRecord
281
- belongs_to :post, touch: true, counter_cache: true
282
- end
283
312
  ```
284
-
285
- Before:
313
+ Post.where(id: 123).annotate("this is a comment").to_sql
314
+ # SELECT "posts".* FROM "posts" WHERE "posts"."id" = 123 /* this is a comment */
286
315
  ```
287
- post = Post.create!
288
- # => begin transaction
289
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
290
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
291
- commit transaction
292
316
 
293
- comment = Comment.create!(post: post)
294
- # => begin transaction
295
- INSERT INTO "comments" ("post_id") VALUES (1)
317
+ This can be useful in instrumentation or other analysis of issued queries.
318
+
319
+ *Matt Yoho*
320
+
321
+ * Support Optimizer Hints.
322
+
323
+ In most databases, a way to control the optimizer is by using optimizer hints,
324
+ which can be specified within individual statements.
296
325
 
297
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
298
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
326
+ Example (for MySQL):
299
327
 
300
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:27:11.398330',
301
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
302
- rollback transaction
303
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
328
+ Topic.optimizer_hints("MAX_EXECUTION_TIME(50000)", "NO_INDEX_MERGE(topics)")
329
+ # SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`
304
330
 
305
- Comment.take.destroy!
306
- # => begin transaction
307
- DELETE FROM "comments" WHERE "comments"."id" = 1
331
+ Example (for PostgreSQL with pg_hint_plan):
308
332
 
309
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
310
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
333
+ Topic.optimizer_hints("SeqScan(topics)", "Parallel(topics 8)")
334
+ # SELECT /*+ SeqScan(topics) Parallel(topics 8) */ "topics".* FROM "topics"
335
+
336
+ See also:
337
+
338
+ * https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html
339
+ * https://pghintplan.osdn.jp/pg_hint_plan.html
340
+ * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/influencing-the-optimizer.html
341
+ * https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-2017
342
+ * https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.admin.perf.doc/doc/c0070117.html
343
+
344
+ *Ryuta Kamizono*
345
+
346
+ * Fix query attribute method on user-defined attribute to be aware of typecasted value.
347
+
348
+ For example, the following code no longer return false as casted non-empty string:
311
349
 
312
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:42:47.785901',
313
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
314
- rollback transaction
315
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
316
350
  ```
351
+ class Post < ActiveRecord::Base
352
+ attribute :user_defined_text, :text
353
+ end
317
354
 
318
- After:
355
+ Post.new(user_defined_text: "false").user_defined_text? # => true
319
356
  ```
320
- post = Post.create!
321
- # => begin transaction
322
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
323
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
324
- commit transaction
325
357
 
326
- comment = Comment.create!(post: post)
327
- # => begin transaction
328
- INSERT INTO "comments" ("post_id") VALUES (1)
358
+ *Yuji Kamijima*
329
359
 
330
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
331
- "lock_version" = COALESCE("lock_version", 0) + 1,
332
- "updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
333
- commit transaction
360
+ * Quote empty ranges like other empty enumerables.
334
361
 
335
- comment.destroy!
336
- # => begin transaction
337
- DELETE FROM "comments" WHERE "comments"."id" = 1
362
+ *Patrick Rebsch*
338
363
 
339
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
340
- "lock_version" = COALESCE("lock_version", 0) + 1,
341
- "updated_at" = '2017-12-11 21:39:02.685520' WHERE "posts"."id" = 1
342
- commit transaction
343
- ```
364
+ * Add `insert_all`/`insert_all!`/`upsert_all` methods to `ActiveRecord::Persistence`,
365
+ allowing bulk inserts akin to the bulk updates provided by `update_all` and
366
+ bulk deletes by `delete_all`.
367
+
368
+ Supports skipping or upserting duplicates through the `ON CONFLICT` syntax
369
+ for PostgreSQL (9.5+) and SQLite (3.24+) and `ON DUPLICATE KEY UPDATE` syntax
370
+ for MySQL.
371
+
372
+ *Bob Lail*
373
+
374
+ * Add `rails db:seed:replant` that truncates tables of each database
375
+ for current environment and loads the seeds.
376
+
377
+ *bogdanvlviv*, *DHH*
344
378
 
345
- Fixes #31199.
379
+ * Add `ActiveRecord::Base.connection.truncate` for SQLite3 adapter.
346
380
 
347
381
  *bogdanvlviv*
348
382
 
349
- * Add support for PostgreSQL operator classes to `add_index`.
383
+ * Deprecate mismatched collation comparison for uniqueness validator.
384
+
385
+ Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1.
386
+ To continue case sensitive comparison on the case insensitive column,
387
+ pass `case_sensitive: true` option explicitly to the uniqueness validator.
388
+
389
+ *Ryuta Kamizono*
390
+
391
+ * Add `reselect` method. This is a short-hand for `unscope(:select).select(fields)`.
392
+
393
+ Fixes #27340.
394
+
395
+ *Willian Gustavo Veiga*
396
+
397
+ * Add negative scopes for all enum values.
350
398
 
351
399
  Example:
352
400
 
353
- add_index :users, :name, using: :gist, opclass: { name: :gist_trgm_ops }
401
+ class Post < ActiveRecord::Base
402
+ enum status: %i[ drafted active trashed ]
403
+ end
354
404
 
355
- *Greg Navis*
405
+ Post.not_drafted # => where.not(status: :drafted)
406
+ Post.not_active # => where.not(status: :active)
407
+ Post.not_trashed # => where.not(status: :trashed)
408
+
409
+ *DHH*
410
+
411
+ * Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
356
412
 
357
- * Don't allow scopes to be defined which conflict with instance methods on `Relation`.
413
+ Fixes #35214.
358
414
 
359
- Fixes #31120.
415
+ *Juani Villarejo*
360
416
 
361
- *kinnrot*
362
417
 
363
- * Add new error class `QueryCanceled` which will be raised
364
- when canceling statement due to user request.
418
+ ## Rails 6.0.0.beta3 (March 11, 2019) ##
419
+
420
+ * No changes.
421
+
422
+
423
+ ## Rails 6.0.0.beta2 (February 25, 2019) ##
424
+
425
+ * Fix prepared statements caching to be enabled even when query caching is enabled.
365
426
 
366
427
  *Ryuta Kamizono*
367
428
 
368
- * Add `#up_only` to database migrations for code that is only relevant when
369
- migrating up, e.g. populating a new column.
429
+ * Ensure `update_all` series cares about optimistic locking.
370
430
 
371
- *Rich Daley*
431
+ *Ryuta Kamizono*
372
432
 
373
- * Require raw SQL fragments to be explicitly marked when used in
374
- relation query methods.
433
+ * Don't allow `where` with non numeric string matches to 0 values.
375
434
 
376
- Before:
377
- ```
378
- Article.order("LENGTH(title)")
379
- ```
435
+ *Ryuta Kamizono*
380
436
 
381
- After:
382
- ```
383
- Article.order(Arel.sql("LENGTH(title)"))
384
- ```
437
+ * Introduce `ActiveRecord::Relation#destroy_by` and `ActiveRecord::Relation#delete_by`.
438
+
439
+ `destroy_by` allows relation to find all the records matching the condition and perform
440
+ `destroy_all` on the matched records.
441
+
442
+ Example:
443
+
444
+ Person.destroy_by(name: 'David')
445
+ Person.destroy_by(name: 'David', rating: 4)
385
446
 
386
- This prevents SQL injection if applications use the [strongly
387
- discouraged] form `Article.order(params[:my_order])`, under the
388
- mistaken belief that only column names will be accepted.
447
+ david = Person.find_by(name: 'David')
448
+ david.posts.destroy_by(id: [1, 2, 3])
389
449
 
390
- Raw SQL strings will now cause a deprecation warning, which will
391
- become an UnknownAttributeReference error in Rails 6.0. Applications
392
- can opt in to the future behavior by setting `allow_unsafe_raw_sql`
393
- to `:disabled`.
450
+ `delete_by` allows relation to find all the records matching the condition and perform
451
+ `delete_all` on the matched records.
452
+
453
+ Example:
454
+
455
+ Person.delete_by(name: 'David')
456
+ Person.delete_by(name: 'David', rating: 4)
457
+
458
+ david = Person.find_by(name: 'David')
459
+ david.posts.delete_by(id: [1, 2, 3])
460
+
461
+ *Abhay Nikam*
462
+
463
+ * Don't allow `where` with invalid value matches to nil values.
464
+
465
+ Fixes #33624.
466
+
467
+ *Ryuta Kamizono*
468
+
469
+ * SQLite3: Implement `add_foreign_key` and `remove_foreign_key`.
470
+
471
+ *Ryuta Kamizono*
472
+
473
+ * Deprecate using class level querying methods if the receiver scope
474
+ regarded as leaked. Use `klass.unscoped` to avoid the leaking scope.
475
+
476
+ *Ryuta Kamizono*
477
+
478
+ * Allow applications to automatically switch connections.
479
+
480
+ Adds a middleware and configuration options that can be used in your
481
+ application to automatically switch between the writing and reading
482
+ database connections.
483
+
484
+ `GET` and `HEAD` requests will read from the replica unless there was
485
+ a write in the last 2 seconds, otherwise they will read from the primary.
486
+ Non-get requests will always write to the primary. The middleware accepts
487
+ an argument for a Resolver class and an Operations class where you are able
488
+ to change how the auto-switcher works to be most beneficial for your
489
+ application.
490
+
491
+ To use the middleware in your application you can use the following
492
+ configuration options:
394
493
 
395
- Common and judged-safe string values (such as simple column
396
- references) are unaffected:
397
494
  ```
398
- Article.order("title DESC")
495
+ config.active_record.database_selector = { delay: 2.seconds }
496
+ config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
497
+ config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
399
498
  ```
400
499
 
401
- *Ben Toews*
500
+ To change the database selection strategy, pass a custom class to the
501
+ configuration options:
402
502
 
403
- * `update_all` will now pass its values to `Type#cast` before passing them to
404
- `Type#serialize`. This means that `update_all(foo: 'true')` will properly
405
- persist a boolean.
503
+ ```
504
+ config.active_record.database_selector = { delay: 10.seconds }
505
+ config.active_record.database_resolver = MyResolver
506
+ config.active_record.database_resolver_context = MyResolver::MyCookies
507
+ ```
406
508
 
407
- *Sean Griffin*
509
+ *Eileen M. Uchitelle*
408
510
 
409
- * Add new error class `StatementTimeout` which will be raised
410
- when statement timeout exceeded.
511
+ * MySQL: Support `:size` option to change text and blob size.
411
512
 
412
513
  *Ryuta Kamizono*
413
514
 
414
- * Fix `bin/rails db:migrate` with specified `VERSION`.
415
- `bin/rails db:migrate` with empty VERSION behaves as without `VERSION`.
416
- Check a format of `VERSION`: Allow a migration version number
417
- or name of a migration file. Raise error if format of `VERSION` is invalid.
418
- Raise error if target migration doesn't exist.
515
+ * Make `t.timestamps` with precision by default.
419
516
 
420
- *bogdanvlviv*
421
-
422
- * Fixed a bug where column orders for an index weren't written to
423
- `db/schema.rb` when using the sqlite adapter.
517
+ *Ryuta Kamizono*
424
518
 
425
- Fixes #30902.
426
519
 
427
- *Paul Kuruvilla*
520
+ ## Rails 6.0.0.beta1 (January 18, 2019) ##
428
521
 
429
- * Remove deprecated method `#sanitize_conditions`.
522
+ * Remove deprecated `#set_state` from the transaction object.
430
523
 
431
524
  *Rafael Mendonça França*
432
525
 
433
- * Remove deprecated method `#scope_chain`.
526
+ * Remove deprecated `#supports_statement_cache?` from the database adapters.
434
527
 
435
528
  *Rafael Mendonça França*
436
529
 
437
- * Remove deprecated configuration `.error_on_ignored_order_or_limit`.
530
+ * Remove deprecated `#insert_fixtures` from the database adapters.
438
531
 
439
532
  *Rafael Mendonça França*
440
533
 
441
- * Remove deprecated arguments from `#verify!`.
534
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::SQLite3Adapter#valid_alter_table_type?`.
442
535
 
443
536
  *Rafael Mendonça França*
444
537
 
445
- * Remove deprecated argument `name` from `#indexes`.
538
+ * Do not allow passing the column name to `sum` when a block is passed.
446
539
 
447
540
  *Rafael Mendonça França*
448
541
 
449
- * Remove deprecated method `ActiveRecord::Migrator.schema_migrations_table_name`.
542
+ * Do not allow passing the column name to `count` when a block is passed.
450
543
 
451
544
  *Rafael Mendonça França*
452
545
 
453
- * Remove deprecated method `supports_primary_key?`.
546
+ * Remove delegation of missing methods in a relation to arel.
454
547
 
455
548
  *Rafael Mendonça França*
456
549
 
457
- * Remove deprecated method `supports_migrations?`.
550
+ * Remove delegation of missing methods in a relation to private methods of the class.
458
551
 
459
552
  *Rafael Mendonça França*
460
553
 
461
- * Remove deprecated methods `initialize_schema_migrations_table` and `initialize_internal_metadata_table`.
554
+ * Deprecate `config.active_record.sqlite3.represent_boolean_as_integer`.
462
555
 
463
556
  *Rafael Mendonça França*
464
557
 
465
- * Raises when calling `lock!` in a dirty record.
558
+ * Change `SQLite3Adapter` to always represent boolean values as integers.
466
559
 
467
560
  *Rafael Mendonça França*
468
561
 
469
- * Remove deprecated support to passing a class to `:class_name` on associations.
562
+ * Remove ability to specify a timestamp name for `#cache_key`.
470
563
 
471
564
  *Rafael Mendonça França*
472
565
 
473
- * Remove deprecated argument `default` from `index_name_exists?`.
566
+ * Remove deprecated `ActiveRecord::Migrator.migrations_path=`.
474
567
 
475
568
  *Rafael Mendonça França*
476
569
 
477
- * Remove deprecated support to `quoted_id` when typecasting an Active Record object.
570
+ * Remove deprecated `expand_hash_conditions_for_aggregates`.
478
571
 
479
572
  *Rafael Mendonça França*
480
573
 
481
- * Fix `bin/rails db:setup` and `bin/rails db:test:prepare` create wrong
482
- ar_internal_metadata's data for a test database.
574
+ * Set polymorphic type column to NULL on `dependent: :nullify` strategy.
483
575
 
484
- Before:
485
- ```
486
- $ RAILS_ENV=test rails dbconsole
487
- > SELECT * FROM ar_internal_metadata;
488
- key|value|created_at|updated_at
489
- environment|development|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
490
- ```
576
+ On polymorphic associations both the foreign key and the foreign type columns will be set to NULL.
491
577
 
492
- After:
493
- ```
494
- $ RAILS_ENV=test rails dbconsole
495
- > SELECT * FROM ar_internal_metadata;
496
- key|value|created_at|updated_at
497
- environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
498
- ```
578
+ *Laerti Papa*
499
579
 
500
- Fixes #26731.
580
+ * Allow permitted instance of `ActionController::Parameters` as argument of `ActiveRecord::Relation#exists?`.
501
581
 
502
- *bogdanvlviv*
582
+ *Gannon McGibbon*
503
583
 
504
- * Fix longer sequence name detection for serial columns.
584
+ * Add support for endless ranges introduces in Ruby 2.6.
585
+
586
+ *Greg Navis*
505
587
 
506
- Fixes #28332.
588
+ * Deprecate passing `migrations_paths` to `connection.assume_migrated_upto_version`.
507
589
 
508
590
  *Ryuta Kamizono*
509
591
 
510
- * MySQL: Don't lose `auto_increment: true` in the `db/schema.rb`.
592
+ * MySQL: `ROW_FORMAT=DYNAMIC` create table option by default.
511
593
 
512
- Fixes #30894.
594
+ Since MySQL 5.7.9, the `innodb_default_row_format` option defines the default row
595
+ format for InnoDB tables. The default setting is `DYNAMIC`.
596
+ The row format is required for indexing on `varchar(255)` with `utf8mb4` columns.
513
597
 
514
598
  *Ryuta Kamizono*
515
599
 
516
- * Fix `COUNT(DISTINCT ...)` for `GROUP BY` with `ORDER BY` and `LIMIT`.
600
+ * Fix join table column quoting with SQLite.
517
601
 
518
- Fixes #30886.
602
+ *Gannon McGibbon*
603
+
604
+ * Allow disabling scopes generated by `ActiveRecord.enum`.
605
+
606
+ *Alfred Dominic*
607
+
608
+ * Ensure that `delete_all` on collection proxy returns affected count.
519
609
 
520
610
  *Ryuta Kamizono*
521
611
 
522
- * PostgreSQL `tsrange` now preserves subsecond precision.
612
+ * Reset scope after delete on collection association to clear stale offsets of removed records.
523
613
 
524
- PostgreSQL 9.1+ introduced range types, and Rails added support for using
525
- this datatype in Active Record. However, the serialization of
526
- `PostgreSQL::OID::Range` was incomplete, because it did not properly
527
- cast the bounds that make up the range. This led to subseconds being
528
- dropped in SQL commands:
614
+ *Gannon McGibbon*
529
615
 
530
- Before:
616
+ * Add the ability to prevent writes to a database for the duration of a block.
531
617
 
532
- connection.type_cast(tsrange.serialize(range_value))
533
- # => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
618
+ Allows the application to prevent writes to a database. This can be useful when
619
+ you're building out multiple databases and want to make sure you're not sending
620
+ writes when you want a read.
534
621
 
535
- Now:
622
+ If `while_preventing_writes` is called and the query is considered a write
623
+ query the database will raise an exception regardless of whether the database
624
+ user is able to write.
536
625
 
537
- connection.type_cast(tsrange.serialize(range_value))
538
- # => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
626
+ This is not meant to be a catch-all for write queries but rather a way to enforce
627
+ read-only queries without opening a second connection. One purpose of this is to
628
+ catch accidental writes, not all writes.
539
629
 
540
- *Thomas Cannon*
630
+ *Eileen M. Uchitelle*
541
631
 
542
- * Passing a `Set` to `Relation#where` now behaves the same as passing an
543
- array.
632
+ * Allow aliased attributes to be used in `#update_columns` and `#update`.
544
633
 
545
- *Sean Griffin*
634
+ *Gannon McGibbon*
546
635
 
547
- * Use given algorithm while removing index from database.
636
+ * Allow spaces in postgres table names.
548
637
 
549
- Fixes #24190.
638
+ Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres adapter.
550
639
 
551
- *Mehmet Emin İNAÇ*
640
+ *Gannon McGibbon*
552
641
 
553
- * Update payload names for `sql.active_record` instrumentation to be
554
- more descriptive.
642
+ * Cached `columns_hash` fields should be excluded from `ResultSet#column_types`.
555
643
 
556
- Fixes #30586.
644
+ PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test
645
+ was passing for SQLite and MySQL, but failed for PostgreSQL:
557
646
 
558
- *Jeremy Green*
647
+ ```ruby
648
+ class DeveloperName < ActiveRecord::Type::String
649
+ def deserialize(value)
650
+ "Developer: #{value}"
651
+ end
652
+ end
559
653
 
560
- * Add new error class `LockWaitTimeout` which will be raised
561
- when lock wait timeout exceeded.
654
+ class AttributedDeveloper < ActiveRecord::Base
655
+ self.table_name = "developers"
562
656
 
563
- *Gabriel Courtemanche*
657
+ attribute :name, DeveloperName.new
564
658
 
565
- * Remove deprecated `#migration_keys`.
659
+ self.ignored_columns += ["name"]
660
+ end
566
661
 
567
- *Ryuta Kamizono*
662
+ developer = AttributedDeveloper.create
663
+ developer.update_column :name, "name"
664
+
665
+ loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
666
+ puts loaded_developer.name # should be "Developer: name" but it's just "name"
667
+ ```
668
+
669
+ *Dmitry Tsepelev*
670
+
671
+ * Make the implicit order column configurable.
672
+
673
+ When calling ordered finder methods such as `first` or `last` without an
674
+ explicit order clause, ActiveRecord sorts records by primary key. This can
675
+ result in unpredictable and surprising behaviour when the primary key is
676
+ not an auto-incrementing integer, for example when it's a UUID. This change
677
+ makes it possible to override the column used for implicit ordering such
678
+ that `first` and `last` will return more predictable results.
679
+
680
+ Example:
681
+
682
+ class Project < ActiveRecord::Base
683
+ self.implicit_order_column = "created_at"
684
+ end
685
+
686
+ *Tekin Suleyman*
687
+
688
+ * Bump minimum PostgreSQL version to 9.3.
689
+
690
+ *Yasuo Honda*
691
+
692
+ * Values of enum are frozen, raising an error when attempting to modify them.
693
+
694
+ *Emmanuel Byrd*
695
+
696
+ * Move `ActiveRecord::StatementInvalid` SQL to error property and include binds as separate error property.
697
+
698
+ `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception_class` now requires `binds` to be passed as the last argument.
699
+
700
+ `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception` now requires `message`, `sql`, and `binds` to be passed as keyword arguments.
701
+
702
+ Subclasses of `ActiveRecord::StatementInvalid` must now provide `sql:` and `binds:` arguments to `super`.
703
+
704
+ Example:
705
+
706
+ ```
707
+ class MySubclassedError < ActiveRecord::StatementInvalid
708
+ def initialize(message, sql:, binds:)
709
+ super(message, sql: sql, binds: binds)
710
+ end
711
+ end
712
+ ```
713
+
714
+ *Gannon McGibbon*
715
+
716
+ * Add an `:if_not_exists` option to `create_table`.
568
717
 
569
- * Automatically guess the inverse associations for STI.
718
+ Example:
570
719
 
571
- *Yuichiro Kaneko*
720
+ create_table :posts, if_not_exists: true do |t|
721
+ t.string :title
722
+ end
572
723
 
573
- * Ensure `sum` honors `distinct` on `has_many :through` associations.
724
+ That would execute:
574
725
 
575
- Fixes #16791.
726
+ CREATE TABLE IF NOT EXISTS posts (
727
+ ...
728
+ )
576
729
 
577
- *Aaron Wortham*
730
+ If the table already exists, `if_not_exists: false` (the default) raises an
731
+ exception whereas `if_not_exists: true` does nothing.
578
732
 
579
- * Add `binary` fixture helper method.
733
+ *fatkodima*, *Stefan Kanev*
580
734
 
581
- *Atsushi Yoshida*
735
+ * Defining an Enum as a Hash with blank key, or as an Array with a blank value, now raises an `ArgumentError`.
582
736
 
583
- * When using `Relation#or`, extract the common conditions and put them before the OR condition.
737
+ *Christophe Maximin*
584
738
 
585
- *Maxime Handfield Lapointe*
739
+ * Adds support for multiple databases to `rails db:schema:cache:dump` and `rails db:schema:cache:clear`.
586
740
 
587
- * `Relation#or` now accepts two relations who have different values for
588
- `references` only, as `references` can be implicitly called by `where`.
741
+ *Gannon McGibbon*
589
742
 
590
- Fixes #29411.
743
+ * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
744
+ if the attribute does not exist.
591
745
 
592
746
  *Sean Griffin*
593
747
 
594
- * `ApplicationRecord` is no longer generated when generating models. If you
595
- need to generate it, it can be created with `rails g application_record`.
748
+ * Add support for hash and URL configs in database hash of `ActiveRecord::Base.connected_to`.
749
+
750
+ ````
751
+ User.connected_to(database: { writing: "postgres://foo" }) do
752
+ User.create!(name: "Gannon")
753
+ end
754
+
755
+ config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
756
+ User.connected_to(database: { reading: config }) do
757
+ User.count
758
+ end
759
+ ````
760
+
761
+ *Gannon McGibbon*
762
+
763
+ * Support default expression for MySQL.
764
+
765
+ MySQL 8.0.13 and higher supports default value to be a function or expression.
596
766
 
597
- *Lisa Ugray*
767
+ https://dev.mysql.com/doc/refman/8.0/en/create-table.html
598
768
 
599
- * Fix `COUNT(DISTINCT ...)` with `ORDER BY` and `LIMIT` to keep the existing select list.
769
+ *Ryuta Kamizono*
770
+
771
+ * Support expression indexes for MySQL.
772
+
773
+ MySQL 8.0.13 and higher supports functional key parts that index
774
+ expression values rather than column or column prefix values.
775
+
776
+ https://dev.mysql.com/doc/refman/8.0/en/create-index.html
600
777
 
601
778
  *Ryuta Kamizono*
602
779
 
603
- * When a `has_one` association is destroyed by `dependent: destroy`,
604
- `destroyed_by_association` will now be set to the reflection, matching the
605
- behaviour of `has_many` associations.
780
+ * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
781
+
782
+ Fixes #33056.
606
783
 
607
- *Lisa Ugray*
784
+ *Federico Martinez*
608
785
 
609
- * Fix `unscoped(where: [columns])` removing the wrong bind values.
786
+ * Add basic API for connection switching to support multiple databases.
610
787
 
611
- When the `where` is called on a relation after a `or`, unscoping the column of that later `where` removed
612
- bind values used by the `or` instead. (possibly other cases too)
788
+ 1) Adds a `connects_to` method for models to connect to multiple databases. Example:
613
789
 
614
790
  ```
615
- Post.where(id: 1).or(Post.where(id: 2)).where(foo: 3).unscope(where: :foo).to_sql
616
- # Currently:
617
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 2 OR "posts"."id" = 3)
618
- # With fix:
619
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1 OR "posts"."id" = 2)
791
+ class AnimalsModel < ApplicationRecord
792
+ self.abstract_class = true
793
+
794
+ connects_to database: { writing: :animals_primary, reading: :animals_replica }
795
+ end
796
+
797
+ class Dog < AnimalsModel
798
+ # connected to both the animals_primary db for writing and the animals_replica for reading
799
+ end
620
800
  ```
621
801
 
622
- *Maxime Handfield Lapointe*
802
+ 2) Adds a `connected_to` block method for switching connection roles or connecting to
803
+ a database that the model didn't connect to. Connecting to the database in this block is
804
+ useful when you have another defined connection, for example `slow_replica` that you don't
805
+ want to connect to by default but need in the console, or a specific code block.
623
806
 
624
- * Values constructed using multi-parameter assignment will now use the
625
- post-type-cast value for rendering in single-field form inputs.
807
+ ```
808
+ ActiveRecord::Base.connected_to(role: :reading) do
809
+ Dog.first # finds dog from replica connected to AnimalsBase
810
+ Book.first # doesn't have a reading connection, will raise an error
811
+ end
812
+ ```
626
813
 
627
- *Sean Griffin*
814
+ ```
815
+ ActiveRecord::Base.connected_to(database: :slow_replica) do
816
+ SlowReplicaModel.first # if the db config has a slow_replica configuration this will be used to do the lookup, otherwise this will throw an exception
817
+ end
818
+ ```
628
819
 
629
- * `Relation#joins` is no longer affected by the target model's
630
- `current_scope`, with the exception of `unscoped`.
820
+ *Eileen M. Uchitelle*
631
821
 
632
- Fixes #29338.
822
+ * Enum raises on invalid definition values
633
823
 
634
- *Sean Griffin*
824
+ When defining a Hash enum it can be easy to use `[]` instead of `{}`. This
825
+ commit checks that only valid definition values are provided, those can
826
+ be a Hash, an array of Symbols or an array of Strings. Otherwise it
827
+ raises an `ArgumentError`.
635
828
 
636
- * Change sqlite3 boolean serialization to use 1 and 0.
829
+ Fixes #33961
637
830
 
638
- SQLite natively recognizes 1 and 0 as true and false, but does not natively
639
- recognize 't' and 'f' as was previously serialized.
831
+ *Alberto Almagro*
640
832
 
641
- This change in serialization requires a migration of stored boolean data
642
- for SQLite databases, so it's implemented behind a configuration flag
643
- whose default false value is deprecated.
833
+ * Reloading associations now clears the Query Cache like `Persistence#reload` does.
644
834
 
645
- *Lisa Ugray*
835
+ ```
836
+ class Post < ActiveRecord::Base
837
+ has_one :category
838
+ belongs_to :author
839
+ has_many :comments
840
+ end
841
+
842
+ # Each of the following will now clear the query cache.
843
+ post.reload_category
844
+ post.reload_author
845
+ post.comments.reload
846
+ ```
646
847
 
647
- * Skip query caching when working with batches of records (`find_each`, `find_in_batches`,
648
- `in_batches`).
848
+ *Christophe Maximin*
649
849
 
650
- Previously, records would be fetched in batches, but all records would be retained in memory
651
- until the end of the request or job.
850
+ * Added `index` option for `change_table` migration helpers.
851
+ With this change you can create indexes while adding new
852
+ columns into the existing tables.
652
853
 
653
- *Eugene Kenny*
854
+ Example:
855
+
856
+ change_table(:languages) do |t|
857
+ t.string :country_code, index: true
858
+ end
654
859
 
655
- * Prevent errors raised by `sql.active_record` notification subscribers from being converted into
656
- `ActiveRecord::StatementInvalid` exceptions.
860
+ *Mehmet Emin İNAÇ*
657
861
 
658
- *Dennis Taylor*
862
+ * Fix `transaction` reverting for migrations.
659
863
 
660
- * Fix eager loading/preloading association with scope including joins.
864
+ Before: Commands inside a `transaction` in a reverted migration ran uninverted.
865
+ Now: This change fixes that by reverting commands inside `transaction` block.
661
866
 
662
- Fixes #28324.
867
+ *fatkodima*, *David Verhasselt*
868
+
869
+ * Raise an error instead of scanning the filesystem root when `fixture_path` is blank.
870
+
871
+ *Gannon McGibbon*, *Max Albrecht*
872
+
873
+ * Allow `ActiveRecord::Base.configurations=` to be set with a symbolized hash.
874
+
875
+ *Gannon McGibbon*
876
+
877
+ * Don't update counter cache unless the record is actually saved.
878
+
879
+ Fixes #31493, #33113, #33117.
663
880
 
664
881
  *Ryuta Kamizono*
665
882
 
666
- * Fix transactions to apply state to child transactions.
883
+ * Deprecate `ActiveRecord::Result#to_hash` in favor of `ActiveRecord::Result#to_a`.
667
884
 
668
- Previously, if you had a nested transaction and the outer transaction was rolledback, the record from the
669
- inner transaction would still be marked as persisted.
885
+ *Gannon McGibbon*, *Kevin Cheng*
670
886
 
671
- This change fixes that by applying the state of the parent transaction to the child transaction when the
672
- parent transaction is rolledback. This will correctly mark records from the inner transaction as not persisted.
887
+ * SQLite3 adapter supports expression indexes.
673
888
 
674
- *Eileen M. Uchitelle*, *Aaron Patterson*
889
+ ```
890
+ create_table :users do |t|
891
+ t.string :email
892
+ end
675
893
 
676
- * Deprecate `set_state` method in `TransactionState`.
894
+ add_index :users, 'lower(email)', name: 'index_users_on_email', unique: true
895
+ ```
677
896
 
678
- Deprecated the `set_state` method in favor of setting the state via specific methods. If you need to mark the
679
- state of the transaction you can now use `rollback!`, `commit!` or `nullify!` instead of
680
- `set_state(:rolledback)`, `set_state(:committed)`, or `set_state(nil)`.
897
+ *Gray Kemmey*
681
898
 
682
- *Eileen M. Uchitelle*, *Aaron Patterson*
899
+ * Allow subclasses to redefine autosave callbacks for associated records.
900
+
901
+ Fixes #33305.
902
+
903
+ *Andrey Subbota*
904
+
905
+ * Bump minimum MySQL version to 5.5.8.
906
+
907
+ *Yasuo Honda*
908
+
909
+ * Use MySQL utf8mb4 character set by default.
910
+
911
+ `utf8mb4` character set with 4-Byte encoding supports supplementary characters including emoji.
912
+ The previous default 3-Byte encoding character set `utf8` is not enough to support them.
913
+
914
+ *Yasuo Honda*
683
915
 
684
- * Deprecate delegating to `arel` in `Relation`.
916
+ * Fix duplicated record creation when using nested attributes with `create_with`.
917
+
918
+ *Darwin Wu*
919
+
920
+ * Configuration item `config.filter_parameters` could also filter out
921
+ sensitive values of database columns when calling `#inspect`.
922
+ We also added `ActiveRecord::Base::filter_attributes`/`=` in order to
923
+ specify sensitive attributes to specific model.
924
+
925
+ ```
926
+ Rails.application.config.filter_parameters += [:credit_card_number, /phone/]
927
+ Account.last.inspect # => #<Account id: 123, name: "DHH", credit_card_number: [FILTERED], telephone_number: [FILTERED] ...>
928
+ SecureAccount.filter_attributes += [:name]
929
+ SecureAccount.last.inspect # => #<SecureAccount id: 42, name: [FILTERED], credit_card_number: [FILTERED] ...>
930
+ ```
931
+
932
+ *Zhang Kang*, *Yoshiyuki Kinjo*
933
+
934
+ * Deprecate `column_name_length`, `table_name_length`, `columns_per_table`,
935
+ `indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
936
+ and `joins_per_query` methods in `DatabaseLimits`.
685
937
 
686
938
  *Ryuta Kamizono*
687
939
 
688
- * Query cache was unavailable when entering the `ActiveRecord::Base.cache` block
689
- without being connected.
940
+ * `ActiveRecord::Base.configurations` now returns an object.
690
941
 
691
- *Tsukasa Oishi*
942
+ `ActiveRecord::Base.configurations` used to return a hash, but this
943
+ is an inflexible data model. In order to improve multiple-database
944
+ handling in Rails, we've changed this to return an object. Some methods
945
+ are provided to make the object behave hash-like in order to ease the
946
+ transition process. Since most applications don't manipulate the hash
947
+ we've decided to add backwards-compatible functionality that will throw
948
+ a deprecation warning if used, however calling `ActiveRecord::Base.configurations`
949
+ will use the new version internally and externally.
692
950
 
693
- * Previously, when building records using a `has_many :through` association,
694
- if the child records were deleted before the parent was saved, they would
695
- still be persisted. Now, if child records are deleted before the parent is saved
696
- on a `has_many :through` association, the child records will not be persisted.
951
+ For example, the following `database.yml`:
697
952
 
698
- *Tobias Kraze*
953
+ ```
954
+ development:
955
+ adapter: sqlite3
956
+ database: db/development.sqlite3
957
+ ```
699
958
 
700
- * Merging two relations representing nested joins no longer transforms the joins of
701
- the merged relation into LEFT OUTER JOIN.
959
+ Used to become a hash:
702
960
 
703
- Example:
961
+ ```
962
+ { "development" => { "adapter" => "sqlite3", "database" => "db/development.sqlite3" } }
963
+ ```
964
+
965
+ Is now converted into the following object:
704
966
 
705
967
  ```
706
- Author.joins(:posts).merge(Post.joins(:comments))
707
- # Before the change:
708
- #=> SELECT ... FROM authors INNER JOIN posts ON ... LEFT OUTER JOIN comments ON...
968
+ #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
969
+ #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
970
+ @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
971
+ ]
972
+ ```
973
+
974
+ Iterating over the database configurations has also changed. Instead of
975
+ calling hash methods on the `configurations` hash directly, a new method `configs_for` has
976
+ been provided that allows you to select the correct configuration. `env_name` and
977
+ `spec_name` arguments are optional. For example, these return an array of
978
+ database config objects for the requested environment and a single database config object
979
+ will be returned for the requested environment and specification name respectively.
709
980
 
710
- # After the change:
711
- #=> SELECT ... FROM authors INNER JOIN posts ON ... INNER JOIN comments ON...
981
+ ```
982
+ ActiveRecord::Base.configurations.configs_for(env_name: "development")
983
+ ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
712
984
  ```
713
985
 
714
- *Maxime Handfield Lapointe*
986
+ *Eileen M. Uchitelle*, *Aaron Patterson*
715
987
 
716
- * `ActiveRecord::Persistence#touch` does not work well when optimistic locking enabled and
717
- `locking_column`, without default value, is null in the database.
988
+ * Add database configuration to disable advisory locks.
718
989
 
719
- *bogdanvlviv*
990
+ ```
991
+ production:
992
+ adapter: postgresql
993
+ advisory_locks: false
994
+ ```
720
995
 
721
- * Fix destroying existing object does not work well when optimistic locking enabled and
722
- `locking_column` is null in the database.
996
+ *Guo Xiang*
723
997
 
724
- *bogdanvlviv*
998
+ * SQLite3 adapter `alter_table` method restores foreign keys.
725
999
 
726
- * Use bulk INSERT to insert fixtures for better performance.
1000
+ *Yasuo Honda*
727
1001
 
728
- *Kir Shatrov*
1002
+ * Allow `:to_table` option to `invert_remove_foreign_key`.
729
1003
 
730
- * Prevent creation of bind param if casted value is nil.
1004
+ Example:
731
1005
 
732
- *Ryuta Kamizono*
1006
+ remove_foreign_key :accounts, to_table: :owners
1007
+
1008
+ *Nikolay Epifanov*, *Rich Chen*
1009
+
1010
+ * Add environment & load_config dependency to `bin/rake db:seed` to enable
1011
+ seed load in environments without Rails and custom DB configuration
733
1012
 
734
- * Deprecate passing arguments and block at the same time to `count` and `sum` in `ActiveRecord::Calculations`.
1013
+ *Tobias Bielohlawek*
1014
+
1015
+ * Fix default value for mysql time types with specified precision.
1016
+
1017
+ *Nikolay Kondratyev*
1018
+
1019
+ * Fix `touch` option to behave consistently with `Persistence#touch` method.
735
1020
 
736
1021
  *Ryuta Kamizono*
737
1022
 
738
- * Loading model schema from database is now thread-safe.
1023
+ * Migrations raise when duplicate column definition.
739
1024
 
740
- Fixes #28589.
1025
+ Fixes #33024.
741
1026
 
742
- *Vikrant Chaudhary*, *David Abdemoulaie*
1027
+ *Federico Martinez*
743
1028
 
744
- * Add `ActiveRecord::Base#cache_version` to support recyclable cache keys via the new versioned entries
745
- in `ActiveSupport::Cache`. This also means that `ActiveRecord::Base#cache_key` will now return a stable key
746
- that does not include a timestamp any more.
1029
+ * Bump minimum SQLite version to 3.8
747
1030
 
748
- NOTE: This feature is turned off by default, and `#cache_key` will still return cache keys with timestamps
749
- until you set `ActiveRecord::Base.cache_versioning = true`. That's the setting for all new apps on Rails 5.2+
1031
+ *Yasuo Honda*
750
1032
 
751
- *DHH*
1033
+ * Fix parent record should not get saved with duplicate children records.
1034
+
1035
+ Fixes #32940.
752
1036
 
753
- * Respect `SchemaDumper.ignore_tables` in rake tasks for databases structure dump.
1037
+ *Santosh Wadghule*
754
1038
 
755
- *Rusty Geldmacher*, *Guillermo Iguaran*
1039
+ * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
756
1040
 
757
- * Add type caster to `RuntimeReflection#alias_name`.
1041
+ *Brian Durand*
758
1042
 
759
- Fixes #28959.
1043
+ * Ensure `Associations::CollectionAssociation#size` and `Associations::CollectionAssociation#empty?`
1044
+ use loaded association ids if present.
760
1045
 
761
- *Jon Moss*
1046
+ *Graham Turner*
762
1047
 
763
- * Deprecate `supports_statement_cache?`.
1048
+ * Add support to preload associations of polymorphic associations when not all the records have the requested associations.
764
1049
 
765
- *Ryuta Kamizono*
1050
+ *Dana Sherson*
766
1051
 
767
- * Raise error `UnknownMigrationVersionError` on the movement of migrations
768
- when the current migration does not exist.
1052
+ * Add `touch_all` method to `ActiveRecord::Relation`.
769
1053
 
770
- *bogdanvlviv*
1054
+ Example:
771
1055
 
772
- * Fix `bin/rails db:forward` first migration.
1056
+ Person.where(name: "David").touch_all(time: Time.new(2020, 5, 16, 0, 0, 0))
773
1057
 
774
- *bogdanvlviv*
1058
+ *fatkodima*, *duggiefresh*
775
1059
 
776
- * Support Descending Indexes for MySQL.
1060
+ * Add `ActiveRecord::Base.base_class?` predicate.
777
1061
 
778
- MySQL 8.0.1 and higher supports descending indexes: `DESC` in an index definition is no longer ignored.
779
- See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
1062
+ *Bogdan Gusiev*
780
1063
 
781
- *Ryuta Kamizono*
1064
+ * Add custom prefix/suffix options to `ActiveRecord::Store.store_accessor`.
782
1065
 
783
- * Fix inconsistency with changed attributes when overriding Active Record attribute reader.
1066
+ *Tan Huynh*, *Yukio Mizuta*
784
1067
 
785
- *bogdanvlviv*
1068
+ * Rails 6 requires Ruby 2.5.0 or newer.
1069
+
1070
+ *Jeremy Daer*, *Kasper Timm Hansen*
1071
+
1072
+ * Deprecate `update_attributes`/`!` in favor of `update`/`!`.
1073
+
1074
+ *Eddie Lebow*
786
1075
 
787
- * When calling the dynamic fixture accessor method with no arguments, it now returns all fixtures of this type.
788
- Previously this method always returned an empty array.
1076
+ * Add `ActiveRecord::Base.create_or_find_by`/`!` to deal with the SELECT/INSERT race condition in
1077
+ `ActiveRecord::Base.find_or_create_by`/`!` by leaning on unique constraints in the database.
789
1078
 
790
- *Kevin McPhillips*
1079
+ *DHH*
1080
+
1081
+ * Add `Relation#pick` as short-hand for single-value plucks.
1082
+
1083
+ *DHH*
791
1084
 
792
1085
 
793
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activerecord/CHANGELOG.md) for previous changes.
1086
+ Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activerecord/CHANGELOG.md) for previous changes.