activerecord 6.0.3.5 → 6.1.0.rc1

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 (245) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +774 -735
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +2 -2
  5. data/lib/active_record.rb +7 -14
  6. data/lib/active_record/aggregations.rb +1 -1
  7. data/lib/active_record/association_relation.rb +22 -14
  8. data/lib/active_record/associations.rb +114 -11
  9. data/lib/active_record/associations/alias_tracker.rb +19 -15
  10. data/lib/active_record/associations/association.rb +40 -29
  11. data/lib/active_record/associations/association_scope.rb +17 -15
  12. data/lib/active_record/associations/belongs_to_association.rb +15 -5
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
  14. data/lib/active_record/associations/builder/association.rb +9 -3
  15. data/lib/active_record/associations/builder/belongs_to.rb +10 -7
  16. data/lib/active_record/associations/builder/collection_association.rb +5 -4
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -1
  18. data/lib/active_record/associations/builder/has_many.rb +6 -2
  19. data/lib/active_record/associations/builder/has_one.rb +11 -14
  20. data/lib/active_record/associations/builder/singular_association.rb +1 -1
  21. data/lib/active_record/associations/collection_association.rb +19 -6
  22. data/lib/active_record/associations/collection_proxy.rb +13 -5
  23. data/lib/active_record/associations/foreign_association.rb +13 -0
  24. data/lib/active_record/associations/has_many_association.rb +24 -2
  25. data/lib/active_record/associations/has_many_through_association.rb +10 -4
  26. data/lib/active_record/associations/has_one_association.rb +15 -1
  27. data/lib/active_record/associations/join_dependency.rb +72 -50
  28. data/lib/active_record/associations/join_dependency/join_association.rb +36 -14
  29. data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
  30. data/lib/active_record/associations/preloader.rb +11 -5
  31. data/lib/active_record/associations/preloader/association.rb +51 -25
  32. data/lib/active_record/associations/preloader/through_association.rb +2 -2
  33. data/lib/active_record/associations/singular_association.rb +1 -1
  34. data/lib/active_record/associations/through_association.rb +1 -1
  35. data/lib/active_record/attribute_assignment.rb +10 -8
  36. data/lib/active_record/attribute_methods.rb +52 -48
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  38. data/lib/active_record/attribute_methods/dirty.rb +1 -11
  39. data/lib/active_record/attribute_methods/primary_key.rb +6 -2
  40. data/lib/active_record/attribute_methods/query.rb +3 -6
  41. data/lib/active_record/attribute_methods/read.rb +8 -11
  42. data/lib/active_record/attribute_methods/serialization.rb +4 -4
  43. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -13
  44. data/lib/active_record/attribute_methods/write.rb +12 -20
  45. data/lib/active_record/attributes.rb +27 -7
  46. data/lib/active_record/autosave_association.rb +57 -40
  47. data/lib/active_record/base.rb +2 -14
  48. data/lib/active_record/callbacks.rb +32 -22
  49. data/lib/active_record/coders/yaml_column.rb +1 -1
  50. data/lib/active_record/connection_adapters.rb +50 -0
  51. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +186 -134
  52. data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
  53. data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -22
  54. data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -7
  55. data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
  56. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  57. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
  58. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +112 -27
  59. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
  60. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +224 -85
  61. data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -24
  62. data/lib/active_record/connection_adapters/abstract_adapter.rb +36 -69
  63. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +129 -88
  64. data/lib/active_record/connection_adapters/column.rb +15 -1
  65. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  66. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  67. data/lib/active_record/connection_adapters/mysql/database_statements.rb +23 -25
  68. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -1
  69. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  70. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +33 -6
  71. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
  72. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
  73. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +11 -7
  74. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  75. data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -12
  76. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  77. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  78. data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
  79. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +13 -54
  80. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  81. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  82. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  83. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -2
  84. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -2
  86. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +24 -5
  90. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -1
  91. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  92. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
  93. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +5 -1
  94. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +61 -29
  95. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  96. data/lib/active_record/connection_adapters/postgresql_adapter.rb +72 -55
  97. data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
  98. data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
  99. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +31 -6
  100. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -1
  101. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  102. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +37 -4
  103. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +49 -50
  104. data/lib/active_record/connection_handling.rb +210 -71
  105. data/lib/active_record/core.rb +220 -55
  106. data/lib/active_record/database_configurations.rb +124 -85
  107. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  108. data/lib/active_record/database_configurations/database_config.rb +52 -9
  109. data/lib/active_record/database_configurations/hash_config.rb +54 -8
  110. data/lib/active_record/database_configurations/url_config.rb +15 -40
  111. data/lib/active_record/delegated_type.rb +209 -0
  112. data/lib/active_record/destroy_association_async_job.rb +36 -0
  113. data/lib/active_record/enum.rb +27 -10
  114. data/lib/active_record/errors.rb +47 -12
  115. data/lib/active_record/explain.rb +9 -4
  116. data/lib/active_record/explain_subscriber.rb +1 -1
  117. data/lib/active_record/fixture_set/file.rb +10 -17
  118. data/lib/active_record/fixture_set/model_metadata.rb +1 -2
  119. data/lib/active_record/fixture_set/render_context.rb +1 -1
  120. data/lib/active_record/fixture_set/table_row.rb +2 -2
  121. data/lib/active_record/fixtures.rb +54 -8
  122. data/lib/active_record/gem_version.rb +3 -3
  123. data/lib/active_record/inheritance.rb +40 -18
  124. data/lib/active_record/insert_all.rb +33 -6
  125. data/lib/active_record/integration.rb +3 -5
  126. data/lib/active_record/internal_metadata.rb +15 -4
  127. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  128. data/lib/active_record/locking/optimistic.rb +22 -16
  129. data/lib/active_record/locking/pessimistic.rb +6 -2
  130. data/lib/active_record/log_subscriber.rb +26 -8
  131. data/lib/active_record/middleware/database_selector.rb +4 -1
  132. data/lib/active_record/middleware/database_selector/resolver.rb +5 -0
  133. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  134. data/lib/active_record/migration.rb +113 -83
  135. data/lib/active_record/migration/command_recorder.rb +47 -27
  136. data/lib/active_record/migration/compatibility.rb +67 -17
  137. data/lib/active_record/model_schema.rb +88 -13
  138. data/lib/active_record/nested_attributes.rb +2 -3
  139. data/lib/active_record/no_touching.rb +1 -1
  140. data/lib/active_record/persistence.rb +50 -45
  141. data/lib/active_record/query_cache.rb +15 -5
  142. data/lib/active_record/querying.rb +11 -6
  143. data/lib/active_record/railtie.rb +64 -44
  144. data/lib/active_record/railties/databases.rake +253 -98
  145. data/lib/active_record/readonly_attributes.rb +4 -0
  146. data/lib/active_record/reflection.rb +70 -57
  147. data/lib/active_record/relation.rb +96 -67
  148. data/lib/active_record/relation/batches.rb +38 -31
  149. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  150. data/lib/active_record/relation/calculations.rb +101 -44
  151. data/lib/active_record/relation/delegation.rb +2 -1
  152. data/lib/active_record/relation/finder_methods.rb +45 -15
  153. data/lib/active_record/relation/from_clause.rb +1 -1
  154. data/lib/active_record/relation/merger.rb +27 -25
  155. data/lib/active_record/relation/predicate_builder.rb +57 -33
  156. data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
  157. data/lib/active_record/relation/predicate_builder/association_query_value.rb +2 -2
  158. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +3 -3
  159. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  160. data/lib/active_record/relation/query_methods.rb +330 -195
  161. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  162. data/lib/active_record/relation/spawn_methods.rb +6 -5
  163. data/lib/active_record/relation/where_clause.rb +104 -57
  164. data/lib/active_record/result.rb +41 -33
  165. data/lib/active_record/runtime_registry.rb +2 -2
  166. data/lib/active_record/sanitization.rb +6 -17
  167. data/lib/active_record/schema_dumper.rb +34 -4
  168. data/lib/active_record/schema_migration.rb +0 -4
  169. data/lib/active_record/scoping/named.rb +6 -17
  170. data/lib/active_record/secure_token.rb +16 -8
  171. data/lib/active_record/serialization.rb +5 -3
  172. data/lib/active_record/signed_id.rb +116 -0
  173. data/lib/active_record/statement_cache.rb +20 -4
  174. data/lib/active_record/store.rb +2 -2
  175. data/lib/active_record/suppressor.rb +2 -2
  176. data/lib/active_record/table_metadata.rb +36 -52
  177. data/lib/active_record/tasks/database_tasks.rb +139 -113
  178. data/lib/active_record/tasks/mysql_database_tasks.rb +34 -35
  179. data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -26
  180. data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -9
  181. data/lib/active_record/test_databases.rb +5 -4
  182. data/lib/active_record/test_fixtures.rb +37 -16
  183. data/lib/active_record/timestamp.rb +4 -6
  184. data/lib/active_record/touch_later.rb +21 -21
  185. data/lib/active_record/transactions.rb +15 -64
  186. data/lib/active_record/type.rb +8 -1
  187. data/lib/active_record/type/serialized.rb +6 -2
  188. data/lib/active_record/type/time.rb +10 -0
  189. data/lib/active_record/type_caster/connection.rb +0 -1
  190. data/lib/active_record/type_caster/map.rb +8 -5
  191. data/lib/active_record/validations.rb +1 -0
  192. data/lib/active_record/validations/numericality.rb +35 -0
  193. data/lib/active_record/validations/uniqueness.rb +24 -4
  194. data/lib/arel.rb +5 -13
  195. data/lib/arel/attributes/attribute.rb +4 -0
  196. data/lib/arel/collectors/bind.rb +5 -0
  197. data/lib/arel/collectors/composite.rb +8 -0
  198. data/lib/arel/collectors/sql_string.rb +7 -0
  199. data/lib/arel/collectors/substitute_binds.rb +7 -0
  200. data/lib/arel/nodes.rb +3 -1
  201. data/lib/arel/nodes/binary.rb +82 -8
  202. data/lib/arel/nodes/bind_param.rb +8 -0
  203. data/lib/arel/nodes/casted.rb +21 -9
  204. data/lib/arel/nodes/equality.rb +6 -9
  205. data/lib/arel/nodes/grouping.rb +3 -0
  206. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  207. data/lib/arel/nodes/in.rb +8 -1
  208. data/lib/arel/nodes/infix_operation.rb +13 -1
  209. data/lib/arel/nodes/join_source.rb +1 -1
  210. data/lib/arel/nodes/node.rb +7 -6
  211. data/lib/arel/nodes/ordering.rb +27 -0
  212. data/lib/arel/nodes/sql_literal.rb +3 -0
  213. data/lib/arel/nodes/table_alias.rb +7 -3
  214. data/lib/arel/nodes/unary.rb +0 -1
  215. data/lib/arel/predications.rb +12 -18
  216. data/lib/arel/select_manager.rb +1 -2
  217. data/lib/arel/table.rb +13 -5
  218. data/lib/arel/visitors.rb +0 -7
  219. data/lib/arel/visitors/dot.rb +14 -2
  220. data/lib/arel/visitors/mysql.rb +11 -1
  221. data/lib/arel/visitors/postgresql.rb +15 -4
  222. data/lib/arel/visitors/to_sql.rb +89 -78
  223. data/lib/rails/generators/active_record/migration.rb +6 -1
  224. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  225. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
  226. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +3 -3
  227. data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
  228. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  229. metadata +27 -28
  230. data/lib/active_record/advisory_lock_base.rb +0 -18
  231. data/lib/active_record/attribute_decorators.rb +0 -88
  232. data/lib/active_record/connection_adapters/connection_specification.rb +0 -296
  233. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  234. data/lib/active_record/define_callbacks.rb +0 -22
  235. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  236. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  237. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  238. data/lib/arel/attributes.rb +0 -22
  239. data/lib/arel/visitors/depth_first.rb +0 -203
  240. data/lib/arel/visitors/ibm_db.rb +0 -34
  241. data/lib/arel/visitors/informix.rb +0 -62
  242. data/lib/arel/visitors/mssql.rb +0 -156
  243. data/lib/arel/visitors/oracle.rb +0 -158
  244. data/lib/arel/visitors/oracle12.rb +0 -65
  245. data/lib/arel/visitors/where_sql.rb +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81509c096d5c718a2f031bb02276ffa200df9f23f6b95ca4ee001ff4b0ed3f0b
4
- data.tar.gz: 171cbbd2a3dea6f8156b6662b47787ff29f0d538d24675321cd48875f7968faa
3
+ metadata.gz: 66ac86600eb6f03cff86765392e7ec1baf5741aca1050133653dab7d9552ede3
4
+ data.tar.gz: ab475bbab2246deea73d3d699374c6f309fdddc97f467d783695af1e737cb352
5
5
  SHA512:
6
- metadata.gz: b2c8ab3ddce74dcccaa27d4260db49ac55667e9a440c2187a0133ff211ec1305159ee3b74b71009ab59c5908d1d5d50b6be59191dd282d1e2dbf1198465556cc
7
- data.tar.gz: f2d64203c46ec1cc691a0b46c3e3e84c602267596bd807f212ef43e285248a0e5051e30a2ae0c34fcd0528fa4856e0d509b3ac65f89b1600b8304aa7a7cb2ca8
6
+ metadata.gz: 51480027525839e315d70abb310a433cfa48c9fb25084ba13ce4d18d205e0d3eb4ae79fe259716a15c055e7083d381e590ddc4e6829662c21276cacf70845834
7
+ data.tar.gz: ec51c2bc1172ec830f700aea91674fed170a9d362c7a8be600328055db0132d79b38049d8ee9ad03729b962c7667982519b3fb0bfa8569cac7c3686c8f73ebd3
data/CHANGELOG.md CHANGED
@@ -1,1232 +1,1271 @@
1
- ## Rails 6.0.3.5 (February 10, 2021) ##
1
+ ## Rails 6.1.0.rc1 (November 02, 2020) ##
2
2
 
3
- * Fix possible DoS vector in PostgreSQL money type
3
+ * Add `connected_to_many` API.
4
4
 
5
- Carefully crafted input can cause a DoS via the regular expressions used
6
- for validating the money format in the PostgreSQL adapter. This patch
7
- fixes the regexp.
5
+ This API allows applications to connect to multiple databases at once without switching all of them or implementing a deeply nested stack.
8
6
 
9
- Thanks to @dee-see from Hackerone for this patch!
10
-
11
- [CVE-2021-22880]
12
-
13
- *Aaron Patterson*
7
+ Before:
14
8
 
9
+ AnimalsRecord.connected_to(role: :reading) do
10
+ MealsRecord.connected_to(role: :reading) do
11
+ Dog.first # read from animals replica
12
+ Dinner.first # read from meals replica
13
+ Person.first # read from primary writer
14
+ end
15
+ end
15
16
 
16
- ## Rails 6.0.3.4 (October 07, 2020) ##
17
+ After:
17
18
 
18
- * No changes.
19
+ ActiveRecord::Base.connected_to_many([AnimalsRecord, MealsRecord], role: :reading) do
20
+ Dog.first # read from animals replica
21
+ Dinner.first # read from meals replica
22
+ Person.first # read from primary writer
23
+ end
19
24
 
25
+ *Eileen M. Uchitelle*, *John Crepezzi*
20
26
 
21
- ## Rails 6.0.3.3 (September 09, 2020) ##
27
+ * Add option to raise or log for `ActiveRecord::StrictLoadingViolationError`.
22
28
 
23
- * No changes.
29
+ Some applications may not want to raise an error in production if using `strict_loading`. This would allow an application to set strict loading to log for the production environment while still raising in development and test environments.
24
30
 
31
+ Set `config.active_record.action_on_strict_loading_violation` to `:log` errors instead of raising.
25
32
 
26
- ## Rails 6.0.3.2 (June 17, 2020) ##
33
+ *Eileen M. Uchitelle*
27
34
 
28
- * No changes.
35
+ * Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
29
36
 
37
+ Fixes #34255.
30
38
 
31
- ## Rails 6.0.3.1 (May 18, 2020) ##
39
+ *Steven Weber*
32
40
 
33
- * No changes.
41
+ * Optimise the length of index names for polymorphic references by using the reference name rather than the type and id column names.
34
42
 
43
+ Because the default behaviour when adding an index with multiple columns is to use all column names in the index name, this could frequently lead to overly long index names for polymorphic references which would fail the migration if it exceeded the database limit.
35
44
 
36
- ## Rails 6.0.3 (May 06, 2020) ##
45
+ This change reduces the chance of that happening by using the reference name, e.g. `index_my_table_on_my_reference`.
37
46
 
38
- * Recommend applications don't use the `database` kwarg in `connected_to`
47
+ Fixes #38655.
39
48
 
40
- The database kwarg in `connected_to` was meant to be used for one-off scripts but is often used in requests. This is really dangerous because it re-establishes a connection every time. It's deprecated in 6.1 and will be removed in 6.2 without replacement. This change soft deprecates it in 6.0 by removing documentation.
49
+ *Luke Redpath*
41
50
 
42
- *Eileen M. Uchitelle*
51
+ * MySQL: Uniqueness validator now respects default database collation,
52
+ no longer enforce case sensitive comparison by default.
43
53
 
44
- * Fix support for PostgreSQL 11+ partitioned indexes.
54
+ *Ryuta Kamizono*
45
55
 
46
- *Sebastián Palma*
56
+ * Remove deprecated methods from `ActiveRecord::ConnectionAdapters::DatabaseLimits`.
47
57
 
48
- * Add support for beginless ranges, introduced in Ruby 2.7.
58
+ `column_name_length`
59
+ `table_name_length`
60
+ `columns_per_table`
61
+ `indexes_per_table`
62
+ `columns_per_multicolumn_index`
63
+ `sql_query_length`
64
+ `joins_per_query`
49
65
 
50
- *Josh Goodall*
66
+ *Rafael Mendonça França*
51
67
 
52
- * Fix insert_all with enum values
68
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?`.
53
69
 
54
- Fixes #38716.
70
+ *Rafael Mendonça França*
55
71
 
56
- *Joel Blum*
72
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?`.
57
73
 
58
- * Regexp-escape table name for MS SQL
74
+ *Rafael Mendonça França*
59
75
 
60
- Add `Regexp.escape` to one method in ActiveRecord, so that table names with regular expression characters in them work as expected. Since MS SQL Server uses "[" and "]" to quote table and column names, and those characters are regular expression characters, methods like `pluck` and `select` fail in certain cases when used with the MS SQL Server adapter.
76
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?`.
61
77
 
62
- *Larry Reid*
78
+ *Rafael Mendonça França*
63
79
 
64
- * Store advisory locks on their own named connection.
80
+ * Remove deprecated `ActiveRecord::Base#update_attributes` and `ActiveRecord::Base#update_attributes!`.
65
81
 
66
- Previously advisory locks were taken out against a connection when a migration started. This works fine in single database applications but doesn't work well when migrations need to open new connections which results in the lock getting dropped.
82
+ *Rafael Mendonça França*
67
83
 
68
- In order to fix this we are storing the advisory lock on a new connection with the connection specification name `AdisoryLockBase`. The caveat is that we need to maintain at least 2 connections to a database while migrations are running in order to do this.
84
+ * Remove deprecated `migrations_path` argument in `ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version`.
69
85
 
70
- *Eileen M. Uchitelle*, *John Crepezzi*
86
+ *Rafael Mendonça França*
71
87
 
72
- * Ensure `:reading` connections always raise if a write is attempted.
88
+ * Remove deprecated `config.active_record.sqlite3.represent_boolean_as_integer`.
73
89
 
74
- Now Rails will raise an `ActiveRecord::ReadOnlyError` if any connection on the reading handler attempts to make a write. If your reading role needs to write you should name the role something other than `:reading`.
90
+ *Rafael Mendonça França*
75
91
 
76
- *Eileen M. Uchitelle*
92
+ * `relation.create` does no longer leak scope to class level querying methods
93
+ in initialization block and callbacks.
77
94
 
78
- * Enforce fresh ETag header after a collection's contents change by adding
79
- ActiveRecord::Relation#cache_key_with_version. This method will be used by
80
- ActionController::ConditionalGet to ensure that when collection cache versioning
81
- is enabled, requests using ConditionalGet don't return the same ETag header
82
- after a collection is modified. Fixes #38078.
95
+ Before:
83
96
 
84
- *Aaron Lipman*
97
+ User.where(name: "John").create do |john|
98
+ User.find_by(name: "David") # => nil
99
+ end
85
100
 
86
- * A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgresSQL `options`.
101
+ After:
87
102
 
88
- *Joshua Flanagan*
103
+ User.where(name: "John").create do |john|
104
+ User.find_by(name: "David") # => #<User name: "David", ...>
105
+ end
89
106
 
90
- * Retain explicit selections on the base model after applying `includes` and `joins`.
107
+ *Ryuta Kamizono*
91
108
 
92
- Resolves #34889.
109
+ * Named scope chain does no longer leak scope to class level querying methods.
93
110
 
94
- *Patrick Rebsch*
111
+ class class User < ActiveRecord::Base
112
+ scope :david, -> { User.where(name: "David") }
113
+ end
95
114
 
115
+ Before:
96
116
 
97
- ## Rails 6.0.2.2 (March 19, 2020) ##
117
+ User.where(name: "John").david
118
+ # SELECT * FROM users WHERE name = 'John' AND name = 'David'
98
119
 
99
- * No changes.
120
+ After:
100
121
 
122
+ User.where(name: "John").david
123
+ # SELECT * FROM users WHERE name = 'David'
101
124
 
102
- ## Rails 6.0.2.1 (December 18, 2019) ##
125
+ *Ryuta Kamizono*
103
126
 
104
- * No changes.
127
+ * Remove deprecated methods from `ActiveRecord::DatabaseConfigurations`.
105
128
 
129
+ `fetch`
130
+ `each`
131
+ `first`
132
+ `values`
133
+ `[]=`
106
134
 
107
- ## Rails 6.0.2 (December 13, 2019) ##
135
+ *Rafael Mendonça França*
108
136
 
109
- * Share the same connection pool for primary and replica databases in the
110
- transactional tests for the same database.
137
+ * `where.not` now generates NAND predicates instead of NOR.
111
138
 
112
- *Edouard Chin*
139
+ Before:
113
140
 
114
- * Fix the preloader when one record is fetched using `after_initialize`
115
- but not the entire collection.
141
+ User.where.not(name: "Jon", role: "admin")
142
+ # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
116
143
 
117
- *Bradley Price*
144
+ After:
118
145
 
119
- * Fix collection callbacks not terminating when `:abort` is thrown.
146
+ User.where.not(name: "Jon", role: "admin")
147
+ # SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
120
148
 
121
- *Edouard Chin*, *Ryuta Kamizono*
149
+ *Rafael Mendonça França*
122
150
 
123
- * Correctly deprecate `where.not` working as NOR for relations.
151
+ * Remove deprecated `ActiveRecord::Result#to_hash` method.
124
152
 
125
- 12a9664 deprecated where.not working as NOR, however
126
- doing a relation query like `where.not(relation: { ... })`
127
- wouldn't be properly deprecated and `where.not` would work as
128
- NAND instead.
153
+ *Rafael Mendonça França*
129
154
 
130
- *Edouard Chin*
155
+ * Deprecate `ActiveRecord::Base.allow_unsafe_raw_sql`.
131
156
 
132
- * Fix `db:migrate` task with multiple databases to restore the connection
133
- to the previous database.
157
+ *Rafael Mendonça França*
134
158
 
135
- The migrate task iterates and establish a connection over each db
136
- resulting in the last one to be used by subsequent rake tasks.
137
- We should reestablish a connection to the connection that was
138
- established before the migrate tasks was run
159
+ * Remove deprecated support for using unsafe raw SQL in `ActiveRecord::Relation` methods.
139
160
 
140
- *Edouard Chin*
161
+ *Rafael Mendonça França*
141
162
 
142
- * Fix multi-threaded issue for `AcceptanceValidator`.
163
+ * Allow users to silence the "Rails couldn't infer whether you are using multiple databases..."
164
+ message using `config.active_record.suppress_multiple_database_warning`.
143
165
 
144
- *Ryuta Kamizono*
166
+ *Omri Gabay*
145
167
 
168
+ * Connections can be granularly switched for abstract classes when `connected_to` is called.
146
169
 
147
- ## Rails 6.0.1 (November 5, 2019) ##
170
+ This change allows `connected_to` to switch a `role` and/or `shard` for a single abstract class instead of all classes globally. Applications that want to use the new feature need to set `config.active_record.legacy_connection_handling` to `false` in their application configuration.
148
171
 
149
- * Common Table Expressions are allowed on read-only connections.
172
+ Example usage:
150
173
 
151
- *Chris Morris*
174
+ Given an application we have a `User` model that inherits from `ApplicationRecord` and a `Dog` model that inherits from `AnimalsRecord`. `AnimalsRecord` and `ApplicationRecord` have writing and reading connections as well as shard `default`, `one`, and `two`.
152
175
 
153
- * New record instantiation respects `unscope`.
176
+ ```ruby
177
+ ActiveRecord::Base.connected_to(role: :reading) do
178
+ User.first # reads from default replica
179
+ Dog.first # reads from default replica
154
180
 
155
- *Ryuta Kamizono*
181
+ AnimalsRecord.connected_to(role: :writing, shard: :one) do
182
+ User.first # reads from default replica
183
+ Dog.first # reads from shard one primary
184
+ end
156
185
 
157
- * Fixed a case where `find_in_batches` could halt too early.
186
+ User.first # reads from default replica
187
+ Dog.first # reads from default replica
158
188
 
159
- *Takayuki Nakata*
189
+ ApplicationRecord.connected_to(role: :writing, shard: :two) do
190
+ User.first # reads from shard two primary
191
+ Dog.first # reads from default replica
192
+ end
193
+ end
194
+ ```
160
195
 
161
- * Autosaved associations always perform validations when a custom validation
162
- context is used.
196
+ *Eileen M. Uchitelle*, *John Crepezzi*
163
197
 
164
- *Tekin Suleyman*
198
+ * Allow double-dash comment syntax when querying read-only databases
165
199
 
166
- * `sql.active_record` notifications now include the `:connection` in
167
- their payloads.
200
+ *James Adam*
168
201
 
169
- *Eugene Kenny*
202
+ * Add `values_at` method.
170
203
 
171
- * A rollback encountered in an `after_commit` callback does not reset
172
- previously-committed record state.
204
+ Returns an array containing the values associated with the given methods.
173
205
 
174
- *Ryuta Kamizono*
206
+ ```ruby
207
+ topic = Topic.first
208
+ topic.values_at(:title, :author_name)
209
+ # => ["Budget", "Jason"]
210
+ ```
175
211
 
176
- * Fixed that join order was lost when eager-loading.
212
+ Similar to `Hash#values_at` but on an Active Record instance.
177
213
 
178
- *Ryuta Kamizono*
214
+ *Guillaume Briday*
179
215
 
180
- * `DESCRIBE` queries are allowed on read-only connections.
216
+ * Fix `read_attribute_before_type_cast` to consider attribute aliases.
181
217
 
182
- *Dylan Thacker-Smith*
218
+ *Marcelo Lauxen*
183
219
 
184
- * Fixed that records that had been `inspect`ed could not be marshaled.
220
+ * Support passing record to uniqueness validator `:conditions` callable:
185
221
 
186
- *Eugene Kenny*
222
+ ```ruby
223
+ class Article < ApplicationRecord
224
+ validates_uniqueness_of :title, conditions: ->(article) {
225
+ published_at = article.published_at
226
+ where(published_at: published_at.beginning_of_year..published_at.end_of_year)
227
+ }
228
+ end
229
+ ```
187
230
 
188
- * The connection pool reaper thread is respawned in forked processes. This
189
- fixes that idle connections in forked processes wouldn't be reaped.
231
+ *Eliot Sykes*
190
232
 
191
- *John Hawthorn*
233
+ * `BatchEnumerator#update_all` and `BatchEnumerator#delete_all` now return the
234
+ total number of rows affected, just like their non-batched counterparts.
192
235
 
193
- * The memoized result of `ActiveRecord::Relation#take` is properly cleared
194
- when `ActiveRecord::Relation#reset` or `ActiveRecord::Relation#reload`
195
- is called.
236
+ ```ruby
237
+ Person.in_batches.update_all("first_name = 'Eugene'") # => 42
238
+ Person.in_batches.delete_all # => 42
239
+ ```
196
240
 
197
- *Anmol Arora*
241
+ Fixes #40287.
198
242
 
199
- * Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
243
+ *Eugene Kenny*
200
244
 
201
- *Hiroyuki Ishii*
245
+ * Add support for PostgreSQL `interval` data type with conversion to
246
+ `ActiveSupport::Duration` when loading records from database and
247
+ serialization to ISO 8601 formatted duration string on save.
248
+ Add support to define a column in migrations and get it in a schema dump.
249
+ Optional column precision is supported.
202
250
 
203
- * `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
251
+ To use this in 6.1, you need to place the next string to your model file:
204
252
 
205
- *Eugene Kenny*
253
+ attribute :duration, :interval
206
254
 
207
- * Call `while_preventing_writes` directly from `connected_to`.
255
+ To keep old behavior until 6.2 is released:
208
256
 
209
- 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)`.
257
+ attribute :duration, :string
210
258
 
211
- 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.
259
+ Example:
212
260
 
213
- *Eileen M. Uchitelle*
261
+ create_table :events do |t|
262
+ t.string :name
263
+ t.interval :duration
264
+ end
214
265
 
215
- * Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
266
+ class Event < ApplicationRecord
267
+ attribute :duration, :interval
268
+ end
216
269
 
217
- *Kir Shatrov*
270
+ Event.create!(name: 'Rock Fest', duration: 2.days)
271
+ Event.last.duration # => 2 days
272
+ Event.last.duration.iso8601 # => "P2D"
273
+ Event.new(duration: 'P1DT12H3S').duration # => 1 day, 12 hours, and 3 seconds
274
+ Event.new(duration: '1 day') # Unknown value will be ignored and NULL will be written to database
218
275
 
276
+ *Andrey Novikov*
219
277
 
220
- ## Rails 6.0.0 (August 16, 2019) ##
278
+ * Allow associations supporting the `dependent:` key to take `dependent: :destroy_async`.
221
279
 
222
- * Preserve user supplied joins order as much as possible.
280
+ ```ruby
281
+ class Account < ActiveRecord::Base
282
+ belongs_to :supplier, dependent: :destroy_async
283
+ end
284
+ ```
223
285
 
224
- Fixes #36761, #34328, #24281, #12953.
286
+ `:destroy_async` will enqueue a job to destroy associated records in the background.
225
287
 
226
- *Ryuta Kamizono*
288
+ *DHH*, *George Claghorn*, *Cory Gwin*, *Rafael Mendonça França*, *Adrianna Chang*
227
289
 
228
- * Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
290
+ * Add `SKIP_TEST_DATABASE` environment variable to disable modifying the test database when `rails db:create` and `rails db:drop` are called.
229
291
 
230
- *John Crepezzi*, *Eileen Uchitelle*
292
+ *Jason Schweier*
231
293
 
232
- * Add a warning for enum elements with 'not_' prefix.
294
+ * `connects_to` can only be called on `ActiveRecord::Base` or abstract classes.
233
295
 
234
- class Foo
235
- enum status: [:sent, :not_sent]
236
- end
296
+ Ensure that `connects_to` can only be called from `ActiveRecord::Base` or abstract classes. This protects the application from opening duplicate or too many connections.
237
297
 
238
- *Edu Depetris*
298
+ *Eileen M. Uchitelle*, *John Crepezzi*
239
299
 
240
- * Make currency symbols optional for money column type in PostgreSQL
300
+ * All connection adapters `execute` now raises `ActiveRecord::ConnectionNotEstablished` rather than
301
+ `ActiveRecord::StatementInvalid` when they encounter a connection error.
241
302
 
242
- *Joel Schneider*
303
+ *Jean Boussier*
243
304
 
305
+ * `Mysql2Adapter#quote_string` now raises `ActiveRecord::ConnectionNotEstablished` rather than
306
+ `ActiveRecord::StatementInvalid` when it can't connect to the MySQL server.
244
307
 
245
- ## Rails 6.0.0.rc2 (July 22, 2019) ##
308
+ *Jean Boussier*
246
309
 
247
- * Add database_exists? method to connection adapters to check if a database exists.
310
+ * Add support for check constraints that are `NOT VALID` via `validate: false` (PostgreSQL-only).
248
311
 
249
- *Guilherme Mansur*
312
+ *Alex Robbin*
250
313
 
251
- * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
314
+ * Ensure the default configuration is considered primary or first for an environment
252
315
 
253
- Fixes #36022.
316
+ If a multiple database application provides a configuration named primary, that will be treated as default. In applications that do not have a primary entry, the default database configuration will be the first configuration for an environment.
254
317
 
255
- *Ryuta Kamizono*
318
+ *Eileen M. Uchitelle*
256
319
 
257
- * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
320
+ * Allow `where` references association names as joined table name aliases.
258
321
 
259
- Fixes #36465.
322
+ ```ruby
323
+ class Comment < ActiveRecord::Base
324
+ enum label: [:default, :child]
325
+ has_many :children, class_name: "Comment", foreign_key: :parent_id
326
+ end
260
327
 
261
- *Jeff Doering*
328
+ # ... FROM comments LEFT OUTER JOIN comments children ON ... WHERE children.label = 1
329
+ Comment.includes(:children).where("children.label": "child")
330
+ ```
262
331
 
263
- * Fix sqlite3 collation parsing when using decimal columns.
332
+ *Ryuta Kamizono*
264
333
 
265
- *Martin R. Schuster*
334
+ * Support storing demodulized class name for polymorphic type.
266
335
 
267
- * Fix invalid schema when primary key column has a comment.
336
+ Before Rails 6.1, storing demodulized class name is supported only for STI type
337
+ by `store_full_sti_class` class attribute.
268
338
 
269
- Fixes #29966.
339
+ Now `store_full_class_name` class attribute can handle both STI and polymorphic types.
270
340
 
271
- *Guilherme Goettems Schneider*
341
+ *Ryuta Kamizono*
272
342
 
273
- * Fix table comment also being applied to the primary key column.
343
+ * Deprecate `rails db:structure:{load, dump}` tasks and extend
344
+ `rails db:schema:{load, dump}` tasks to work with either `:ruby` or `:sql` format,
345
+ depending on `config.active_record.schema_format` configuration value.
274
346
 
275
- *Guilherme Goettems Schneider*
347
+ *fatkodima*
276
348
 
277
- * Fix merging left_joins to maintain its own `join_type` context.
349
+ * Respect the `select` values for eager loading.
278
350
 
279
- Fixes #36103.
351
+ ```ruby
352
+ post = Post.select("UPPER(title) AS title").first
353
+ post.title # => "WELCOME TO THE WEBLOG"
354
+ post.body # => ActiveModel::MissingAttributeError
355
+
356
+ # Rails 6.0 (ignore the `select` values)
357
+ post = Post.select("UPPER(title) AS title").eager_load(:comments).first
358
+ post.title # => "Welcome to the weblog"
359
+ post.body # => "Such a lovely day"
360
+
361
+ # Rails 6.1 (respect the `select` values)
362
+ post = Post.select("UPPER(title) AS title").eager_load(:comments).first
363
+ post.title # => "WELCOME TO THE WEBLOG"
364
+ post.body # => ActiveModel::MissingAttributeError
365
+ ```
280
366
 
281
367
  *Ryuta Kamizono*
282
368
 
369
+ * Allow attribute's default to be configured but keeping its own type.
370
+
371
+ ```ruby
372
+ class Post < ActiveRecord::Base
373
+ attribute :written_at, default: -> { Time.now.utc }
374
+ end
283
375
 
284
- ## Rails 6.0.0.rc1 (April 24, 2019) ##
376
+ # Rails 6.0
377
+ Post.type_for_attribute(:written_at) # => #<Type::Value ... precision: nil, ...>
285
378
 
286
- * Add `touch` option to `has_one` association.
379
+ # Rails 6.1
380
+ Post.type_for_attribute(:written_at) # => #<Type::DateTime ... precision: 6, ...>
381
+ ```
287
382
 
288
- *Abhay Nikam*
383
+ *Ryuta Kamizono*
289
384
 
290
- * Deprecate `where.not` working as NOR and will be changed to NAND in Rails 6.1.
385
+ * Allow default to be configured for Enum.
291
386
 
292
387
  ```ruby
293
- all = [treasures(:diamond), treasures(:sapphire), cars(:honda), treasures(:sapphire)]
294
- assert_equal all, PriceEstimate.all.map(&:estimate_of)
388
+ class Book < ActiveRecord::Base
389
+ enum status: [:proposed, :written, :published], _default: :published
390
+ end
391
+
392
+ Book.new.status # => "published"
295
393
  ```
296
394
 
297
- In Rails 6.0:
395
+ *Ryuta Kamizono*
298
396
 
299
- ```ruby
300
- sapphire = treasures(:sapphire)
301
-
302
- nor = all.reject { |e|
303
- e.estimate_of_type == sapphire.class.polymorphic_name
304
- }.reject { |e|
305
- e.estimate_of_id == sapphire.id
306
- }
307
- assert_equal [cars(:honda)], nor
308
-
309
- without_sapphire = PriceEstimate.where.not(
310
- estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
311
- )
312
- assert_equal nor, without_sapphire.map(&:estimate_of)
313
- ```
397
+ * Deprecate YAML loading from legacy format older than Rails 5.0.
314
398
 
315
- In Rails 6.1:
399
+ *Ryuta Kamizono*
316
400
 
317
- ```ruby
318
- sapphire = treasures(:sapphire)
401
+ * Added the setting `ActiveRecord::Base.immutable_strings_by_default`, which
402
+ allows you to specify that all string columns should be frozen unless
403
+ otherwise specified. This will reduce memory pressure for applications which
404
+ do not generally mutate string properties of Active Record objects.
319
405
 
320
- nand = all - [sapphire]
321
- assert_equal [treasures(:diamond), cars(:honda)], nand
406
+ *Sean Griffin*, *Ryuta Kamizono*
322
407
 
323
- without_sapphire = PriceEstimate.where.not(
324
- estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
325
- )
326
- assert_equal nand, without_sapphire.map(&:estimate_of)
327
- ```
408
+ * Deprecate `map!` and `collect!` on `ActiveRecord::Result`.
328
409
 
329
410
  *Ryuta Kamizono*
330
411
 
331
- * Fix dirty tracking after rollback.
412
+ * Support `relation.and` for intersection as Set theory.
413
+
414
+ ```ruby
415
+ david_and_mary = Author.where(id: [david, mary])
416
+ mary_and_bob = Author.where(id: [mary, bob])
417
+
418
+ david_and_mary.merge(mary_and_bob) # => [mary, bob]
332
419
 
333
- Fixes #15018, #30167, #33868.
420
+ david_and_mary.and(mary_and_bob) # => [mary]
421
+ david_and_mary.or(mary_and_bob) # => [david, mary, bob]
422
+ ```
334
423
 
335
424
  *Ryuta Kamizono*
336
425
 
337
- * Add `ActiveRecord::Relation#cache_version` to support recyclable cache keys via
338
- the versioned entries in `ActiveSupport::Cache`. This also means that
339
- `ActiveRecord::Relation#cache_key` will now return a stable key that does not
340
- include the max timestamp or count any more.
426
+ * Merging conditions on the same column no longer maintain both conditions,
427
+ and will be consistently replaced by the latter condition in Rails 6.2.
428
+ To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
341
429
 
342
- NOTE: This feature is turned off by default, and `cache_key` will still return
343
- cache keys with timestamps until you set `ActiveRecord::Base.collection_cache_versioning = true`.
344
- That's the setting for all new apps on Rails 6.0+
430
+ ```ruby
431
+ # Rails 6.1 (IN clause is replaced by merger side equality condition)
432
+ Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
345
433
 
346
- *Lachlan Sylvester*
434
+ # Rails 6.1 (both conflict conditions exists, deprecated)
435
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
347
436
 
348
- * Fix dirty tracking for `touch` to track saved changes.
437
+ # Rails 6.1 with rewhere to migrate to Rails 6.2's behavior
438
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
349
439
 
350
- Fixes #33429.
440
+ # Rails 6.2 (same behavior with IN clause, mergee side condition is consistently replaced)
441
+ Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
442
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
443
+ ```
351
444
 
352
- *Ryuta Kamzono*
445
+ *Ryuta Kamizono*
353
446
 
354
- * `change_column_comment` and `change_table_comment` are invertible only if
355
- `to` and `from` options are specified.
447
+ * Do not mark Postgresql MAC address and UUID attributes as changed when the assigned value only varies by case.
356
448
 
357
- *Yoshiyuki Kinjo*
449
+ *Peter Fry*
358
450
 
359
- * Don't call commit/rollback callbacks when a record isn't saved.
451
+ * Resolve issue with insert_all unique_by option when used with expression index.
360
452
 
361
- Fixes #29747.
453
+ When the `:unique_by` option of `ActiveRecord::Persistence.insert_all` and
454
+ `ActiveRecord::Persistence.upsert_all` was used with the name of an expression index, an error
455
+ was raised. Adding a guard around the formatting behavior for the `:unique_by` corrects this.
362
456
 
363
- *Ryuta Kamizono*
457
+ Usage:
364
458
 
365
- * Fix circular `autosave: true` causes invalid records to be saved.
459
+ ```ruby
460
+ create_table :books, id: :integer, force: true do |t|
461
+ t.column :name, :string
462
+ t.index "lower(name)", unique: true
463
+ end
366
464
 
367
- Prior to the fix, when there was a circular series of `autosave: true`
368
- associations, the callback for a `has_many` association was run while
369
- another instance of the same callback on the same association hadn't
370
- finished running. When control returned to the first instance of the
371
- callback, the instance variable had changed, and subsequent associated
372
- records weren't saved correctly. Specifically, the ID field for the
373
- `belongs_to` corresponding to the `has_many` was `nil`.
465
+ Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
466
+ ```
374
467
 
375
- Fixes #28080.
468
+ Fixes #39516.
376
469
 
377
- *Larry Reid*
470
+ *Austen Madden*
378
471
 
379
- * Raise `ArgumentError` for invalid `:limit` and `:precision` like as other options.
472
+ * Add basic support for CHECK constraints to database migrations.
380
473
 
381
- Before:
474
+ Usage:
382
475
 
383
476
  ```ruby
384
- add_column :items, :attr1, :binary, size: 10 # => ArgumentError
385
- add_column :items, :attr2, :decimal, scale: 10 # => ArgumentError
386
- add_column :items, :attr3, :integer, limit: 10 # => ActiveRecordError
387
- add_column :items, :attr4, :datetime, precision: 10 # => ActiveRecordError
477
+ add_check_constraint :products, "price > 0", name: "price_check"
478
+ remove_check_constraint :products, name: "price_check"
388
479
  ```
389
480
 
390
- After:
481
+ *fatkodima*
482
+
483
+ * Add `ActiveRecord::Base.strict_loading_by_default` and `ActiveRecord::Base.strict_loading_by_default=`
484
+ to enable/disable strict_loading mode by default for a model. The configuration's value is
485
+ inheritable by subclasses, but they can override that value and it will not impact parent class.
486
+
487
+ Usage:
391
488
 
392
489
  ```ruby
393
- add_column :items, :attr1, :binary, size: 10 # => ArgumentError
394
- add_column :items, :attr2, :decimal, scale: 10 # => ArgumentError
395
- add_column :items, :attr3, :integer, limit: 10 # => ArgumentError
396
- add_column :items, :attr4, :datetime, precision: 10 # => ArgumentError
490
+ class Developer < ApplicationRecord
491
+ self.strict_loading_by_default = true
492
+
493
+ has_many :projects
494
+ end
495
+
496
+ dev = Developer.first
497
+ dev.projects.first
498
+ # => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.
397
499
  ```
398
500
 
501
+ *bogdanvlviv*
502
+
503
+ * Deprecate passing an Active Record object to `quote`/`type_cast` directly.
504
+
399
505
  *Ryuta Kamizono*
400
506
 
401
- * Association loading isn't to be affected by scoping consistently
402
- whether preloaded / eager loaded or not, with the exception of `unscoped`.
507
+ * Default engine `ENGINE=InnoDB` is no longer dumped to make schema more agnostic.
403
508
 
404
509
  Before:
405
510
 
406
511
  ```ruby
407
- Post.where("1=0").scoping do
408
- Comment.find(1).post # => nil
409
- Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
410
- Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
512
+ create_table "accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
411
513
  end
412
514
  ```
413
515
 
414
516
  After:
415
517
 
416
518
  ```ruby
417
- Post.where("1=0").scoping do
418
- Comment.find(1).post # => #<Post id: 1, ...>
419
- Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
420
- Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
519
+ create_table "accounts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
421
520
  end
422
521
  ```
423
522
 
424
- Fixes #34638, #35398.
425
-
426
523
  *Ryuta Kamizono*
427
524
 
428
- * Add `rails db:prepare` to migrate or setup a database.
429
-
430
- Runs `db:migrate` if the database exists or `db:setup` if it doesn't.
431
-
432
- *Roberto Miranda*
433
-
434
- * Add `after_save_commit` callback as shortcut for `after_commit :hook, on: [ :create, :update ]`.
525
+ * Added delegated type as an alternative to single-table inheritance for representing class hierarchies.
526
+ See ActiveRecord::DelegatedType for the full description.
435
527
 
436
528
  *DHH*
437
529
 
438
- * Assign all attributes before calling `build` to ensure the child record is visible in
439
- `before_add` and `after_add` callbacks for `has_many :through` associations.
530
+ * Deprecate aggregations with group by duplicated fields.
440
531
 
441
- Fixes #33249.
532
+ To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
442
533
 
443
- *Ryan H. Kerr*
444
-
445
- * Add `ActiveRecord::Relation#extract_associated` for extracting associated records from a relation.
446
-
447
- ```
448
- account.memberships.extract_associated(:user)
449
- # => Returns collection of User records
534
+ ```ruby
535
+ accounts = Account.group(:firm_id)
536
+
537
+ # duplicated group fields, deprecated.
538
+ accounts.merge(accounts.where.not(credit_limit: nil)).sum(:credit_limit)
539
+ # => {
540
+ # [1, 1] => 50,
541
+ # [2, 2] => 60
542
+ # }
543
+
544
+ # use `uniq!(:group)` to deduplicate group fields.
545
+ accounts.merge(accounts.where.not(credit_limit: nil)).uniq!(:group).sum(:credit_limit)
546
+ # => {
547
+ # 1 => 50,
548
+ # 2 => 60
549
+ # }
450
550
  ```
451
551
 
452
- *DHH*
453
-
454
- * Add `ActiveRecord::Relation#annotate` for adding SQL comments to its queries.
455
-
456
- For example:
457
-
458
- ```
459
- Post.where(id: 123).annotate("this is a comment").to_sql
460
- # SELECT "posts".* FROM "posts" WHERE "posts"."id" = 123 /* this is a comment */
461
- ```
552
+ *Ryuta Kamizono*
462
553
 
463
- This can be useful in instrumentation or other analysis of issued queries.
554
+ * Deprecate duplicated query annotations.
464
555
 
465
- *Matt Yoho*
556
+ To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
466
557
 
467
- * Support Optimizer Hints.
558
+ ```ruby
559
+ accounts = Account.where(id: [1, 2]).annotate("david and mary")
468
560
 
469
- In most databases, a way to control the optimizer is by using optimizer hints,
470
- which can be specified within individual statements.
561
+ # duplicated annotations, deprecated.
562
+ accounts.merge(accounts.rewhere(id: 3))
563
+ # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */ /* david and mary */
471
564
 
472
- Example (for MySQL):
565
+ # use `uniq!(:annotate)` to deduplicate annotations.
566
+ accounts.merge(accounts.rewhere(id: 3)).uniq!(:annotate)
567
+ # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */
568
+ ```
473
569
 
474
- Topic.optimizer_hints("MAX_EXECUTION_TIME(50000)", "NO_INDEX_MERGE(topics)")
475
- # SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`
570
+ *Ryuta Kamizono*
476
571
 
477
- Example (for PostgreSQL with pg_hint_plan):
572
+ * Resolve conflict between counter cache and optimistic locking.
478
573
 
479
- Topic.optimizer_hints("SeqScan(topics)", "Parallel(topics 8)")
480
- # SELECT /*+ SeqScan(topics) Parallel(topics 8) */ "topics".* FROM "topics"
574
+ Bump an Active Record instance's lock version after updating its counter
575
+ cache. This avoids raising an unnecessary `ActiveRecord::StaleObjectError`
576
+ upon subsequent transactions by maintaining parity with the corresponding
577
+ database record's `lock_version` column.
481
578
 
482
- See also:
579
+ Fixes #16449.
483
580
 
484
- * https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html
485
- * https://pghintplan.osdn.jp/pg_hint_plan.html
486
- * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/influencing-the-optimizer.html
487
- * https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-2017
488
- * https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.admin.perf.doc/doc/c0070117.html
581
+ *Aaron Lipman*
489
582
 
490
- *Ryuta Kamizono*
583
+ * Support merging option `:rewhere` to allow mergee side condition to be replaced exactly.
491
584
 
492
- * Fix query attribute method on user-defined attribute to be aware of typecasted value.
585
+ ```ruby
586
+ david_and_mary = Author.where(id: david.id..mary.id)
493
587
 
494
- For example, the following code no longer return false as casted non-empty string:
588
+ # both conflict conditions exists
589
+ david_and_mary.merge(Author.where(id: bob)) # => []
495
590
 
496
- ```
497
- class Post < ActiveRecord::Base
498
- attribute :user_defined_text, :text
499
- end
591
+ # mergee side condition is replaced by rewhere
592
+ david_and_mary.merge(Author.rewhere(id: bob)) # => [bob]
500
593
 
501
- Post.new(user_defined_text: "false").user_defined_text? # => true
594
+ # mergee side condition is replaced by rewhere option
595
+ david_and_mary.merge(Author.where(id: bob), rewhere: true) # => [bob]
502
596
  ```
503
597
 
504
- *Yuji Kamijima*
505
-
506
- * Quote empty ranges like other empty enumerables.
598
+ *Ryuta Kamizono*
507
599
 
508
- *Patrick Rebsch*
600
+ * Add support for finding records based on signed ids, which are tamper-proof, verified ids that can be
601
+ set to expire and scoped with a purpose. This is particularly useful for things like password reset
602
+ or email verification, where you want the bearer of the signed id to be able to interact with the
603
+ underlying record, but usually only within a certain time period.
509
604
 
510
- * Add `insert_all`/`insert_all!`/`upsert_all` methods to `ActiveRecord::Persistence`,
511
- allowing bulk inserts akin to the bulk updates provided by `update_all` and
512
- bulk deletes by `delete_all`.
605
+ ```ruby
606
+ signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset
513
607
 
514
- Supports skipping or upserting duplicates through the `ON CONFLICT` syntax
515
- for PostgreSQL (9.5+) and SQLite (3.24+) and `ON DUPLICATE KEY UPDATE` syntax
516
- for MySQL.
608
+ User.find_signed signed_id # => nil, since the purpose does not match
517
609
 
518
- *Bob Lail*
610
+ travel 16.minutes
611
+ User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired
519
612
 
520
- * Add `rails db:seed:replant` that truncates tables of each database
521
- for current environment and loads the seeds.
613
+ travel_back
614
+ User.find_signed signed_id, purpose: :password_reset # => User.first
522
615
 
523
- *bogdanvlviv*, *DHH*
616
+ User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
617
+ ```
524
618
 
525
- * Add `ActiveRecord::Base.connection.truncate` for SQLite3 adapter.
619
+ *DHH*
526
620
 
527
- *bogdanvlviv*
621
+ * Support `ALGORITHM = INSTANT` DDL option for index operations on MySQL.
528
622
 
529
- * Deprecate mismatched collation comparison for uniqueness validator.
623
+ *Ryuta Kamizono*
530
624
 
531
- Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1.
532
- To continue case sensitive comparison on the case insensitive column,
533
- pass `case_sensitive: true` option explicitly to the uniqueness validator.
625
+ * Fix index creation to preserve index comment in bulk change table on MySQL.
534
626
 
535
627
  *Ryuta Kamizono*
536
628
 
537
- * Add `reselect` method. This is a short-hand for `unscope(:select).select(fields)`.
629
+ * Allow `unscope` to be aware of table name qualified values.
538
630
 
539
- Fixes #27340.
631
+ It is possible to unscope only the column in the specified table.
540
632
 
541
- *Willian Gustavo Veiga*
633
+ ```ruby
634
+ posts = Post.joins(:comments).group(:"posts.hidden")
635
+ posts = posts.where("posts.hidden": false, "comments.hidden": false)
542
636
 
543
- * Add negative scopes for all enum values.
637
+ posts.count
638
+ # => { false => 10 }
544
639
 
545
- Example:
640
+ # unscope both hidden columns
641
+ posts.unscope(where: :hidden).count
642
+ # => { false => 11, true => 1 }
546
643
 
547
- class Post < ActiveRecord::Base
548
- enum status: %i[ drafted active trashed ]
549
- end
644
+ # unscope only comments.hidden column
645
+ posts.unscope(where: :"comments.hidden").count
646
+ # => { false => 11 }
647
+ ```
550
648
 
551
- Post.not_drafted # => where.not(status: :drafted)
552
- Post.not_active # => where.not(status: :active)
553
- Post.not_trashed # => where.not(status: :trashed)
649
+ *Ryuta Kamizono*, *Slava Korolev*
554
650
 
555
- *DHH*
651
+ * Fix `rewhere` to truly overwrite collided where clause by new where clause.
556
652
 
557
- * Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
653
+ ```ruby
654
+ steve = Person.find_by(name: "Steve")
655
+ david = Author.find_by(name: "David")
558
656
 
559
- Fixes #35214.
657
+ relation = Essay.where(writer: steve)
560
658
 
561
- *Juani Villarejo*
659
+ # Before
660
+ relation.rewhere(writer: david).to_a # => []
562
661
 
662
+ # After
663
+ relation.rewhere(writer: david).to_a # => [david]
664
+ ```
563
665
 
564
- ## Rails 6.0.0.beta3 (March 11, 2019) ##
666
+ *Ryuta Kamizono*
565
667
 
566
- * No changes.
668
+ * Inspect time attributes with subsec.
567
669
 
670
+ ```ruby
671
+ p Knot.create
672
+ => #<Knot id: 1, created_at: "2016-05-05 01:29:47.116928000">
673
+ ```
568
674
 
569
- ## Rails 6.0.0.beta2 (February 25, 2019) ##
675
+ *akinomaeni*
570
676
 
571
- * Fix prepared statements caching to be enabled even when query caching is enabled.
677
+ * Deprecate passing a column to `type_cast`.
572
678
 
573
679
  *Ryuta Kamizono*
574
680
 
575
- * Ensure `update_all` series cares about optimistic locking.
681
+ * Deprecate `in_clause_length` and `allowed_index_name_length` in `DatabaseLimits`.
576
682
 
577
683
  *Ryuta Kamizono*
578
684
 
579
- * Don't allow `where` with non numeric string matches to 0 values.
685
+ * Support bulk insert/upsert on relation to preserve scope values.
580
686
 
581
- *Ryuta Kamizono*
687
+ *Josef Šimánek*, *Ryuta Kamizono*
582
688
 
583
- * Introduce `ActiveRecord::Relation#destroy_by` and `ActiveRecord::Relation#delete_by`.
689
+ * Preserve column comment value on changing column name on MySQL.
584
690
 
585
- `destroy_by` allows relation to find all the records matching the condition and perform
586
- `destroy_all` on the matched records.
691
+ *Islam Taha*
587
692
 
588
- Example:
693
+ * Add support for `if_exists` option for removing an index.
589
694
 
590
- Person.destroy_by(name: 'David')
591
- Person.destroy_by(name: 'David', rating: 4)
695
+ The `remove_index` method can take an `if_exists` option. If this is set to true an error won't be raised if the index doesn't exist.
592
696
 
593
- david = Person.find_by(name: 'David')
594
- david.posts.destroy_by(id: [1, 2, 3])
697
+ *Eileen M. Uchitelle*
595
698
 
596
- `delete_by` allows relation to find all the records matching the condition and perform
597
- `delete_all` on the matched records.
699
+ * Remove ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base.
598
700
 
599
- Example:
701
+ *Ryuta Kamizono*
600
702
 
601
- Person.delete_by(name: 'David')
602
- Person.delete_by(name: 'David', rating: 4)
703
+ * Prevent `build_association` from `touching` a parent record if the record isn't persisted for `has_one` associations.
603
704
 
604
- david = Person.find_by(name: 'David')
605
- david.posts.delete_by(id: [1, 2, 3])
705
+ Fixes #38219.
606
706
 
607
- *Abhay Nikam*
707
+ *Josh Brody*
608
708
 
609
- * Don't allow `where` with invalid value matches to nil values.
709
+ * Add support for `if_not_exists` option for adding index.
610
710
 
611
- Fixes #33624.
711
+ The `add_index` method respects `if_not_exists` option. If it is set to true
712
+ index won't be added.
612
713
 
613
- *Ryuta Kamizono*
714
+ Usage:
614
715
 
615
- * SQLite3: Implement `add_foreign_key` and `remove_foreign_key`.
716
+ ```ruby
717
+ add_index :users, :account_id, if_not_exists: true
718
+ ```
616
719
 
617
- *Ryuta Kamizono*
720
+ The `if_not_exists` option passed to `create_table` also gets propagated to indexes
721
+ created within that migration so that if table and its indexes exist then there is no
722
+ attempt to create them again.
618
723
 
619
- * Deprecate using class level querying methods if the receiver scope
620
- regarded as leaked. Use `klass.unscoped` to avoid the leaking scope.
724
+ *Prathamesh Sonpatki*
621
725
 
622
- *Ryuta Kamizono*
726
+ * Add `ActiveRecord::Base#previously_new_record?` to show if a record was new before the last save.
623
727
 
624
- * Allow applications to automatically switch connections.
728
+ *Tom Ward*
625
729
 
626
- Adds a middleware and configuration options that can be used in your
627
- application to automatically switch between the writing and reading
628
- database connections.
730
+ * Support descending order for `find_each`, `find_in_batches`, and `in_batches`.
629
731
 
630
- `GET` and `HEAD` requests will read from the replica unless there was
631
- a write in the last 2 seconds, otherwise they will read from the primary.
632
- Non-get requests will always write to the primary. The middleware accepts
633
- an argument for a Resolver class and an Operations class where you are able
634
- to change how the auto-switcher works to be most beneficial for your
635
- application.
732
+ Batch processing methods allow you to work with the records in batches, greatly reducing memory consumption, but records are always batched from oldest id to newest.
636
733
 
637
- To use the middleware in your application you can use the following
638
- configuration options:
639
-
640
- ```
641
- config.active_record.database_selector = { delay: 2.seconds }
642
- config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
643
- config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
644
- ```
734
+ This change allows reversing the order, batching from newest to oldest. This is useful when you need to process newer batches of records first.
645
735
 
646
- To change the database selection strategy, pass a custom class to the
647
- configuration options:
736
+ Pass `order: :desc` to yield batches in descending order. The default remains `order: :asc`.
648
737
 
738
+ ```ruby
739
+ Person.find_each(order: :desc) do |person|
740
+ person.party_all_night!
741
+ end
649
742
  ```
650
- config.active_record.database_selector = { delay: 10.seconds }
651
- config.active_record.database_resolver = MyResolver
652
- config.active_record.database_resolver_context = MyResolver::MyCookies
653
- ```
654
-
655
- *Eileen M. Uchitelle*
656
-
657
- * MySQL: Support `:size` option to change text and blob size.
658
743
 
659
- *Ryuta Kamizono*
660
-
661
- * Make `t.timestamps` with precision by default.
744
+ *Alexey Vasiliev*
662
745
 
663
- *Ryuta Kamizono*
746
+ * Fix `insert_all` with enum values.
664
747
 
748
+ Fixes #38716.
665
749
 
666
- ## Rails 6.0.0.beta1 (January 18, 2019) ##
750
+ *Joel Blum*
667
751
 
668
- * Remove deprecated `#set_state` from the transaction object.
752
+ * Add support for `db:rollback:name` for multiple database applications.
669
753
 
670
- *Rafael Mendonça França*
754
+ Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
671
755
 
672
- * Remove deprecated `#supports_statement_cache?` from the database adapters.
756
+ *Eileen M. Uchitelle*
673
757
 
674
- *Rafael Mendonça França*
758
+ * `Relation#pick` now uses already loaded results instead of making another query.
675
759
 
676
- * Remove deprecated `#insert_fixtures` from the database adapters.
760
+ *Eugene Kenny*
677
761
 
678
- *Rafael Mendonça França*
762
+ * Deprecate using `return`, `break` or `throw` to exit a transaction block after writes.
679
763
 
680
- * Remove deprecated `ActiveRecord::ConnectionAdapters::SQLite3Adapter#valid_alter_table_type?`.
764
+ *Dylan Thacker-Smith*
681
765
 
682
- *Rafael Mendonça França*
766
+ * Dump the schema or structure of a database when calling `db:migrate:name`.
683
767
 
684
- * Do not allow passing the column name to `sum` when a block is passed.
768
+ In previous versions of Rails, `rails db:migrate` would dump the schema of the database. In Rails 6, that holds true (`rails db:migrate` dumps all databases' schemas), but `rails db:migrate:name` does not share that behavior.
685
769
 
686
- *Rafael Mendonça França*
770
+ Going forward, calls to `rails db:migrate:name` will dump the schema (or structure) of the database being migrated.
687
771
 
688
- * Do not allow passing the column name to `count` when a block is passed.
772
+ *Kyle Thompson*
689
773
 
690
- *Rafael Mendonça França*
774
+ * Reset the `ActiveRecord::Base` connection after `rails db:migrate:name`.
691
775
 
692
- * Remove delegation of missing methods in a relation to arel.
776
+ When `rails db:migrate` has finished, it ensures the `ActiveRecord::Base` connection is reset to its original configuration. Going forward, `rails db:migrate:name` will have the same behavior.
693
777
 
694
- *Rafael Mendonça França*
778
+ *Kyle Thompson*
695
779
 
696
- * Remove delegation of missing methods in a relation to private methods of the class.
780
+ * Disallow calling `connected_to` on subclasses of `ActiveRecord::Base`.
697
781
 
698
- *Rafael Mendonça França*
782
+ Behavior has not changed here but the previous API could be misleading to people who thought it would switch connections for only that class. `connected_to` switches the context from which we are getting connections, not the connections themselves.
699
783
 
700
- * Deprecate `config.active_record.sqlite3.represent_boolean_as_integer`.
784
+ *Eileen M. Uchitelle*, *John Crepezzi*
701
785
 
702
- *Rafael Mendonça França*
786
+ * Add support for horizontal sharding to `connects_to` and `connected_to`.
703
787
 
704
- * Change `SQLite3Adapter` to always represent boolean values as integers.
788
+ Applications can now connect to multiple shards and switch between their shards in an application. Note that the shard swapping is still a manual process as this change does not include an API for automatic shard swapping.
705
789
 
706
- *Rafael Mendonça França*
790
+ Usage:
707
791
 
708
- * Remove ability to specify a timestamp name for `#cache_key`.
792
+ Given the following configuration:
709
793
 
710
- *Rafael Mendonça França*
794
+ ```yaml
795
+ # config/database.yml
796
+ production:
797
+ primary:
798
+ database: my_database
799
+ primary_shard_one:
800
+ database: my_database_shard_one
801
+ ```
711
802
 
712
- * Remove deprecated `ActiveRecord::Migrator.migrations_path=`.
803
+ Connect to multiple shards:
713
804
 
714
- *Rafael Mendonça França*
805
+ ```ruby
806
+ class ApplicationRecord < ActiveRecord::Base
807
+ self.abstract_class = true
715
808
 
716
- * Remove deprecated `expand_hash_conditions_for_aggregates`.
809
+ connects_to shards: {
810
+ default: { writing: :primary },
811
+ shard_one: { writing: :primary_shard_one }
812
+ }
813
+ ```
717
814
 
718
- *Rafael Mendonça França*
815
+ Swap between shards in your controller / model code:
719
816
 
720
- * Set polymorphic type column to NULL on `dependent: :nullify` strategy.
817
+ ```ruby
818
+ ActiveRecord::Base.connected_to(shard: :shard_one) do
819
+ # Read from shard one
820
+ end
821
+ ```
721
822
 
722
- On polymorphic associations both the foreign key and the foreign type columns will be set to NULL.
823
+ The horizontal sharding API also supports read replicas. See guides for more details.
723
824
 
724
- *Laerti Papa*
825
+ *Eileen M. Uchitelle*, *John Crepezzi*
725
826
 
726
- * Allow permitted instance of `ActionController::Parameters` as argument of `ActiveRecord::Relation#exists?`.
827
+ * Deprecate `spec_name` in favor of `name` on database configurations.
727
828
 
728
- *Gannon McGibbon*
829
+ The accessors for `spec_name` on `configs_for` and `DatabaseConfig` are deprecated. Please use `name` instead.
729
830
 
730
- * Add support for endless ranges introduces in Ruby 2.6.
831
+ Deprecated behavior:
731
832
 
732
- *Greg Navis*
833
+ ```ruby
834
+ db_config = ActiveRecord::Base.configs_for(env_name: "development", spec_name: "primary")
835
+ db_config.spec_name
836
+ ```
733
837
 
734
- * Deprecate passing `migrations_paths` to `connection.assume_migrated_upto_version`.
838
+ New behavior:
735
839
 
736
- *Ryuta Kamizono*
840
+ ```ruby
841
+ db_config = ActiveRecord::Base.configs_for(env_name: "development", name: "primary")
842
+ db_config.name
843
+ ```
737
844
 
738
- * MySQL: `ROW_FORMAT=DYNAMIC` create table option by default.
845
+ *Eileen M. Uchitelle*
739
846
 
740
- Since MySQL 5.7.9, the `innodb_default_row_format` option defines the default row
741
- format for InnoDB tables. The default setting is `DYNAMIC`.
742
- The row format is required for indexing on `varchar(255)` with `utf8mb4` columns.
847
+ * Add additional database-specific rake tasks for multi-database users.
743
848
 
744
- *Ryuta Kamizono*
849
+ Previously, `rails db:create`, `rails db:drop`, and `rails db:migrate` were the only rails tasks that could operate on a single
850
+ database. For example:
745
851
 
746
- * Fix join table column quoting with SQLite.
852
+ ```
853
+ rails db:create
854
+ rails db:create:primary
855
+ rails db:create:animals
856
+ rails db:drop
857
+ rails db:drop:primary
858
+ rails db:drop:animals
859
+ rails db:migrate
860
+ rails db:migrate:primary
861
+ rails db:migrate:animals
862
+ ```
747
863
 
748
- *Gannon McGibbon*
864
+ With these changes, `rails db:schema:dump`, `rails db:schema:load`, `rails db:structure:dump`, `rails db:structure:load` and
865
+ `rails db:test:prepare` can additionally operate on a single database. For example:
749
866
 
750
- * Allow disabling scopes generated by `ActiveRecord.enum`.
867
+ ```
868
+ rails db:schema:dump
869
+ rails db:schema:dump:primary
870
+ rails db:schema:dump:animals
871
+ rails db:schema:load
872
+ rails db:schema:load:primary
873
+ rails db:schema:load:animals
874
+ rails db:structure:dump
875
+ rails db:structure:dump:primary
876
+ rails db:structure:dump:animals
877
+ rails db:structure:load
878
+ rails db:structure:load:primary
879
+ rails db:structure:load:animals
880
+ rails db:test:prepare
881
+ rails db:test:prepare:primary
882
+ rails db:test:prepare:animals
883
+ ```
751
884
 
752
- *Alfred Dominic*
885
+ *Kyle Thompson*
753
886
 
754
- * Ensure that `delete_all` on collection proxy returns affected count.
887
+ * Add support for `strict_loading` mode on association declarations.
755
888
 
756
- *Ryuta Kamizono*
889
+ Raise an error if attempting to load a record from an association that has been marked as `strict_loading` unless it was explicitly eager loaded.
757
890
 
758
- * Reset scope after delete on collection association to clear stale offsets of removed records.
891
+ Usage:
759
892
 
760
- *Gannon McGibbon*
893
+ ```ruby
894
+ class Developer < ApplicationRecord
895
+ has_many :projects, strict_loading: true
896
+ end
761
897
 
762
- * Add the ability to prevent writes to a database for the duration of a block.
898
+ dev = Developer.first
899
+ dev.projects.first
900
+ # => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.
901
+ ```
763
902
 
764
- Allows the application to prevent writes to a database. This can be useful when
765
- you're building out multiple databases and want to make sure you're not sending
766
- writes when you want a read.
903
+ *Kevin Deisz*
767
904
 
768
- If `while_preventing_writes` is called and the query is considered a write
769
- query the database will raise an exception regardless of whether the database
770
- user is able to write.
905
+ * Add support for `strict_loading` mode to prevent lazy loading of records.
771
906
 
772
- This is not meant to be a catch-all for write queries but rather a way to enforce
773
- read-only queries without opening a second connection. One purpose of this is to
774
- catch accidental writes, not all writes.
907
+ Raise an error if a parent record is marked as `strict_loading` and attempts to lazily load its associations. This is useful for finding places you may want to preload an association and avoid additional queries.
775
908
 
776
- *Eileen M. Uchitelle*
909
+ Usage:
777
910
 
778
- * Allow aliased attributes to be used in `#update_columns` and `#update`.
911
+ ```ruby
912
+ dev = Developer.strict_loading.first
913
+ dev.audit_logs.to_a
914
+ # => ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.
915
+ ```
779
916
 
780
- *Gannon McGibbon*
917
+ *Eileen M. Uchitelle*, *Aaron Patterson*
781
918
 
782
- * Allow spaces in postgres table names.
919
+ * Add support for PostgreSQL 11+ partitioned indexes when using `upsert_all`.
783
920
 
784
- Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres adapter.
921
+ *Sebastián Palma*
785
922
 
786
- *Gannon McGibbon*
923
+ * Adds support for `if_not_exists` to `add_column` and `if_exists` to `remove_column`.
787
924
 
788
- * Cached `columns_hash` fields should be excluded from `ResultSet#column_types`.
925
+ Applications can set their migrations to ignore exceptions raised when adding a column that already exists or when removing a column that does not exist.
789
926
 
790
- PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test
791
- was passing for SQLite and MySQL, but failed for PostgreSQL:
927
+ Example Usage:
792
928
 
793
929
  ```ruby
794
- class DeveloperName < ActiveRecord::Type::String
795
- def deserialize(value)
796
- "Developer: #{value}"
930
+ class AddColumnTitle < ActiveRecord::Migration[6.1]
931
+ def change
932
+ add_column :posts, :title, :string, if_not_exists: true
797
933
  end
798
934
  end
935
+ ```
799
936
 
800
- class AttributedDeveloper < ActiveRecord::Base
801
- self.table_name = "developers"
802
-
803
- attribute :name, DeveloperName.new
804
-
805
- self.ignored_columns += ["name"]
937
+ ```ruby
938
+ class RemoveColumnTitle < ActiveRecord::Migration[6.1]
939
+ def change
940
+ remove_column :posts, :title, if_exists: true
941
+ end
806
942
  end
807
-
808
- developer = AttributedDeveloper.create
809
- developer.update_column :name, "name"
810
-
811
- loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
812
- puts loaded_developer.name # should be "Developer: name" but it's just "name"
813
943
  ```
814
944
 
815
- *Dmitry Tsepelev*
816
-
817
- * Make the implicit order column configurable.
818
-
819
- When calling ordered finder methods such as `first` or `last` without an
820
- explicit order clause, ActiveRecord sorts records by primary key. This can
821
- result in unpredictable and surprising behaviour when the primary key is
822
- not an auto-incrementing integer, for example when it's a UUID. This change
823
- makes it possible to override the column used for implicit ordering such
824
- that `first` and `last` will return more predictable results.
825
-
826
- Example:
827
-
828
- class Project < ActiveRecord::Base
829
- self.implicit_order_column = "created_at"
830
- end
831
-
832
- *Tekin Suleyman*
945
+ *Eileen M. Uchitelle*
833
946
 
834
- * Bump minimum PostgreSQL version to 9.3.
947
+ * Regexp-escape table name for MS SQL Server.
835
948
 
836
- *Yasuo Honda*
949
+ Add `Regexp.escape` to one method in ActiveRecord, so that table names with regular expression characters in them work as expected. Since MS SQL Server uses "[" and "]" to quote table and column names, and those characters are regular expression characters, methods like `pluck` and `select` fail in certain cases when used with the MS SQL Server adapter.
837
950
 
838
- * Values of enum are frozen, raising an error when attempting to modify them.
951
+ *Larry Reid*
839
952
 
840
- *Emmanuel Byrd*
953
+ * Store advisory locks on their own named connection.
841
954
 
842
- * Move `ActiveRecord::StatementInvalid` SQL to error property and include binds as separate error property.
955
+ Previously advisory locks were taken out against a connection when a migration started. This works fine in single database applications but doesn't work well when migrations need to open new connections which results in the lock getting dropped.
843
956
 
844
- `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception_class` now requires `binds` to be passed as the last argument.
957
+ In order to fix this we are storing the advisory lock on a new connection with the connection specification name `AdvisoryLockBase`. The caveat is that we need to maintain at least 2 connections to a database while migrations are running in order to do this.
845
958
 
846
- `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception` now requires `message`, `sql`, and `binds` to be passed as keyword arguments.
959
+ *Eileen M. Uchitelle*, *John Crepezzi*
847
960
 
848
- Subclasses of `ActiveRecord::StatementInvalid` must now provide `sql:` and `binds:` arguments to `super`.
961
+ * Allow schema cache path to be defined in the database configuration file.
849
962
 
850
- Example:
963
+ For example:
851
964
 
965
+ ```yaml
966
+ development:
967
+ adapter: postgresql
968
+ database: blog_development
969
+ pool: 5
970
+ schema_cache_path: tmp/schema/main.yml
852
971
  ```
853
- class MySubclassedError < ActiveRecord::StatementInvalid
854
- def initialize(message, sql:, binds:)
855
- super(message, sql: sql, binds: binds)
856
- end
857
- end
858
- ```
859
-
860
- *Gannon McGibbon*
861
-
862
- * Add an `:if_not_exists` option to `create_table`.
863
972
 
864
- Example:
973
+ *Katrina Owen*
865
974
 
866
- create_table :posts, if_not_exists: true do |t|
867
- t.string :title
868
- end
975
+ * Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
869
976
 
870
- That would execute:
977
+ `#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in 6.2.
871
978
 
872
- CREATE TABLE IF NOT EXISTS posts (
873
- ...
874
- )
875
-
876
- If the table already exists, `if_not_exists: false` (the default) raises an
877
- exception whereas `if_not_exists: true` does nothing.
979
+ *Eileen M. Uchitelle*, *John Crepezzi*
878
980
 
879
- *fatkodima*, *Stefan Kanev*
981
+ * Deprecate `#default_hash` and it's alias `#[]` on database configurations.
880
982
 
881
- * Defining an Enum as a Hash with blank key, or as an Array with a blank value, now raises an `ArgumentError`.
983
+ Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
882
984
 
883
- *Christophe Maximin*
985
+ *Eileen M. Uchitelle*, *John Crepezzi*
884
986
 
885
- * Adds support for multiple databases to `rails db:schema:cache:dump` and `rails db:schema:cache:clear`.
987
+ * Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
886
988
 
887
989
  *Gannon McGibbon*
888
990
 
889
- * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
890
- if the attribute does not exist.
991
+ * Find orphans by looking for missing relations through chaining `where.missing`:
891
992
 
892
- *Sean Griffin*
893
-
894
- * Add support for hash and URL configs in database hash of `ActiveRecord::Base.connected_to`.
993
+ Before:
895
994
 
896
- ````
897
- User.connected_to(database: { writing: "postgres://foo" }) do
898
- User.create!(name: "Gannon")
899
- end
995
+ ```ruby
996
+ Post.left_joins(:author).where(authors: { id: nil })
997
+ ```
900
998
 
901
- config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
902
- User.connected_to(database: { reading: config }) do
903
- User.count
904
- end
905
- ````
999
+ After:
906
1000
 
907
- *Gannon McGibbon*
1001
+ ```ruby
1002
+ Post.where.missing(:author)
1003
+ ```
908
1004
 
909
- * Support default expression for MySQL.
1005
+ *Tom Rossi*
910
1006
 
911
- MySQL 8.0.13 and higher supports default value to be a function or expression.
1007
+ * Ensure `:reading` connections always raise if a write is attempted.
912
1008
 
913
- https://dev.mysql.com/doc/refman/8.0/en/create-table.html
1009
+ Now Rails will raise an `ActiveRecord::ReadOnlyError` if any connection on the reading handler attempts to make a write. If your reading role needs to write you should name the role something other than `:reading`.
914
1010
 
915
- *Ryuta Kamizono*
1011
+ *Eileen M. Uchitelle*
916
1012
 
917
- * Support expression indexes for MySQL.
1013
+ * Deprecate `"primary"` as the `connection_specification_name` for `ActiveRecord::Base`.
918
1014
 
919
- MySQL 8.0.13 and higher supports functional key parts that index
920
- expression values rather than column or column prefix values.
1015
+ `"primary"` has been deprecated as the `connection_specification_name` for `ActiveRecord::Base` in favor of using `"ActiveRecord::Base"`. This change affects calls to `ActiveRecord::Base.connection_handler.retrieve_connection` and `ActiveRecord::Base.connection_handler.remove_connection`. If you're calling these methods with `"primary"`, please switch to `"ActiveRecord::Base"`.
921
1016
 
922
- https://dev.mysql.com/doc/refman/8.0/en/create-index.html
1017
+ *Eileen M. Uchitelle*, *John Crepezzi*
923
1018
 
924
- *Ryuta Kamizono*
1019
+ * Add `ActiveRecord::Validations::NumericalityValidator` with
1020
+ support for casting floats using a database columns' precision value.
925
1021
 
926
- * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
1022
+ *Gannon McGibbon*
927
1023
 
928
- Fixes #33056.
1024
+ * Enforce fresh ETag header after a collection's contents change by adding
1025
+ ActiveRecord::Relation#cache_key_with_version. This method will be used by
1026
+ ActionController::ConditionalGet to ensure that when collection cache versioning
1027
+ is enabled, requests using ConditionalGet don't return the same ETag header
1028
+ after a collection is modified.
929
1029
 
930
- *Federico Martinez*
1030
+ Fixes #38078.
931
1031
 
932
- * Add basic API for connection switching to support multiple databases.
1032
+ *Aaron Lipman*
933
1033
 
934
- 1) Adds a `connects_to` method for models to connect to multiple databases. Example:
1034
+ * Skip test database when running `db:create` or `db:drop` in development
1035
+ with `DATABASE_URL` set.
935
1036
 
936
- ```
937
- class AnimalsModel < ApplicationRecord
938
- self.abstract_class = true
1037
+ *Brian Buchalter*
939
1038
 
940
- connects_to database: { writing: :animals_primary, reading: :animals_replica }
941
- end
1039
+ * Don't allow mutations on the database configurations hash.
942
1040
 
943
- class Dog < AnimalsModel
944
- # connected to both the animals_primary db for writing and the animals_replica for reading
945
- end
946
- ```
1041
+ Freeze the configurations hash to disallow directly changing it. If applications need to change the hash, for example to create databases for parallelization, they should use the `DatabaseConfig` object directly.
947
1042
 
948
- 2) Adds a `connected_to` block method for switching connection roles or connecting to
949
- a database that the model didn't connect to. Connecting to the database in this block is
950
- useful when you have another defined connection, for example `slow_replica` that you don't
951
- want to connect to by default but need in the console, or a specific code block.
1043
+ Before:
952
1044
 
953
- ```
954
- ActiveRecord::Base.connected_to(role: :reading) do
955
- Dog.first # finds dog from replica connected to AnimalsBase
956
- Book.first # doesn't have a reading connection, will raise an error
957
- end
1045
+ ```ruby
1046
+ @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
1047
+ @db_config.configuration_hash.merge!(idle_timeout: "0.02")
958
1048
  ```
959
1049
 
960
- ```
961
- ActiveRecord::Base.connected_to(database: :slow_replica) do
962
- 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
963
- end
964
- ```
1050
+ After:
965
1051
 
966
- *Eileen M. Uchitelle*
1052
+ ```ruby
1053
+ @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
1054
+ config = @db_config.configuration_hash.merge(idle_timeout: "0.02")
1055
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(@db_config.env_name, @db_config.spec_name, config)
1056
+ ```
967
1057
 
968
- * Enum raises on invalid definition values
1058
+ *Eileen M. Uchitelle*, *John Crepezzi*
969
1059
 
970
- When defining a Hash enum it can be easy to use `[]` instead of `{}`. This
971
- commit checks that only valid definition values are provided, those can
972
- be a Hash, an array of Symbols or an array of Strings. Otherwise it
973
- raises an `ArgumentError`.
1060
+ * Remove `:connection_id` from the `sql.active_record` notification.
974
1061
 
975
- Fixes #33961
1062
+ *Aaron Patterson*, *Rafael Mendonça França*
976
1063
 
977
- *Alberto Almagro*
1064
+ * The `:name` key will no longer be returned as part of `DatabaseConfig#configuration_hash`. Please use `DatabaseConfig#owner_name` instead.
978
1065
 
979
- * Reloading associations now clears the Query Cache like `Persistence#reload` does.
1066
+ *Eileen M. Uchitelle*, *John Crepezzi*
980
1067
 
981
- ```
982
- class Post < ActiveRecord::Base
983
- has_one :category
984
- belongs_to :author
985
- has_many :comments
986
- end
1068
+ * ActiveRecord's `belongs_to_required_by_default` flag can now be set per model.
987
1069
 
988
- # Each of the following will now clear the query cache.
989
- post.reload_category
990
- post.reload_author
991
- post.comments.reload
992
- ```
1070
+ You can now opt-out/opt-in specific models from having their associations required
1071
+ by default.
993
1072
 
994
- *Christophe Maximin*
1073
+ This change is meant to ease the process of migrating all your models to have
1074
+ their association required.
995
1075
 
996
- * Added `index` option for `change_table` migration helpers.
997
- With this change you can create indexes while adding new
998
- columns into the existing tables.
1076
+ *Edouard Chin*
999
1077
 
1000
- Example:
1078
+ * The `connection_config` method has been deprecated, please use `connection_db_config` instead which will return a `DatabaseConfigurations::DatabaseConfig` instead of a `Hash`.
1001
1079
 
1002
- change_table(:languages) do |t|
1003
- t.string :country_code, index: true
1004
- end
1080
+ *Eileen M. Uchitelle*, *John Crepezzi*
1005
1081
 
1006
- *Mehmet Emin İNAÇ*
1082
+ * Retain explicit selections on the base model after applying `includes` and `joins`.
1007
1083
 
1008
- * Fix `transaction` reverting for migrations.
1084
+ Resolves #34889.
1009
1085
 
1010
- Before: Commands inside a `transaction` in a reverted migration ran uninverted.
1011
- Now: This change fixes that by reverting commands inside `transaction` block.
1086
+ *Patrick Rebsch*
1012
1087
 
1013
- *fatkodima*, *David Verhasselt*
1088
+ * The `database` kwarg is deprecated without replacement because it can't be used for sharding and creates an issue if it's used during a request. Applications that need to create new connections should use `connects_to` instead.
1014
1089
 
1015
- * Raise an error instead of scanning the filesystem root when `fixture_path` is blank.
1090
+ *Eileen M. Uchitelle*, *John Crepezzi*
1016
1091
 
1017
- *Gannon McGibbon*, *Max Albrecht*
1092
+ * Allow attributes to be fetched from Arel node groupings.
1018
1093
 
1019
- * Allow `ActiveRecord::Base.configurations=` to be set with a symbolized hash.
1094
+ *Jeff Emminger*, *Gannon McGibbon*
1020
1095
 
1021
- *Gannon McGibbon*
1096
+ * A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgreSQL `options`.
1022
1097
 
1023
- * Don't update counter cache unless the record is actually saved.
1098
+ *Joshua Flanagan*
1024
1099
 
1025
- Fixes #31493, #33113, #33117.
1100
+ * Calling methods like `establish_connection` with a `Hash` which is invalid (eg: no `adapter`) will now raise an error the same way as connections defined in `config/database.yml`.
1026
1101
 
1027
- *Ryuta Kamizono*
1102
+ *John Crepezzi*
1028
1103
 
1029
- * Deprecate `ActiveRecord::Result#to_hash` in favor of `ActiveRecord::Result#to_a`.
1104
+ * Specifying `implicit_order_column` now subsorts the records by primary key if available to ensure deterministic results.
1030
1105
 
1031
- *Gannon McGibbon*, *Kevin Cheng*
1106
+ *Paweł Urbanek*
1032
1107
 
1033
- * SQLite3 adapter supports expression indexes.
1108
+ * `where(attr => [])` now loads an empty result without making a query.
1034
1109
 
1035
- ```
1036
- create_table :users do |t|
1037
- t.string :email
1038
- end
1110
+ *John Hawthorn*
1039
1111
 
1040
- add_index :users, 'lower(email)', name: 'index_users_on_email', unique: true
1041
- ```
1112
+ * Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
1042
1113
 
1043
- *Gray Kemmey*
1114
+ *Hiroyuki Ishii*
1044
1115
 
1045
- * Allow subclasses to redefine autosave callbacks for associated records.
1116
+ * Add support for `belongs_to` to `has_many` inversing.
1046
1117
 
1047
- Fixes #33305.
1118
+ *Gannon McGibbon*
1048
1119
 
1049
- *Andrey Subbota*
1120
+ * Allow length configuration for `has_secure_token` method. The minimum length
1121
+ is set at 24 characters.
1050
1122
 
1051
- * Bump minimum MySQL version to 5.5.8.
1123
+ Before:
1052
1124
 
1053
- *Yasuo Honda*
1125
+ ```ruby
1126
+ has_secure_token :auth_token
1127
+ ```
1054
1128
 
1055
- * Use MySQL utf8mb4 character set by default.
1129
+ After:
1056
1130
 
1057
- `utf8mb4` character set with 4-Byte encoding supports supplementary characters including emoji.
1058
- The previous default 3-Byte encoding character set `utf8` is not enough to support them.
1131
+ ```ruby
1132
+ has_secure_token :default_token # 24 characters
1133
+ has_secure_token :auth_token, length: 36 # 36 characters
1134
+ has_secure_token :invalid_token, length: 12 # => ActiveRecord::SecureToken::MinimumLengthError
1135
+ ```
1059
1136
 
1060
- *Yasuo Honda*
1137
+ *Bernardo de Araujo*
1061
1138
 
1062
- * Fix duplicated record creation when using nested attributes with `create_with`.
1139
+ * Deprecate `DatabaseConfigurations#to_h`. These connection hashes are still available via `ActiveRecord::Base.configurations.configs_for`.
1063
1140
 
1064
- *Darwin Wu*
1141
+ *Eileen Uchitelle*, *John Crepezzi*
1065
1142
 
1066
- * Configuration item `config.filter_parameters` could also filter out
1067
- sensitive values of database columns when calling `#inspect`.
1068
- We also added `ActiveRecord::Base::filter_attributes`/`=` in order to
1069
- specify sensitive attributes to specific model.
1143
+ * Add `DatabaseConfig#configuration_hash` to return database configuration hashes with symbol keys, and use all symbol-key configuration hashes internally. Deprecate `DatabaseConfig#config` which returns a String-keyed `Hash` with the same values.
1070
1144
 
1071
- ```
1072
- Rails.application.config.filter_parameters += [:credit_card_number, /phone/]
1073
- Account.last.inspect # => #<Account id: 123, name: "DHH", credit_card_number: [FILTERED], telephone_number: [FILTERED] ...>
1074
- SecureAccount.filter_attributes += [:name]
1075
- SecureAccount.last.inspect # => #<SecureAccount id: 42, name: [FILTERED], credit_card_number: [FILTERED] ...>
1076
- ```
1145
+ *John Crepezzi*, *Eileen Uchitelle*
1077
1146
 
1078
- *Zhang Kang*, *Yoshiyuki Kinjo*
1147
+ * Allow column names to be passed to `remove_index` positionally along with other options.
1079
1148
 
1080
- * Deprecate `column_name_length`, `table_name_length`, `columns_per_table`,
1081
- `indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
1082
- and `joins_per_query` methods in `DatabaseLimits`.
1149
+ Passing other options can be necessary to make `remove_index` correctly reversible.
1083
1150
 
1084
- *Ryuta Kamizono*
1151
+ Before:
1085
1152
 
1086
- * `ActiveRecord::Base.configurations` now returns an object.
1153
+ add_index :reports, :report_id # => works
1154
+ add_index :reports, :report_id, unique: true # => works
1155
+ remove_index :reports, :report_id # => works
1156
+ remove_index :reports, :report_id, unique: true # => ArgumentError
1087
1157
 
1088
- `ActiveRecord::Base.configurations` used to return a hash, but this
1089
- is an inflexible data model. In order to improve multiple-database
1090
- handling in Rails, we've changed this to return an object. Some methods
1091
- are provided to make the object behave hash-like in order to ease the
1092
- transition process. Since most applications don't manipulate the hash
1093
- we've decided to add backwards-compatible functionality that will throw
1094
- a deprecation warning if used, however calling `ActiveRecord::Base.configurations`
1095
- will use the new version internally and externally.
1158
+ After:
1096
1159
 
1097
- For example, the following `database.yml`:
1160
+ remove_index :reports, :report_id, unique: true # => works
1098
1161
 
1099
- ```
1100
- development:
1101
- adapter: sqlite3
1102
- database: db/development.sqlite3
1103
- ```
1162
+ *Eugene Kenny*
1104
1163
 
1105
- Used to become a hash:
1164
+ * Allow bulk `ALTER` statements to drop and recreate indexes with the same name.
1106
1165
 
1107
- ```
1108
- { "development" => { "adapter" => "sqlite3", "database" => "db/development.sqlite3" } }
1109
- ```
1166
+ *Eugene Kenny*
1110
1167
 
1111
- Is now converted into the following object:
1168
+ * `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
1112
1169
 
1113
- ```
1114
- #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
1115
- #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
1116
- @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
1117
- ]
1118
- ```
1170
+ *Eugene Kenny*
1119
1171
 
1120
- Iterating over the database configurations has also changed. Instead of
1121
- calling hash methods on the `configurations` hash directly, a new method `configs_for` has
1122
- been provided that allows you to select the correct configuration. `env_name` and
1123
- `spec_name` arguments are optional. For example, these return an array of
1124
- database config objects for the requested environment and a single database config object
1125
- will be returned for the requested environment and specification name respectively.
1172
+ * Call `while_preventing_writes` directly from `connected_to`.
1126
1173
 
1127
- ```
1128
- ActiveRecord::Base.configurations.configs_for(env_name: "development")
1129
- ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
1130
- ```
1174
+ 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)`.
1131
1175
 
1132
- *Eileen M. Uchitelle*, *Aaron Patterson*
1176
+ 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.
1133
1177
 
1134
- * Add database configuration to disable advisory locks.
1178
+ *Eileen M. Uchitelle*
1135
1179
 
1136
- ```
1137
- production:
1138
- adapter: postgresql
1139
- advisory_locks: false
1140
- ```
1180
+ * Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
1141
1181
 
1142
- *Guo Xiang*
1182
+ *Kir Shatrov*
1143
1183
 
1144
- * SQLite3 adapter `alter_table` method restores foreign keys.
1184
+ * Stop trying to read yaml file fixtures when loading Active Record fixtures.
1145
1185
 
1146
- *Yasuo Honda*
1186
+ *Gannon McGibbon*
1147
1187
 
1148
- * Allow `:to_table` option to `invert_remove_foreign_key`.
1188
+ * Deprecate `.reorder(nil)` with `.first` / `.first!` taking non-deterministic result.
1149
1189
 
1150
- Example:
1190
+ To continue taking non-deterministic result, use `.take` / `.take!` instead.
1151
1191
 
1152
- remove_foreign_key :accounts, to_table: :owners
1192
+ *Ryuta Kamizono*
1153
1193
 
1154
- *Nikolay Epifanov*, *Rich Chen*
1194
+ * Preserve user supplied joins order as much as possible.
1155
1195
 
1156
- * Add environment & load_config dependency to `bin/rake db:seed` to enable
1157
- seed load in environments without Rails and custom DB configuration
1196
+ Fixes #36761, #34328, #24281, #12953.
1158
1197
 
1159
- *Tobias Bielohlawek*
1198
+ *Ryuta Kamizono*
1160
1199
 
1161
- * Fix default value for mysql time types with specified precision.
1200
+ * Allow `matches_regex` and `does_not_match_regexp` on the MySQL Arel visitor.
1162
1201
 
1163
- *Nikolay Kondratyev*
1202
+ *James Pearson*
1164
1203
 
1165
- * Fix `touch` option to behave consistently with `Persistence#touch` method.
1204
+ * Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section.
1166
1205
 
1167
- *Ryuta Kamizono*
1206
+ *Tongfei Gao*
1168
1207
 
1169
- * Migrations raise when duplicate column definition.
1208
+ * Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
1170
1209
 
1171
- Fixes #33024.
1210
+ *John Crepezzi*, *Eileen Uchitelle*
1172
1211
 
1173
- *Federico Martinez*
1212
+ * Add a warning for enum elements with 'not_' prefix.
1174
1213
 
1175
- * Bump minimum SQLite version to 3.8
1214
+ class Foo
1215
+ enum status: [:sent, :not_sent]
1216
+ end
1176
1217
 
1177
- *Yasuo Honda*
1218
+ *Edu Depetris*
1178
1219
 
1179
- * Fix parent record should not get saved with duplicate children records.
1220
+ * Make currency symbols optional for money column type in PostgreSQL.
1180
1221
 
1181
- Fixes #32940.
1222
+ *Joel Schneider*
1182
1223
 
1183
- *Santosh Wadghule*
1224
+ * Add support for beginless ranges, introduced in Ruby 2.7.
1184
1225
 
1185
- * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
1226
+ *Josh Goodall*
1186
1227
 
1187
- *Brian Durand*
1228
+ * Add `database_exists?` method to connection adapters to check if a database exists.
1188
1229
 
1189
- * Ensure `Associations::CollectionAssociation#size` and `Associations::CollectionAssociation#empty?`
1190
- use loaded association ids if present.
1230
+ *Guilherme Mansur*
1191
1231
 
1192
- *Graham Turner*
1232
+ * Loading the schema for a model that has no `table_name` raises a `TableNotSpecified` error.
1193
1233
 
1194
- * Add support to preload associations of polymorphic associations when not all the records have the requested associations.
1234
+ *Guilherme Mansur*, *Eugene Kenny*
1195
1235
 
1196
- *Dana Sherson*
1236
+ * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
1197
1237
 
1198
- * Add `touch_all` method to `ActiveRecord::Relation`.
1238
+ Fixes #36022.
1199
1239
 
1200
- Example:
1240
+ *Ryuta Kamizono*
1201
1241
 
1202
- Person.where(name: "David").touch_all(time: Time.new(2020, 5, 16, 0, 0, 0))
1242
+ * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
1203
1243
 
1204
- *fatkodima*, *duggiefresh*
1244
+ Fixes #36465.
1205
1245
 
1206
- * Add `ActiveRecord::Base.base_class?` predicate.
1246
+ *Jeff Doering*
1207
1247
 
1208
- *Bogdan Gusiev*
1248
+ * Add support for multiple databases to `rails db:abort_if_pending_migrations`.
1209
1249
 
1210
- * Add custom prefix/suffix options to `ActiveRecord::Store.store_accessor`.
1250
+ *Mark Lee*
1211
1251
 
1212
- *Tan Huynh*, *Yukio Mizuta*
1252
+ * Fix sqlite3 collation parsing when using decimal columns.
1213
1253
 
1214
- * Rails 6 requires Ruby 2.5.0 or newer.
1254
+ *Martin R. Schuster*
1215
1255
 
1216
- *Jeremy Daer*, *Kasper Timm Hansen*
1256
+ * Fix invalid schema when primary key column has a comment.
1217
1257
 
1218
- * Deprecate `update_attributes`/`!` in favor of `update`/`!`.
1258
+ Fixes #29966.
1219
1259
 
1220
- *Eddie Lebow*
1260
+ *Guilherme Goettems Schneider*
1221
1261
 
1222
- * Add `ActiveRecord::Base.create_or_find_by`/`!` to deal with the SELECT/INSERT race condition in
1223
- `ActiveRecord::Base.find_or_create_by`/`!` by leaning on unique constraints in the database.
1262
+ * Fix table comment also being applied to the primary key column.
1224
1263
 
1225
- *DHH*
1264
+ *Guilherme Goettems Schneider*
1226
1265
 
1227
- * Add `Relation#pick` as short-hand for single-value plucks.
1266
+ * Allow generated `create_table` migrations to include or skip timestamps.
1228
1267
 
1229
- *DHH*
1268
+ *Michael Duchemin*
1230
1269
 
1231
1270
 
1232
- Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activerecord/CHANGELOG.md) for previous changes.
1271
+ Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activerecord/CHANGELOG.md) for previous changes.