activerecord 6.0.4.1 → 6.1.0.rc1

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

Potentially problematic release.


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

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