activerecord 5.2.4 → 6.0.2.1

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

Potentially problematic release.


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

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