activerecord 6.0.1 → 6.1.0

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