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