activerecord 6.0.5 → 6.1.0.rc1

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

Potentially problematic release.


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

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