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