activerecord 6.0.3.7 → 6.1.0.rc1

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

Potentially problematic release.


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

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