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