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