activerecord 6.0.3.6 → 6.1.3

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