activerecord 6.0.3.6 → 6.1.0.rc1

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

Potentially problematic release.


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

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