activerecord 5.2.3 → 6.0.0

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

Potentially problematic release.


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

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