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