activerecord 5.2.8.1 → 6.1.6.1

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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1255 -596
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +7 -5
  5. data/examples/performance.rb +1 -1
  6. data/lib/active_record/aggregations.rb +9 -8
  7. data/lib/active_record/association_relation.rb +30 -10
  8. data/lib/active_record/associations/alias_tracker.rb +19 -16
  9. data/lib/active_record/associations/association.rb +100 -41
  10. data/lib/active_record/associations/association_scope.rb +23 -21
  11. data/lib/active_record/associations/belongs_to_association.rb +55 -48
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +7 -6
  13. data/lib/active_record/associations/builder/association.rb +45 -22
  14. data/lib/active_record/associations/builder/belongs_to.rb +29 -59
  15. data/lib/active_record/associations/builder/collection_association.rb +8 -17
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -41
  17. data/lib/active_record/associations/builder/has_many.rb +8 -2
  18. data/lib/active_record/associations/builder/has_one.rb +33 -2
  19. data/lib/active_record/associations/builder/singular_association.rb +3 -1
  20. data/lib/active_record/associations/collection_association.rb +44 -34
  21. data/lib/active_record/associations/collection_proxy.rb +25 -21
  22. data/lib/active_record/associations/foreign_association.rb +20 -0
  23. data/lib/active_record/associations/has_many_association.rb +26 -13
  24. data/lib/active_record/associations/has_many_through_association.rb +24 -18
  25. data/lib/active_record/associations/has_one_association.rb +43 -31
  26. data/lib/active_record/associations/has_one_through_association.rb +5 -5
  27. data/lib/active_record/associations/join_dependency/join_association.rb +44 -22
  28. data/lib/active_record/associations/join_dependency/join_part.rb +5 -5
  29. data/lib/active_record/associations/join_dependency.rb +91 -60
  30. data/lib/active_record/associations/preloader/association.rb +69 -43
  31. data/lib/active_record/associations/preloader/through_association.rb +49 -40
  32. data/lib/active_record/associations/preloader.rb +47 -34
  33. data/lib/active_record/associations/singular_association.rb +3 -17
  34. data/lib/active_record/associations/through_association.rb +1 -1
  35. data/lib/active_record/associations.rb +137 -25
  36. data/lib/active_record/attribute_assignment.rb +17 -19
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -7
  38. data/lib/active_record/attribute_methods/dirty.rb +101 -40
  39. data/lib/active_record/attribute_methods/primary_key.rb +20 -25
  40. data/lib/active_record/attribute_methods/query.rb +4 -8
  41. data/lib/active_record/attribute_methods/read.rb +14 -56
  42. data/lib/active_record/attribute_methods/serialization.rb +12 -7
  43. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -15
  44. data/lib/active_record/attribute_methods/write.rb +18 -34
  45. data/lib/active_record/attribute_methods.rb +81 -143
  46. data/lib/active_record/attributes.rb +46 -9
  47. data/lib/active_record/autosave_association.rb +57 -42
  48. data/lib/active_record/base.rb +4 -17
  49. data/lib/active_record/callbacks.rb +158 -43
  50. data/lib/active_record/coders/yaml_column.rb +1 -2
  51. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +272 -130
  52. data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -36
  53. data/lib/active_record/connection_adapters/abstract/database_statements.rb +167 -146
  54. data/lib/active_record/connection_adapters/abstract/query_cache.rb +18 -14
  55. data/lib/active_record/connection_adapters/abstract/quoting.rb +98 -47
  56. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  57. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -110
  58. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +211 -90
  59. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +2 -4
  60. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +385 -144
  61. data/lib/active_record/connection_adapters/abstract/transaction.rb +167 -69
  62. data/lib/active_record/connection_adapters/abstract_adapter.rb +229 -99
  63. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +243 -275
  64. data/lib/active_record/connection_adapters/column.rb +30 -12
  65. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  66. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
  67. data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
  68. data/lib/active_record/connection_adapters/mysql/database_statements.rb +88 -32
  69. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
  70. data/lib/active_record/connection_adapters/mysql/quoting.rb +59 -7
  71. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +34 -10
  72. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +48 -32
  73. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +18 -7
  74. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +142 -19
  75. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +14 -9
  76. data/lib/active_record/connection_adapters/mysql2_adapter.rb +53 -18
  77. data/lib/active_record/connection_adapters/pool_config.rb +73 -0
  78. data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
  79. data/lib/active_record/connection_adapters/postgresql/column.rb +37 -28
  80. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +40 -54
  81. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
  82. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
  83. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  84. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  85. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
  86. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  87. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +3 -4
  90. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +3 -4
  93. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +25 -7
  94. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  95. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
  96. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +15 -3
  97. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  98. data/lib/active_record/connection_adapters/postgresql/quoting.rb +47 -10
  99. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
  100. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +19 -4
  101. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
  102. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
  103. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +120 -100
  104. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +31 -26
  105. data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
  106. data/lib/active_record/connection_adapters/postgresql_adapter.rb +224 -120
  107. data/lib/active_record/connection_adapters/schema_cache.rb +159 -21
  108. data/lib/active_record/connection_adapters/sql_type_metadata.rb +17 -6
  109. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +146 -0
  110. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -7
  111. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  112. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +77 -13
  113. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +174 -186
  114. data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
  115. data/lib/active_record/connection_adapters.rb +52 -0
  116. data/lib/active_record/connection_handling.rb +293 -33
  117. data/lib/active_record/core.rb +333 -98
  118. data/lib/active_record/counter_cache.rb +8 -30
  119. data/lib/active_record/database_configurations/connection_url_resolver.rb +99 -0
  120. data/lib/active_record/database_configurations/database_config.rb +80 -0
  121. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  122. data/lib/active_record/database_configurations/url_config.rb +53 -0
  123. data/lib/active_record/database_configurations.rb +273 -0
  124. data/lib/active_record/delegated_type.rb +209 -0
  125. data/lib/active_record/destroy_association_async_job.rb +36 -0
  126. data/lib/active_record/dynamic_matchers.rb +3 -4
  127. data/lib/active_record/enum.rb +108 -36
  128. data/lib/active_record/errors.rb +62 -19
  129. data/lib/active_record/explain.rb +10 -6
  130. data/lib/active_record/explain_subscriber.rb +1 -1
  131. data/lib/active_record/fixture_set/file.rb +10 -17
  132. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  133. data/lib/active_record/fixture_set/render_context.rb +17 -0
  134. data/lib/active_record/fixture_set/table_row.rb +152 -0
  135. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  136. data/lib/active_record/fixtures.rb +200 -481
  137. data/lib/active_record/gem_version.rb +3 -3
  138. data/lib/active_record/inheritance.rb +53 -24
  139. data/lib/active_record/insert_all.rb +212 -0
  140. data/lib/active_record/integration.rb +67 -17
  141. data/lib/active_record/internal_metadata.rb +28 -9
  142. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  143. data/lib/active_record/locking/optimistic.rb +37 -23
  144. data/lib/active_record/locking/pessimistic.rb +9 -5
  145. data/lib/active_record/log_subscriber.rb +35 -35
  146. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  147. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  148. data/lib/active_record/middleware/database_selector.rb +77 -0
  149. data/lib/active_record/migration/command_recorder.rb +96 -44
  150. data/lib/active_record/migration/compatibility.rb +145 -64
  151. data/lib/active_record/migration/join_table.rb +0 -1
  152. data/lib/active_record/migration.rb +206 -157
  153. data/lib/active_record/model_schema.rb +148 -22
  154. data/lib/active_record/nested_attributes.rb +4 -7
  155. data/lib/active_record/no_touching.rb +8 -1
  156. data/lib/active_record/null_relation.rb +0 -1
  157. data/lib/active_record/persistence.rb +267 -59
  158. data/lib/active_record/query_cache.rb +21 -4
  159. data/lib/active_record/querying.rb +40 -23
  160. data/lib/active_record/railtie.rb +116 -59
  161. data/lib/active_record/railties/console_sandbox.rb +2 -4
  162. data/lib/active_record/railties/controller_runtime.rb +30 -35
  163. data/lib/active_record/railties/databases.rake +411 -80
  164. data/lib/active_record/readonly_attributes.rb +4 -0
  165. data/lib/active_record/reflection.rb +109 -93
  166. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  167. data/lib/active_record/relation/batches.rb +44 -35
  168. data/lib/active_record/relation/calculations.rb +157 -90
  169. data/lib/active_record/relation/delegation.rb +35 -50
  170. data/lib/active_record/relation/finder_methods.rb +64 -39
  171. data/lib/active_record/relation/from_clause.rb +5 -1
  172. data/lib/active_record/relation/merger.rb +32 -40
  173. data/lib/active_record/relation/predicate_builder/array_handler.rb +13 -13
  174. data/lib/active_record/relation/predicate_builder/association_query_value.rb +5 -9
  175. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
  176. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +11 -10
  177. data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
  178. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  179. data/lib/active_record/relation/predicate_builder.rb +62 -45
  180. data/lib/active_record/relation/query_attribute.rb +13 -8
  181. data/lib/active_record/relation/query_methods.rb +476 -187
  182. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  183. data/lib/active_record/relation/spawn_methods.rb +9 -9
  184. data/lib/active_record/relation/where_clause.rb +115 -62
  185. data/lib/active_record/relation.rb +379 -115
  186. data/lib/active_record/result.rb +64 -38
  187. data/lib/active_record/runtime_registry.rb +2 -2
  188. data/lib/active_record/sanitization.rb +22 -41
  189. data/lib/active_record/schema.rb +2 -11
  190. data/lib/active_record/schema_dumper.rb +54 -9
  191. data/lib/active_record/schema_migration.rb +7 -9
  192. data/lib/active_record/scoping/default.rb +4 -8
  193. data/lib/active_record/scoping/named.rb +17 -24
  194. data/lib/active_record/scoping.rb +8 -9
  195. data/lib/active_record/secure_token.rb +16 -8
  196. data/lib/active_record/serialization.rb +5 -3
  197. data/lib/active_record/signed_id.rb +116 -0
  198. data/lib/active_record/statement_cache.rb +49 -6
  199. data/lib/active_record/store.rb +88 -9
  200. data/lib/active_record/suppressor.rb +2 -2
  201. data/lib/active_record/table_metadata.rb +42 -43
  202. data/lib/active_record/tasks/database_tasks.rb +277 -81
  203. data/lib/active_record/tasks/mysql_database_tasks.rb +37 -39
  204. data/lib/active_record/tasks/postgresql_database_tasks.rb +27 -32
  205. data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -17
  206. data/lib/active_record/test_databases.rb +24 -0
  207. data/lib/active_record/test_fixtures.rb +287 -0
  208. data/lib/active_record/timestamp.rb +43 -32
  209. data/lib/active_record/touch_later.rb +23 -22
  210. data/lib/active_record/transactions.rb +62 -118
  211. data/lib/active_record/translation.rb +1 -1
  212. data/lib/active_record/type/adapter_specific_registry.rb +3 -13
  213. data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
  214. data/lib/active_record/type/serialized.rb +6 -3
  215. data/lib/active_record/type/time.rb +10 -0
  216. data/lib/active_record/type/type_map.rb +0 -1
  217. data/lib/active_record/type/unsigned_integer.rb +0 -1
  218. data/lib/active_record/type.rb +10 -5
  219. data/lib/active_record/type_caster/connection.rb +15 -15
  220. data/lib/active_record/type_caster/map.rb +8 -8
  221. data/lib/active_record/validations/associated.rb +1 -2
  222. data/lib/active_record/validations/numericality.rb +35 -0
  223. data/lib/active_record/validations/uniqueness.rb +38 -30
  224. data/lib/active_record/validations.rb +4 -3
  225. data/lib/active_record.rb +13 -12
  226. data/lib/arel/alias_predication.rb +9 -0
  227. data/lib/arel/attributes/attribute.rb +41 -0
  228. data/lib/arel/collectors/bind.rb +29 -0
  229. data/lib/arel/collectors/composite.rb +39 -0
  230. data/lib/arel/collectors/plain_string.rb +20 -0
  231. data/lib/arel/collectors/sql_string.rb +27 -0
  232. data/lib/arel/collectors/substitute_binds.rb +35 -0
  233. data/lib/arel/crud.rb +42 -0
  234. data/lib/arel/delete_manager.rb +18 -0
  235. data/lib/arel/errors.rb +9 -0
  236. data/lib/arel/expressions.rb +29 -0
  237. data/lib/arel/factory_methods.rb +49 -0
  238. data/lib/arel/insert_manager.rb +49 -0
  239. data/lib/arel/math.rb +45 -0
  240. data/lib/arel/nodes/and.rb +32 -0
  241. data/lib/arel/nodes/ascending.rb +23 -0
  242. data/lib/arel/nodes/binary.rb +126 -0
  243. data/lib/arel/nodes/bind_param.rb +44 -0
  244. data/lib/arel/nodes/case.rb +55 -0
  245. data/lib/arel/nodes/casted.rb +62 -0
  246. data/lib/arel/nodes/comment.rb +29 -0
  247. data/lib/arel/nodes/count.rb +12 -0
  248. data/lib/arel/nodes/delete_statement.rb +45 -0
  249. data/lib/arel/nodes/descending.rb +23 -0
  250. data/lib/arel/nodes/equality.rb +15 -0
  251. data/lib/arel/nodes/extract.rb +24 -0
  252. data/lib/arel/nodes/false.rb +16 -0
  253. data/lib/arel/nodes/full_outer_join.rb +8 -0
  254. data/lib/arel/nodes/function.rb +44 -0
  255. data/lib/arel/nodes/grouping.rb +11 -0
  256. data/lib/arel/nodes/homogeneous_in.rb +76 -0
  257. data/lib/arel/nodes/in.rb +15 -0
  258. data/lib/arel/nodes/infix_operation.rb +92 -0
  259. data/lib/arel/nodes/inner_join.rb +8 -0
  260. data/lib/arel/nodes/insert_statement.rb +37 -0
  261. data/lib/arel/nodes/join_source.rb +20 -0
  262. data/lib/arel/nodes/matches.rb +18 -0
  263. data/lib/arel/nodes/named_function.rb +23 -0
  264. data/lib/arel/nodes/node.rb +51 -0
  265. data/lib/arel/nodes/node_expression.rb +13 -0
  266. data/lib/arel/nodes/ordering.rb +27 -0
  267. data/lib/arel/nodes/outer_join.rb +8 -0
  268. data/lib/arel/nodes/over.rb +15 -0
  269. data/lib/arel/nodes/regexp.rb +16 -0
  270. data/lib/arel/nodes/right_outer_join.rb +8 -0
  271. data/lib/arel/nodes/select_core.rb +67 -0
  272. data/lib/arel/nodes/select_statement.rb +41 -0
  273. data/lib/arel/nodes/sql_literal.rb +19 -0
  274. data/lib/arel/nodes/string_join.rb +11 -0
  275. data/lib/arel/nodes/table_alias.rb +31 -0
  276. data/lib/arel/nodes/terminal.rb +16 -0
  277. data/lib/arel/nodes/true.rb +16 -0
  278. data/lib/arel/nodes/unary.rb +44 -0
  279. data/lib/arel/nodes/unary_operation.rb +20 -0
  280. data/lib/arel/nodes/unqualified_column.rb +22 -0
  281. data/lib/arel/nodes/update_statement.rb +41 -0
  282. data/lib/arel/nodes/values_list.rb +9 -0
  283. data/lib/arel/nodes/window.rb +126 -0
  284. data/lib/arel/nodes/with.rb +11 -0
  285. data/lib/arel/nodes.rb +70 -0
  286. data/lib/arel/order_predications.rb +13 -0
  287. data/lib/arel/predications.rb +250 -0
  288. data/lib/arel/select_manager.rb +270 -0
  289. data/lib/arel/table.rb +118 -0
  290. data/lib/arel/tree_manager.rb +72 -0
  291. data/lib/arel/update_manager.rb +34 -0
  292. data/lib/arel/visitors/dot.rb +308 -0
  293. data/lib/arel/visitors/mysql.rb +93 -0
  294. data/lib/arel/visitors/postgresql.rb +120 -0
  295. data/lib/arel/visitors/sqlite.rb +38 -0
  296. data/lib/arel/visitors/to_sql.rb +899 -0
  297. data/lib/arel/visitors/visitor.rb +45 -0
  298. data/lib/arel/visitors.rb +13 -0
  299. data/lib/arel/window_predications.rb +9 -0
  300. data/lib/arel.rb +54 -0
  301. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  302. data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -5
  303. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +3 -1
  304. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +7 -5
  305. data/lib/rails/generators/active_record/migration.rb +19 -2
  306. data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
  307. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  308. data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
  309. metadata +116 -30
  310. data/lib/active_record/attribute_decorators.rb +0 -90
  311. data/lib/active_record/collection_cache_key.rb +0 -53
  312. data/lib/active_record/connection_adapters/connection_specification.rb +0 -287
  313. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -33
  314. data/lib/active_record/define_callbacks.rb +0 -22
  315. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -19
  316. data/lib/active_record/relation/where_clause_factory.rb +0 -34
data/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ## Rails 5.2.8.1 (July 12, 2022) ##
1
+ ## Rails 6.1.6.1 (July 12, 2022) ##
2
2
 
3
3
  * Change ActiveRecord::Coders::YAMLColumn default to safe_load
4
4
 
@@ -26,1059 +26,1718 @@
26
26
  [CVE-2022-32224]
27
27
 
28
28
 
29
- ## Rails 5.2.8 (May 09, 2022) ##
29
+ ## Rails 6.1.5.1 (April 26, 2022) ##
30
30
 
31
31
  * No changes.
32
32
 
33
33
 
34
- ## Rails 5.2.7.1 (April 26, 2022) ##
34
+ ## Rails 6.1.5 (March 09, 2022) ##
35
35
 
36
- * No changes.
36
+ * Fix `ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` for Ruby 2.6.
37
37
 
38
+ Ruby 2.6 and 2.7 have slightly different implementations of the `String#-@` method.
39
+ In Ruby 2.6, the receiver of the `String#-@` method is modified under certain circumstances.
40
+ This was later identified as a bug (https://bugs.ruby-lang.org/issues/15926) and only
41
+ fixed in Ruby 2.7.
38
42
 
39
- ## Rails 5.2.7 (March 10, 2022) ##
43
+ Before the changes in this commit, the
44
+ `ActiveRecord::ConnectionAdapters::SchemaCache#deep_deduplicate` method, which internally
45
+ calls the `String#-@` method, could also modify an input string argument in Ruby 2.6 --
46
+ changing a tainted, unfrozen string into a tainted, frozen string.
40
47
 
41
- * No changes.
48
+ Fixes #43056
42
49
 
50
+ *Eric O'Hanlon*
43
51
 
44
- ## Rails 5.2.6.3 (March 08, 2022) ##
52
+ * Fix migration compatibility to create SQLite references/belongs_to column as integer when
53
+ migration version is 6.0.
45
54
 
46
- * No changes.
55
+ `reference`/`belongs_to` in migrations with version 6.0 were creating columns as
56
+ bigint instead of integer for the SQLite Adapter.
47
57
 
58
+ *Marcelo Lauxen*
48
59
 
49
- ## Rails 5.2.6.2 (February 11, 2022) ##
60
+ * Fix dbconsole for 3-tier config.
50
61
 
51
- * No changes.
62
+ *Eileen M. Uchitelle*
52
63
 
64
+ * Better handle SQL queries with invalid encoding.
53
65
 
54
- ## Rails 5.2.6.1 (February 11, 2022) ##
66
+ ```ruby
67
+ Post.create(name: "broken \xC8 UTF-8")
68
+ ```
55
69
 
56
- * No changes.
70
+ Would cause all adapters to fail in a non controlled way in the code
71
+ responsible to detect write queries.
57
72
 
73
+ The query is now properly passed to the database connection, which might or might
74
+ not be able to handle it, but will either succeed or failed in a more correct way.
58
75
 
59
- ## Rails 5.2.6 (May 05, 2021) ##
76
+ *Jean Boussier*
60
77
 
61
- * No changes.
78
+ * Ignore persisted in-memory records when merging target lists.
62
79
 
80
+ *Kevin Sjöberg*
63
81
 
64
- ## Rails 5.2.5 (March 26, 2021) ##
82
+ * Fix regression bug that caused ignoring additional conditions for preloading
83
+ `has_many` through relations.
65
84
 
66
- * No changes.
85
+ Fixes #43132
67
86
 
87
+ *Alexander Pauly*
68
88
 
69
- ## Rails 5.2.4.6 (May 05, 2021) ##
89
+ * Fix `ActiveRecord::InternalMetadata` to not be broken by
90
+ `config.active_record.record_timestamps = false`
70
91
 
71
- * No changes.
92
+ Since the model always create the timestamp columns, it has to set them, otherwise it breaks
93
+ various DB management tasks.
72
94
 
95
+ Fixes #42983
73
96
 
74
- ## Rails 5.2.4.5 (February 10, 2021) ##
97
+ *Jean Boussier*
75
98
 
76
- * Fix possible DoS vector in PostgreSQL money type
99
+ * Fix duplicate active record objects on `inverse_of`.
77
100
 
78
- Carefully crafted input can cause a DoS via the regular expressions used
79
- for validating the money format in the PostgreSQL adapter. This patch
80
- fixes the regexp.
101
+ *Justin Carvalho*
81
102
 
82
- Thanks to @dee-see from Hackerone for this patch!
103
+ * Fix duplicate objects stored in has many association after save.
83
104
 
84
- [CVE-2021-22880]
105
+ Fixes #42549.
85
106
 
86
- *Aaron Patterson*
107
+ *Alex Ghiculescu*
108
+
109
+ * Fix performance regression in `CollectionAssocation#build`.
110
+
111
+ *Alex Ghiculescu*
87
112
 
113
+ * Fix retrieving default value for text column for MariaDB.
114
+
115
+ *fatkodima*
88
116
 
89
- ## Rails 5.2.4.4 (September 09, 2020) ##
117
+
118
+ ## Rails 6.1.4.7 (March 08, 2022) ##
90
119
 
91
120
  * No changes.
92
121
 
93
122
 
94
- ## Rails 5.2.4.3 (May 18, 2020) ##
123
+ ## Rails 6.1.4.6 (February 11, 2022) ##
95
124
 
96
125
  * No changes.
97
126
 
98
- ## Rails 5.2.4.2 (March 19, 2020) ##
127
+
128
+ ## Rails 6.1.4.5 (February 11, 2022) ##
99
129
 
100
130
  * No changes.
101
131
 
102
132
 
103
- ## Rails 5.2.4.1 (December 18, 2019) ##
133
+ ## Rails 6.1.4.4 (December 15, 2021) ##
104
134
 
105
135
  * No changes.
106
136
 
107
137
 
108
- ## Rails 5.2.4 (November 27, 2019) ##
138
+ ## Rails 6.1.4.3 (December 14, 2021) ##
109
139
 
110
- * Fix circular `autosave: true` causes invalid records to be saved.
140
+ * No changes.
111
141
 
112
- Prior to the fix, when there was a circular series of `autosave: true`
113
- associations, the callback for a `has_many` association was run while
114
- another instance of the same callback on the same association hadn't
115
- finished running. When control returned to the first instance of the
116
- callback, the instance variable had changed, and subsequent associated
117
- records weren't saved correctly. Specifically, the ID field for the
118
- `belongs_to` corresponding to the `has_many` was `nil`.
119
142
 
120
- Fixes #28080.
143
+ ## Rails 6.1.4.2 (December 14, 2021) ##
121
144
 
122
- *Larry Reid*
145
+ * No changes.
123
146
 
124
- * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
125
147
 
126
- Fixes #36022.
148
+ ## Rails 6.1.4.1 (August 19, 2021) ##
127
149
 
128
- *Ryuta Kamizono*
150
+ * No changes.
129
151
 
130
- * Fix sqlite3 collation parsing when using decimal columns.
131
152
 
132
- *Martin R. Schuster*
153
+ ## Rails 6.1.4 (June 24, 2021) ##
133
154
 
134
- * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
155
+ * Do not try to rollback transactions that failed due to a `ActiveRecord::TransactionRollbackError`.
135
156
 
136
- Fixes #36465.
157
+ *Jamie McCarthy*
137
158
 
138
- *Jeff Doering*
159
+ * Raise an error if `pool_config` is `nil` in `set_pool_config`.
139
160
 
140
- * Assign all attributes before calling `build` to ensure the child record is visible in
141
- `before_add` and `after_add` callbacks for `has_many :through` associations.
161
+ *Eileen M. Uchitelle*
162
+
163
+ * Fix compatibility with `psych >= 4`.
142
164
 
143
- Fixes #33249.
165
+ Starting in Psych 4.0.0 `YAML.load` behaves like `YAML.safe_load`. To preserve compatibility
166
+ Active Record's schema cache loader and `YAMLColumn` now uses `YAML.unsafe_load` if available.
144
167
 
145
- *Ryan H. Kerr*
168
+ *Jean Boussier*
146
169
 
170
+ * Support using replicas when using `rails dbconsole`.
147
171
 
148
- ## Rails 5.2.3 (March 27, 2019) ##
172
+ *Christopher Thornton*
149
173
 
150
- * Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
174
+ * Restore connection pools after transactional tests.
151
175
 
152
- Fixes #35214.
176
+ *Eugene Kenny*
153
177
 
154
- *Juani Villarejo*
178
+ * Change `upsert_all` to fails cleanly for MySQL when `:unique_by` is used.
155
179
 
156
- * Fix prepared statements caching to be enabled even when query caching is enabled.
180
+ *Bastian Bartmann*
157
181
 
158
- *Ryuta Kamizono*
182
+ * Fix user-defined `self.default_scope` to respect table alias.
159
183
 
160
- * Don't allow `where` with invalid value matches to nil values.
184
+ *Ryuta Kamizono*
161
185
 
162
- Fixes #33624.
186
+ * Clear `@cache_keys` cache after `update_all`, `delete_all`, `destroy_all`.
163
187
 
164
188
  *Ryuta Kamizono*
165
189
 
166
- * Restore an ability that class level `update` without giving ids.
190
+ * Changed Arel predications `contains` and `overlaps` to use
191
+ `quoted_node` so that PostgreSQL arrays are quoted properly.
192
+
193
+ *Bradley Priest*
167
194
 
168
- Fixes #34743.
195
+ * Fix `merge` when the `where` clauses have string contents.
169
196
 
170
197
  *Ryuta Kamizono*
171
198
 
172
- * Fix join table column quoting with SQLite.
199
+ * Fix rollback of parent destruction with nested `dependent: :destroy`.
173
200
 
174
- *Gannon McGibbon*
201
+ *Jacopo Beschi*
175
202
 
176
- * Ensure that `delete_all` on collection proxy returns affected count.
203
+ * Fix binds logging for `"WHERE ... IN ..."` statements.
177
204
 
178
- *Ryuta Kamizono*
205
+ *Ricardo Díaz*
179
206
 
180
- * Reset scope after delete on collection association to clear stale offsets of removed records.
207
+ * Handle `false` in relation strict loading checks.
181
208
 
182
- *Gannon McGibbon*
209
+ Previously when a model had strict loading set to true and then had a
210
+ relation set `strict_loading` to false the false wasn't considered when
211
+ deciding whether to raise/warn about strict loading.
212
+
213
+ ```
214
+ class Dog < ActiveRecord::Base
215
+ self.strict_loading_by_default = true
183
216
 
217
+ has_many :treats, strict_loading: false
218
+ end
219
+ ```
184
220
 
185
- ## Rails 5.2.2.1 (March 11, 2019) ##
221
+ In the example, `dog.treats` would still raise even though
222
+ `strict_loading` was set to false. This is a bug affecting more than
223
+ Active Storage which is why I made this PR superseding #41461. We need
224
+ to fix this for all applications since the behavior is a little
225
+ surprising. I took the test from #41461 and the code suggestion from #41453
226
+ with some additions.
186
227
 
187
- * No changes.
228
+ *Eileen M. Uchitelle*, *Radamés Roriz*
188
229
 
230
+ * Fix numericality validator without precision.
189
231
 
190
- ## Rails 5.2.2 (December 04, 2018) ##
232
+ *Ryuta Kamizono*
191
233
 
192
- * Do not ignore the scoping with query methods in the scope block.
234
+ * Fix aggregate attribute on Enum types.
193
235
 
194
236
  *Ryuta Kamizono*
195
237
 
196
- * Allow aliased attributes to be used in `#update_columns` and `#update`.
238
+ * Fix `CREATE INDEX` statement generation for PostgreSQL.
197
239
 
198
- *Gannon McGibbon*
240
+ *eltongo*
199
241
 
200
- * Allow spaces in postgres table names.
242
+ * Fix where clause on enum attribute when providing array of strings.
201
243
 
202
- Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres
203
- adapter.
244
+ *Ryuta Kamizono*
204
245
 
205
- *Gannon McGibbon*
246
+ * Fix `unprepared_statement` to work it when nesting.
206
247
 
207
- * Cached columns_hash fields should be excluded from ResultSet#column_types
248
+ *Ryuta Kamizono*
208
249
 
209
- PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test
210
- was passing for SQLite and MySQL, but failed for PostgreSQL:
211
250
 
212
- ```ruby
213
- class DeveloperName < ActiveRecord::Type::String
214
- def deserialize(value)
215
- "Developer: #{value}"
216
- end
217
- end
251
+ ## Rails 6.1.3.2 (May 05, 2021) ##
218
252
 
219
- class AttributedDeveloper < ActiveRecord::Base
220
- self.table_name = "developers"
253
+ * No changes.
221
254
 
222
- attribute :name, DeveloperName.new
223
255
 
224
- self.ignored_columns += ["name"]
225
- end
256
+ ## Rails 6.1.3.1 (March 26, 2021) ##
226
257
 
227
- developer = AttributedDeveloper.create
228
- developer.update_column :name, "name"
258
+ * No changes.
229
259
 
230
- loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
231
- puts loaded_developer.name # should be "Developer: name" but it's just "name"
232
- ```
233
260
 
234
- *Dmitry Tsepelev*
261
+ ## Rails 6.1.3 (February 17, 2021) ##
235
262
 
236
- * Values of enum are frozen, raising an error when attempting to modify them.
263
+ * Fix the MySQL adapter to always set the right collation and charset
264
+ to the connection session.
237
265
 
238
- *Emmanuel Byrd*
266
+ *Rafael Mendonça França*
239
267
 
240
- * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
241
- if the attribute does not exist.
268
+ * Fix MySQL adapter handling of time objects when prepared statements
269
+ are enabled.
242
270
 
243
- *Sean Griffin*
271
+ *Rafael Mendonça França*
244
272
 
245
- * Do not use prepared statement in queries that have a large number of binds.
273
+ * Fix scoping in enum fields using conditions that would generate
274
+ an `IN` clause.
246
275
 
247
276
  *Ryuta Kamizono*
248
277
 
249
- * Fix query cache to load before first request.
278
+ * Skip optimised #exist? query when #include? is called on a relation
279
+ with a having clause
250
280
 
251
- *Eileen M. Uchitelle*
281
+ Relations that have aliased select values AND a having clause that
282
+ references an aliased select value would generate an error when
283
+ #include? was called, due to an optimisation that would generate
284
+ call #exists? on the relation instead, which effectively alters
285
+ the select values of the query (and thus removes the aliased select
286
+ values), but leaves the having clause intact. Because the having
287
+ clause is then referencing an aliased column that is no longer
288
+ present in the simplified query, an ActiveRecord::InvalidStatement
289
+ error was raised.
252
290
 
253
- * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
291
+ An sample query affected by this problem:
254
292
 
255
- Fixes #33056.
293
+ ```ruby
294
+ Author.select('COUNT(*) as total_posts', 'authors.*')
295
+ .joins(:posts)
296
+ .group(:id)
297
+ .having('total_posts > 2')
298
+ .include?(Author.first)
299
+ ```
256
300
 
257
- *Federico Martinez*
301
+ This change adds an addition check to the condition that skips the
302
+ simplified #exists? query, which simply checks for the presence of
303
+ a having clause.
258
304
 
259
- * Fix duplicated record creation when using nested attributes with `create_with`.
305
+ Fixes #41417
260
306
 
261
- *Darwin Wu*
307
+ *Michael Smart*
262
308
 
263
- * Fix regression setting children record in parent `before_save` callback.
309
+ * Increment postgres prepared statement counter before making a prepared statement, so if the statement is aborted
310
+ without Rails knowledge (e.g., if app gets kill -9d during long-running query or due to Rack::Timeout), app won't end
311
+ up in perpetual crash state for being inconsistent with Postgres.
264
312
 
265
- *Guo Xiang Tan*
313
+ *wbharding*, *Martin Tepper*
266
314
 
267
- * Prevent leaking of user's DB credentials on `rails db:create` failure.
268
315
 
269
- *bogdanvlviv*
316
+ ## Rails 6.1.2.1 (February 10, 2021) ##
270
317
 
271
- * Clear mutation tracker before continuing the around callbacks.
318
+ * Fix possible DoS vector in PostgreSQL money type
319
+
320
+ Carefully crafted input can cause a DoS via the regular expressions used
321
+ for validating the money format in the PostgreSQL adapter. This patch
322
+ fixes the regexp.
272
323
 
273
- *Yuya Tanaka*
324
+ Thanks to @dee-see from Hackerone for this patch!
274
325
 
275
- * Prevent deadlocks when waiting for connection from pool.
326
+ [CVE-2021-22880]
276
327
 
277
- *Brent Wheeldon*
328
+ *Aaron Patterson*
278
329
 
279
- * Avoid extra scoping when using `Relation#update` that was causing this method to change the current scope.
280
330
 
281
- *Ryuta Kamizono*
331
+ ## Rails 6.1.2 (February 09, 2021) ##
282
332
 
283
- * Fix numericality validator not to be affected by custom getter.
333
+ * Fix timestamp type for sqlite3.
284
334
 
285
- *Ryuta Kamizono*
335
+ *Eileen M. Uchitelle*
286
336
 
287
- * Fix bulk change table ignores comment option on PostgreSQL.
337
+ * Make destroy async transactional.
288
338
 
289
- *Yoshiyuki Kinjo*
339
+ An active record rollback could occur while enqueuing a job. In this
340
+ case the job would enqueue even though the database deletion
341
+ rolledback putting things in a funky state.
290
342
 
343
+ Now the jobs are only enqueued until after the db transaction has been committed.
291
344
 
292
- ## Rails 5.2.1.1 (November 27, 2018) ##
345
+ *Cory Gwin*
293
346
 
294
- * No changes.
347
+ * Fix malformed packet error in MySQL statement for connection configuration.
295
348
 
349
+ *robinroestenburg*
296
350
 
297
- ## Rails 5.2.1 (August 07, 2018) ##
351
+ * Connection specification now passes the "url" key as a configuration for the
352
+ adapter if the "url" protocol is "jdbc", "http", or "https". Previously only
353
+ urls with the "jdbc" prefix were passed to the Active Record Adapter, others
354
+ are assumed to be adapter specification urls.
298
355
 
299
- * PostgreSQL: Support new relkind for partitioned tables.
356
+ Fixes #41137.
300
357
 
301
- Fixes #33008.
358
+ *Jonathan Bracy*
302
359
 
303
- *Yannick Schutz*
360
+ * Fix granular connection swapping when there are multiple abstract classes.
304
361
 
305
- * Rollback parent transaction when children fails to update.
362
+ *Eileen M. Uchitelle*
363
+
364
+ * Fix `find_by` with custom primary key for belongs_to association.
306
365
 
307
- *Guillaume Malette*
366
+ *Ryuta Kamizono*
308
367
 
309
- * Fix default value for MySQL time types with specified precision.
368
+ * Add support for `rails console --sandbox` for multiple database applications.
310
369
 
311
- *Nikolay Kondratyev*
370
+ *alpaca-tc*
312
371
 
313
- * Fix `touch` option to behave consistently with `Persistence#touch` method.
372
+ * Fix `where` on polymorphic association with empty array.
314
373
 
315
374
  *Ryuta Kamizono*
316
375
 
317
- * Fix `save` in `after_create_commit` won't invoke extra `after_create_commit`.
376
+ * Fix preventing writes for `ApplicationRecord`.
377
+
378
+ *Eileen M. Uchitelle*
379
+
380
+
381
+ ## Rails 6.1.1 (January 07, 2021) ##
382
+
383
+ * Fix fixtures loading when strict loading is enabled for the association.
318
384
 
319
- Fixes #32831.
385
+ *Alex Ghiculescu*
386
+
387
+ * Fix `where` with custom primary key for belongs_to association.
320
388
 
321
389
  *Ryuta Kamizono*
322
390
 
323
- * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
391
+ * Fix `where` with aliased associations.
324
392
 
325
- *Brian Durand*
393
+ *Ryuta Kamizono*
326
394
 
327
- * Fix parent record should not get saved with duplicate children records.
395
+ * Fix `composed_of` with symbol mapping.
328
396
 
329
- Fixes #32940.
397
+ *Ryuta Kamizono*
330
398
 
331
- *Santosh Wadghule*
399
+ * Don't skip money's type cast for pluck and calculations.
332
400
 
333
- * Fix that association's after_touch is not called with counter cache.
401
+ *Ryuta Kamizono*
334
402
 
335
- Fixes #31559.
403
+ * Fix `where` on polymorphic association with non Active Record object.
336
404
 
337
405
  *Ryuta Kamizono*
338
406
 
339
- * `becomes` should clear the mutation tracker which is created in `after_initialize`.
407
+ * Make sure `db:prepare` works even the schema file doesn't exist.
340
408
 
341
- Fixes #32867.
409
+ *Rafael Mendonça França*
410
+
411
+ * Fix complicated `has_many :through` with nested where condition.
342
412
 
343
413
  *Ryuta Kamizono*
344
414
 
345
- * Allow a belonging to parent object to be created from a new record.
415
+ * Handle STI models for `has_many dependent: :destroy_async`.
346
416
 
347
- *Jolyon Pawlyn*
417
+ *Muhammad Usman*
348
418
 
349
- * Fix that building record with assigning multiple has_one associations
350
- wrongly persists through record.
419
+ * Restore possibility of passing `false` to :polymorphic option of `belongs_to`.
351
420
 
352
- Fixes #32511.
421
+ Previously, passing `false` would trigger the option validation logic
422
+ to throw an error saying :polymorphic would not be a valid option.
353
423
 
354
- *Sam DeCesare*
424
+ *glaszig*
355
425
 
356
- * Fix relation merging when one of the relations is going to skip the
357
- query cache.
426
+ * Allow adding nonnamed expression indexes to be revertible.
358
427
 
359
- *James Williams*
428
+ Fixes #40732.
360
429
 
430
+ Previously, the following code would raise an error, when executed while rolling back,
431
+ and the index name should be specified explicitly. Now, the index name is inferred
432
+ automatically.
361
433
 
362
- ## Rails 5.2.0 (April 09, 2018) ##
434
+ ```ruby
435
+ add_index(:items, "to_tsvector('english', description)")
436
+ ```
363
437
 
364
- * MySQL: Support mysql2 0.5.x.
438
+ *fatkodima*
365
439
 
366
- *Aaron Stone*
367
440
 
368
- * Apply time column precision on assignment.
441
+ ## Rails 6.1.0 (December 09, 2020) ##
369
442
 
370
- PR #20317 changed the behavior of datetime columns so that when they
371
- have a specified precision then on assignment the value is rounded to
372
- that precision. This behavior is now applied to time columns as well.
443
+ * Only warn about negative enums if a positive form that would cause conflicts exists.
373
444
 
374
- Fixes #30301.
445
+ Fixes #39065.
375
446
 
376
- *Andrew White*
447
+ *Alex Ghiculescu*
377
448
 
378
- * Normalize time column values for SQLite database.
449
+ * Change `attribute_for_inspect` to take `filter_attributes` in consideration.
379
450
 
380
- For legacy reasons, time columns in SQLite are stored as full datetimes
381
- because until #24542 the quoting for time columns didn't remove the date
382
- component. To ensure that values are consistent we now normalize the
383
- date component to 2001-01-01 on reading and writing.
451
+ *Rafael Mendonça França*
384
452
 
385
- *Andrew White*
453
+ * Fix odd behavior of inverse_of with multiple belongs_to to same class.
386
454
 
387
- * Ensure that the date component is removed when quoting times.
455
+ Fixes #35204.
388
456
 
389
- PR #24542 altered the quoting for time columns so that the date component
390
- was removed however it only removed it when it was 2001-01-01. Now the
391
- date component is removed irrespective of what the date is.
457
+ *Tomoyuki Kai*
392
458
 
393
- *Andrew White*
459
+ * Build predicate conditions with objects that delegate `#id` and primary key:
394
460
 
395
- * Fix `dependent: :destroy` issue for has_one/belongs_to relationship where
396
- the parent class was getting deleted when the child was not.
461
+ ```ruby
462
+ class AdminAuthor
463
+ delegate_missing_to :@author
397
464
 
398
- Fixes #32022.
465
+ def initialize(author)
466
+ @author = author
467
+ end
468
+ end
399
469
 
400
- *Fernando Gorodscy*
470
+ Post.where(author: AdminAuthor.new(author))
471
+ ```
401
472
 
402
- * Whitelist `NULLS FIRST` and `NULLS LAST` in order clauses too.
473
+ *Sean Doyle*
403
474
 
404
- *Xavier Noria*
475
+ * Add `connected_to_many` API.
405
476
 
406
- * Fix that after commit callbacks on update does not triggered when optimistic locking is enabled.
477
+ This API allows applications to connect to multiple databases at once without switching all of them or implementing a deeply nested stack.
407
478
 
408
- *Ryuta Kamizono*
479
+ Before:
409
480
 
410
- * Fix `#columns_for_distinct` of MySQL and PostgreSQL to make
411
- `ActiveRecord::FinderMethods#limited_ids_for` use correct primary key values
412
- even if `ORDER BY` columns include other table's primary key.
481
+ AnimalsRecord.connected_to(role: :reading) do
482
+ MealsRecord.connected_to(role: :reading) do
483
+ Dog.first # read from animals replica
484
+ Dinner.first # read from meals replica
485
+ Person.first # read from primary writer
486
+ end
487
+ end
413
488
 
414
- Fixes #28364.
489
+ After:
415
490
 
416
- *Takumi Kagiyama*
491
+ ActiveRecord::Base.connected_to_many([AnimalsRecord, MealsRecord], role: :reading) do
492
+ Dog.first # read from animals replica
493
+ Dinner.first # read from meals replica
494
+ Person.first # read from primary writer
495
+ end
417
496
 
418
- * Make `reflection.klass` raise if `polymorphic?` not to be misused.
497
+ *Eileen M. Uchitelle*, *John Crepezzi*
419
498
 
420
- Fixes #31876.
499
+ * Add option to raise or log for `ActiveRecord::StrictLoadingViolationError`.
421
500
 
422
- *Ryuta Kamizono*
501
+ 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.
423
502
 
424
- * PostgreSQL: Allow pg-1.0 gem to be used with Active Record.
503
+ Set `config.active_record.action_on_strict_loading_violation` to `:log` errors instead of raising.
425
504
 
426
- *Lars Kanis*
505
+ *Eileen M. Uchitelle*
427
506
 
428
- * Deprecate `expand_hash_conditions_for_aggregates` without replacement.
429
- Using a `Relation` for performing queries is the prefered API.
507
+ * Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
430
508
 
431
- *Ryuta Kamizono*
509
+ Fixes #34255.
432
510
 
433
- * Fix not expanded problem when passing an Array object as argument to the where method using `composed_of` column.
511
+ *Steven Weber*
434
512
 
435
- ```
436
- david_balance = customers(:david).balance
437
- Customer.where(balance: [david_balance]).to_sql
513
+ * Optimise the length of index names for polymorphic references by using the reference name rather than the type and id column names.
438
514
 
439
- # Before: WHERE `customers`.`balance` = NULL
440
- # After : WHERE `customers`.`balance` = 50
441
- ```
515
+ 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.
442
516
 
443
- Fixes #31723.
517
+ This change reduces the chance of that happening by using the reference name, e.g. `index_my_table_on_my_reference`.
444
518
 
445
- *Yutaro Kanagawa*
519
+ Fixes #38655.
446
520
 
447
- * Fix `count(:all)` with eager loading and having an order other than the driving table.
521
+ *Luke Redpath*
448
522
 
449
- Fixes #31783.
523
+ * MySQL: Uniqueness validator now respects default database collation,
524
+ no longer enforce case sensitive comparison by default.
450
525
 
451
526
  *Ryuta Kamizono*
452
527
 
453
- * Clear the transaction state when an Active Record object is duped.
528
+ * Remove deprecated methods from `ActiveRecord::ConnectionAdapters::DatabaseLimits`.
454
529
 
455
- Fixes #31670.
530
+ `column_name_length`
531
+ `table_name_length`
532
+ `columns_per_table`
533
+ `indexes_per_table`
534
+ `columns_per_multicolumn_index`
535
+ `sql_query_length`
536
+ `joins_per_query`
456
537
 
457
- *Yuriy Ustushenko*
538
+ *Rafael Mendonça França*
458
539
 
459
- * Support for PostgreSQL foreign tables.
540
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?`.
460
541
 
461
- *fatkodima*
542
+ *Rafael Mendonça França*
543
+
544
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?`.
462
545
 
463
- * Fix relation merger issue with `left_outer_joins`.
546
+ *Rafael Mendonça França*
547
+
548
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?`.
464
549
 
465
- *Mehmet Emin İNAÇ*
550
+ *Rafael Mendonça França*
466
551
 
467
- * Don't allow destroyed object mutation after `save` or `save!` is called.
552
+ * Remove deprecated `ActiveRecord::Base#update_attributes` and `ActiveRecord::Base#update_attributes!`.
468
553
 
469
- *Ryuta Kamizono*
554
+ *Rafael Mendonça França*
470
555
 
471
- * Take into account association conditions when deleting through records.
556
+ * Remove deprecated `migrations_path` argument in `ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version`.
472
557
 
473
- Fixes #18424.
558
+ *Rafael Mendonça França*
474
559
 
475
- *Piotr Jakubowski*
560
+ * Remove deprecated `config.active_record.sqlite3.represent_boolean_as_integer`.
476
561
 
477
- * Fix nested `has_many :through` associations on unpersisted parent instances.
562
+ *Rafael Mendonça França*
478
563
 
479
- For example, if you have
564
+ * `relation.create` does no longer leak scope to class level querying methods
565
+ in initialization block and callbacks.
480
566
 
481
- class Post < ActiveRecord::Base
482
- belongs_to :author
483
- has_many :books, through: :author
484
- has_many :subscriptions, through: :books
485
- end
567
+ Before:
486
568
 
487
- class Author < ActiveRecord::Base
488
- has_one :post
489
- has_many :books
490
- has_many :subscriptions, through: :books
569
+ User.where(name: "John").create do |john|
570
+ User.find_by(name: "David") # => nil
491
571
  end
492
572
 
493
- class Book < ActiveRecord::Base
494
- belongs_to :author
495
- has_many :subscriptions
573
+ After:
574
+
575
+ User.where(name: "John").create do |john|
576
+ User.find_by(name: "David") # => #<User name: "David", ...>
496
577
  end
497
578
 
498
- class Subscription < ActiveRecord::Base
499
- belongs_to :book
579
+ *Ryuta Kamizono*
580
+
581
+ * Named scope chain does no longer leak scope to class level querying methods.
582
+
583
+ class User < ActiveRecord::Base
584
+ scope :david, -> { User.where(name: "David") }
500
585
  end
501
586
 
502
587
  Before:
503
588
 
504
- If `post` is not persisted, then `post.subscriptions` will be empty.
589
+ User.where(name: "John").david
590
+ # SELECT * FROM users WHERE name = 'John' AND name = 'David'
505
591
 
506
592
  After:
507
593
 
508
- If `post` is not persisted, then `post.subscriptions` can be set and used
509
- just like it would if `post` were persisted.
594
+ User.where(name: "John").david
595
+ # SELECT * FROM users WHERE name = 'David'
510
596
 
511
- Fixes #16313.
597
+ *Ryuta Kamizono*
512
598
 
513
- *Zoltan Kiss*
599
+ * Remove deprecated methods from `ActiveRecord::DatabaseConfigurations`.
514
600
 
515
- * Fixed inconsistency with `first(n)` when used with `limit()`.
516
- The `first(n)` finder now respects the `limit()`, making it consistent
517
- with `relation.to_a.first(n)`, and also with the behavior of `last(n)`.
601
+ `fetch`
602
+ `each`
603
+ `first`
604
+ `values`
605
+ `[]=`
518
606
 
519
- Fixes #23979.
607
+ *Rafael Mendonça França*
520
608
 
521
- *Brian Christian*
609
+ * `where.not` now generates NAND predicates instead of NOR.
522
610
 
523
- * Use `count(:all)` in `HasManyAssociation#count_records` to prevent invalid
524
- SQL queries for association counting.
611
+ Before:
525
612
 
526
- *Klas Eskilson*
613
+ User.where.not(name: "Jon", role: "admin")
614
+ # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
527
615
 
528
- * Fix to invoke callbacks when using `update_attribute`.
616
+ After:
529
617
 
530
- *Mike Busch*
618
+ User.where.not(name: "Jon", role: "admin")
619
+ # SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
531
620
 
532
- * Fix `count(:all)` to correctly work `distinct` with custom SELECT list.
621
+ *Rafael Mendonça França*
533
622
 
534
- *Ryuta Kamizono*
623
+ * Remove deprecated `ActiveRecord::Result#to_hash` method.
535
624
 
536
- * Using subselect for `delete_all` with `limit` or `offset`.
625
+ *Rafael Mendonça França*
537
626
 
538
- *Ryuta Kamizono*
627
+ * Deprecate `ActiveRecord::Base.allow_unsafe_raw_sql`.
539
628
 
540
- * Undefine attribute methods on descendants when resetting column
541
- information.
629
+ *Rafael Mendonça França*
542
630
 
543
- *Chris Salzberg*
631
+ * Remove deprecated support for using unsafe raw SQL in `ActiveRecord::Relation` methods.
544
632
 
545
- * Log database query callers.
633
+ *Rafael Mendonça França*
546
634
 
547
- Add `verbose_query_logs` configuration option to display the caller
548
- of database queries in the log to facilitate N+1 query resolution
549
- and other debugging.
635
+ * Allow users to silence the "Rails couldn't infer whether you are using multiple databases..."
636
+ message using `config.active_record.suppress_multiple_database_warning`.
550
637
 
551
- Enabled in development only for new and upgraded applications. Not
552
- recommended for use in the production environment since it relies
553
- on Ruby's `Kernel#caller_locations` which is fairly slow.
638
+ *Omri Gabay*
554
639
 
555
- *Olivier Lacan*
640
+ * Connections can be granularly switched for abstract classes when `connected_to` is called.
556
641
 
557
- * Fix conflicts `counter_cache` with `touch: true` by optimistic locking.
642
+ 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.
558
643
 
559
- ```
560
- # create_table :posts do |t|
561
- # t.integer :comments_count, default: 0
562
- # t.integer :lock_version
563
- # t.timestamps
564
- # end
565
- class Post < ApplicationRecord
566
- end
644
+ Example usage:
567
645
 
568
- # create_table :comments do |t|
569
- # t.belongs_to :post
570
- # end
571
- class Comment < ApplicationRecord
572
- belongs_to :post, touch: true, counter_cache: true
573
- end
574
- ```
646
+ 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`.
575
647
 
576
- Before:
577
- ```
578
- post = Post.create!
579
- # => begin transaction
580
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
581
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
582
- commit transaction
583
-
584
- comment = Comment.create!(post: post)
585
- # => begin transaction
586
- INSERT INTO "comments" ("post_id") VALUES (1)
587
-
588
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
589
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
590
-
591
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:27:11.398330',
592
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
593
- rollback transaction
594
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
595
-
596
- Comment.take.destroy!
597
- # => begin transaction
598
- DELETE FROM "comments" WHERE "comments"."id" = 1
599
-
600
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
601
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
602
-
603
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:42:47.785901',
604
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
605
- rollback transaction
606
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
607
- ```
648
+ ```ruby
649
+ ActiveRecord::Base.connected_to(role: :reading) do
650
+ User.first # reads from default replica
651
+ Dog.first # reads from default replica
608
652
 
609
- After:
610
- ```
611
- post = Post.create!
612
- # => begin transaction
613
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
614
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
615
- commit transaction
616
-
617
- comment = Comment.create!(post: post)
618
- # => begin transaction
619
- INSERT INTO "comments" ("post_id") VALUES (1)
620
-
621
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
622
- "lock_version" = COALESCE("lock_version", 0) + 1,
623
- "updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
624
- commit transaction
625
-
626
- comment.destroy!
627
- # => begin transaction
628
- DELETE FROM "comments" WHERE "comments"."id" = 1
629
-
630
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
631
- "lock_version" = COALESCE("lock_version", 0) + 1,
632
- "updated_at" = '2017-12-11 21:39:02.685520' WHERE "posts"."id" = 1
633
- commit transaction
653
+ AnimalsRecord.connected_to(role: :writing, shard: :one) do
654
+ User.first # reads from default replica
655
+ Dog.first # reads from shard one primary
656
+ end
657
+
658
+ User.first # reads from default replica
659
+ Dog.first # reads from default replica
660
+
661
+ ApplicationRecord.connected_to(role: :writing, shard: :two) do
662
+ User.first # reads from shard two primary
663
+ Dog.first # reads from default replica
664
+ end
665
+ end
634
666
  ```
635
667
 
636
- Fixes #31199.
668
+ *Eileen M. Uchitelle*, *John Crepezzi*
637
669
 
638
- *bogdanvlviv*
670
+ * Allow double-dash comment syntax when querying read-only databases
639
671
 
640
- * Add support for PostgreSQL operator classes to `add_index`.
672
+ *James Adam*
641
673
 
642
- Example:
674
+ * Add `values_at` method.
643
675
 
644
- add_index :users, :name, using: :gist, opclass: { name: :gist_trgm_ops }
676
+ Returns an array containing the values associated with the given methods.
645
677
 
646
- *Greg Navis*
678
+ ```ruby
679
+ topic = Topic.first
680
+ topic.values_at(:title, :author_name)
681
+ # => ["Budget", "Jason"]
682
+ ```
647
683
 
648
- * Don't allow scopes to be defined which conflict with instance methods on `Relation`.
684
+ Similar to `Hash#values_at` but on an Active Record instance.
649
685
 
650
- Fixes #31120.
686
+ *Guillaume Briday*
651
687
 
652
- *kinnrot*
688
+ * Fix `read_attribute_before_type_cast` to consider attribute aliases.
653
689
 
654
- * Add new error class `QueryCanceled` which will be raised
655
- when canceling statement due to user request.
690
+ *Marcelo Lauxen*
656
691
 
657
- *Ryuta Kamizono*
692
+ * Support passing record to uniqueness validator `:conditions` callable:
658
693
 
659
- * Add `#up_only` to database migrations for code that is only relevant when
660
- migrating up, e.g. populating a new column.
694
+ ```ruby
695
+ class Article < ApplicationRecord
696
+ validates_uniqueness_of :title, conditions: ->(article) {
697
+ published_at = article.published_at
698
+ where(published_at: published_at.beginning_of_year..published_at.end_of_year)
699
+ }
700
+ end
701
+ ```
661
702
 
662
- *Rich Daley*
703
+ *Eliot Sykes*
663
704
 
664
- * Require raw SQL fragments to be explicitly marked when used in
665
- relation query methods.
705
+ * `BatchEnumerator#update_all` and `BatchEnumerator#delete_all` now return the
706
+ total number of rows affected, just like their non-batched counterparts.
666
707
 
667
- Before:
668
- ```
669
- Article.order("LENGTH(title)")
708
+ ```ruby
709
+ Person.in_batches.update_all("first_name = 'Eugene'") # => 42
710
+ Person.in_batches.delete_all # => 42
670
711
  ```
671
712
 
672
- After:
673
- ```
674
- Article.order(Arel.sql("LENGTH(title)"))
675
- ```
713
+ Fixes #40287.
676
714
 
677
- This prevents SQL injection if applications use the [strongly
678
- discouraged] form `Article.order(params[:my_order])`, under the
679
- mistaken belief that only column names will be accepted.
715
+ *Eugene Kenny*
680
716
 
681
- Raw SQL strings will now cause a deprecation warning, which will
682
- become an UnknownAttributeReference error in Rails 6.0. Applications
683
- can opt in to the future behavior by setting `allow_unsafe_raw_sql`
684
- to `:disabled`.
717
+ * Add support for PostgreSQL `interval` data type with conversion to
718
+ `ActiveSupport::Duration` when loading records from database and
719
+ serialization to ISO 8601 formatted duration string on save.
720
+ Add support to define a column in migrations and get it in a schema dump.
721
+ Optional column precision is supported.
685
722
 
686
- Common and judged-safe string values (such as simple column
687
- references) are unaffected:
688
- ```
689
- Article.order("title DESC")
690
- ```
723
+ To use this in 6.1, you need to place the next string to your model file:
691
724
 
692
- *Ben Toews*
725
+ attribute :duration, :interval
693
726
 
694
- * `update_all` will now pass its values to `Type#cast` before passing them to
695
- `Type#serialize`. This means that `update_all(foo: 'true')` will properly
696
- persist a boolean.
727
+ To keep old behavior until 7.0 is released:
697
728
 
698
- *Sean Griffin*
729
+ attribute :duration, :string
699
730
 
700
- * Add new error class `StatementTimeout` which will be raised
701
- when statement timeout exceeded.
731
+ Example:
702
732
 
703
- *Ryuta Kamizono*
733
+ create_table :events do |t|
734
+ t.string :name
735
+ t.interval :duration
736
+ end
704
737
 
705
- * Fix `bin/rails db:migrate` with specified `VERSION`.
706
- `bin/rails db:migrate` with empty VERSION behaves as without `VERSION`.
707
- Check a format of `VERSION`: Allow a migration version number
708
- or name of a migration file. Raise error if format of `VERSION` is invalid.
709
- Raise error if target migration doesn't exist.
738
+ class Event < ApplicationRecord
739
+ attribute :duration, :interval
740
+ end
710
741
 
711
- *bogdanvlviv*
742
+ Event.create!(name: 'Rock Fest', duration: 2.days)
743
+ Event.last.duration # => 2 days
744
+ Event.last.duration.iso8601 # => "P2D"
745
+ Event.new(duration: 'P1DT12H3S').duration # => 1 day, 12 hours, and 3 seconds
746
+ Event.new(duration: '1 day') # Unknown value will be ignored and NULL will be written to database
712
747
 
713
- * Fixed a bug where column orders for an index weren't written to
714
- `db/schema.rb` when using the sqlite adapter.
748
+ *Andrey Novikov*
715
749
 
716
- Fixes #30902.
750
+ * Allow associations supporting the `dependent:` key to take `dependent: :destroy_async`.
717
751
 
718
- *Paul Kuruvilla*
752
+ ```ruby
753
+ class Account < ActiveRecord::Base
754
+ belongs_to :supplier, dependent: :destroy_async
755
+ end
756
+ ```
719
757
 
720
- * Remove deprecated method `#sanitize_conditions`.
758
+ `:destroy_async` will enqueue a job to destroy associated records in the background.
721
759
 
722
- *Rafael Mendonça França*
760
+ *DHH*, *George Claghorn*, *Cory Gwin*, *Rafael Mendonça França*, *Adrianna Chang*
723
761
 
724
- * Remove deprecated method `#scope_chain`.
762
+ * Add `SKIP_TEST_DATABASE` environment variable to disable modifying the test database when `rails db:create` and `rails db:drop` are called.
725
763
 
726
- *Rafael Mendonça França*
764
+ *Jason Schweier*
727
765
 
728
- * Remove deprecated configuration `.error_on_ignored_order_or_limit`.
766
+ * `connects_to` can only be called on `ActiveRecord::Base` or abstract classes.
729
767
 
730
- *Rafael Mendonça França*
768
+ 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.
731
769
 
732
- * Remove deprecated arguments from `#verify!`.
770
+ *Eileen M. Uchitelle*, *John Crepezzi*
733
771
 
734
- *Rafael Mendonça França*
772
+ * All connection adapters `execute` now raises `ActiveRecord::ConnectionNotEstablished` rather than
773
+ `ActiveRecord::StatementInvalid` when they encounter a connection error.
735
774
 
736
- * Remove deprecated argument `name` from `#indexes`.
775
+ *Jean Boussier*
737
776
 
738
- *Rafael Mendonça França*
777
+ * `Mysql2Adapter#quote_string` now raises `ActiveRecord::ConnectionNotEstablished` rather than
778
+ `ActiveRecord::StatementInvalid` when it can't connect to the MySQL server.
739
779
 
740
- * Remove deprecated method `ActiveRecord::Migrator.schema_migrations_table_name`.
780
+ *Jean Boussier*
741
781
 
742
- *Rafael Mendonça França*
782
+ * Add support for check constraints that are `NOT VALID` via `validate: false` (PostgreSQL-only).
743
783
 
744
- * Remove deprecated method `supports_primary_key?`.
784
+ *Alex Robbin*
745
785
 
746
- *Rafael Mendonça França*
786
+ * Ensure the default configuration is considered primary or first for an environment
747
787
 
748
- * Remove deprecated method `supports_migrations?`.
788
+ 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.
749
789
 
750
- *Rafael Mendonça França*
790
+ *Eileen M. Uchitelle*
751
791
 
752
- * Remove deprecated methods `initialize_schema_migrations_table` and `initialize_internal_metadata_table`.
792
+ * Allow `where` references association names as joined table name aliases.
753
793
 
754
- *Rafael Mendonça França*
794
+ ```ruby
795
+ class Comment < ActiveRecord::Base
796
+ enum label: [:default, :child]
797
+ has_many :children, class_name: "Comment", foreign_key: :parent_id
798
+ end
755
799
 
756
- * Raises when calling `lock!` in a dirty record.
800
+ # ... FROM comments LEFT OUTER JOIN comments children ON ... WHERE children.label = 1
801
+ Comment.includes(:children).where("children.label": "child")
802
+ ```
757
803
 
758
- *Rafael Mendonça França*
804
+ *Ryuta Kamizono*
759
805
 
760
- * Remove deprecated support to passing a class to `:class_name` on associations.
806
+ * Support storing demodulized class name for polymorphic type.
761
807
 
762
- *Rafael Mendonça França*
808
+ Before Rails 6.1, storing demodulized class name is supported only for STI type
809
+ by `store_full_sti_class` class attribute.
763
810
 
764
- * Remove deprecated argument `default` from `index_name_exists?`.
811
+ Now `store_full_class_name` class attribute can handle both STI and polymorphic types.
765
812
 
766
- *Rafael Mendonça França*
813
+ *Ryuta Kamizono*
767
814
 
768
- * Remove deprecated support to `quoted_id` when typecasting an Active Record object.
815
+ * Deprecate `rails db:structure:{load, dump}` tasks and extend
816
+ `rails db:schema:{load, dump}` tasks to work with either `:ruby` or `:sql` format,
817
+ depending on `config.active_record.schema_format` configuration value.
769
818
 
770
- *Rafael Mendonça França*
819
+ *fatkodima*
771
820
 
772
- * Fix `bin/rails db:setup` and `bin/rails db:test:prepare` create wrong
773
- ar_internal_metadata's data for a test database.
821
+ * Respect the `select` values for eager loading.
774
822
 
775
- Before:
776
- ```
777
- $ RAILS_ENV=test rails dbconsole
778
- > SELECT * FROM ar_internal_metadata;
779
- key|value|created_at|updated_at
780
- environment|development|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
823
+ ```ruby
824
+ post = Post.select("UPPER(title) AS title").first
825
+ post.title # => "WELCOME TO THE WEBLOG"
826
+ post.body # => ActiveModel::MissingAttributeError
827
+
828
+ # Rails 6.0 (ignore the `select` values)
829
+ post = Post.select("UPPER(title) AS title").eager_load(:comments).first
830
+ post.title # => "Welcome to the weblog"
831
+ post.body # => "Such a lovely day"
832
+
833
+ # Rails 6.1 (respect the `select` values)
834
+ post = Post.select("UPPER(title) AS title").eager_load(:comments).first
835
+ post.title # => "WELCOME TO THE WEBLOG"
836
+ post.body # => ActiveModel::MissingAttributeError
781
837
  ```
782
838
 
783
- After:
784
- ```
785
- $ RAILS_ENV=test rails dbconsole
786
- > SELECT * FROM ar_internal_metadata;
787
- key|value|created_at|updated_at
788
- environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
789
- ```
839
+ *Ryuta Kamizono*
790
840
 
791
- Fixes #26731.
841
+ * Allow attribute's default to be configured but keeping its own type.
792
842
 
793
- *bogdanvlviv*
843
+ ```ruby
844
+ class Post < ActiveRecord::Base
845
+ attribute :written_at, default: -> { Time.now.utc }
846
+ end
794
847
 
795
- * Fix longer sequence name detection for serial columns.
848
+ # Rails 6.0
849
+ Post.type_for_attribute(:written_at) # => #<Type::Value ... precision: nil, ...>
796
850
 
797
- Fixes #28332.
851
+ # Rails 6.1
852
+ Post.type_for_attribute(:written_at) # => #<Type::DateTime ... precision: 6, ...>
853
+ ```
798
854
 
799
855
  *Ryuta Kamizono*
800
856
 
801
- * MySQL: Don't lose `auto_increment: true` in the `db/schema.rb`.
857
+ * Allow default to be configured for Enum.
802
858
 
803
- Fixes #30894.
859
+ ```ruby
860
+ class Book < ActiveRecord::Base
861
+ enum status: [:proposed, :written, :published], _default: :published
862
+ end
804
863
 
805
- *Ryuta Kamizono*
864
+ Book.new.status # => "published"
865
+ ```
806
866
 
807
- * Fix `COUNT(DISTINCT ...)` for `GROUP BY` with `ORDER BY` and `LIMIT`.
867
+ *Ryuta Kamizono*
808
868
 
809
- Fixes #30886.
869
+ * Deprecate YAML loading from legacy format older than Rails 5.0.
810
870
 
811
871
  *Ryuta Kamizono*
812
872
 
813
- * PostgreSQL `tsrange` now preserves subsecond precision.
873
+ * Added the setting `ActiveRecord::Base.immutable_strings_by_default`, which
874
+ allows you to specify that all string columns should be frozen unless
875
+ otherwise specified. This will reduce memory pressure for applications which
876
+ do not generally mutate string properties of Active Record objects.
814
877
 
815
- PostgreSQL 9.1+ introduced range types, and Rails added support for using
816
- this datatype in Active Record. However, the serialization of
817
- `PostgreSQL::OID::Range` was incomplete, because it did not properly
818
- cast the bounds that make up the range. This led to subseconds being
819
- dropped in SQL commands:
878
+ *Sean Griffin*, *Ryuta Kamizono*
820
879
 
821
- Before:
880
+ * Deprecate `map!` and `collect!` on `ActiveRecord::Result`.
881
+
882
+ *Ryuta Kamizono*
822
883
 
823
- connection.type_cast(tsrange.serialize(range_value))
824
- # => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
884
+ * Support `relation.and` for intersection as Set theory.
825
885
 
826
- Now:
886
+ ```ruby
887
+ david_and_mary = Author.where(id: [david, mary])
888
+ mary_and_bob = Author.where(id: [mary, bob])
827
889
 
828
- connection.type_cast(tsrange.serialize(range_value))
829
- # => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
890
+ david_and_mary.merge(mary_and_bob) # => [mary, bob]
830
891
 
831
- *Thomas Cannon*
892
+ david_and_mary.and(mary_and_bob) # => [mary]
893
+ david_and_mary.or(mary_and_bob) # => [david, mary, bob]
894
+ ```
832
895
 
833
- * Passing a `Set` to `Relation#where` now behaves the same as passing an
834
- array.
896
+ *Ryuta Kamizono*
835
897
 
836
- *Sean Griffin*
898
+ * Merging conditions on the same column no longer maintain both conditions,
899
+ and will be consistently replaced by the latter condition in Rails 7.0.
900
+ To migrate to Rails 7.0's behavior, use `relation.merge(other, rewhere: true)`.
837
901
 
838
- * Use given algorithm while removing index from database.
902
+ ```ruby
903
+ # Rails 6.1 (IN clause is replaced by merger side equality condition)
904
+ Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
839
905
 
840
- Fixes #24190.
906
+ # Rails 6.1 (both conflict conditions exists, deprecated)
907
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
841
908
 
842
- *Mehmet Emin İNAÇ*
909
+ # Rails 6.1 with rewhere to migrate to Rails 7.0's behavior
910
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
843
911
 
844
- * Update payload names for `sql.active_record` instrumentation to be
845
- more descriptive.
912
+ # Rails 7.0 (same behavior with IN clause, mergee side condition is consistently replaced)
913
+ Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
914
+ Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
915
+ ```
846
916
 
847
- Fixes #30586.
917
+ *Ryuta Kamizono*
848
918
 
849
- *Jeremy Green*
919
+ * Do not mark Postgresql MAC address and UUID attributes as changed when the assigned value only varies by case.
850
920
 
851
- * Add new error class `LockWaitTimeout` which will be raised
852
- when lock wait timeout exceeded.
921
+ *Peter Fry*
853
922
 
854
- *Gabriel Courtemanche*
923
+ * Resolve issue with insert_all unique_by option when used with expression index.
855
924
 
856
- * Remove deprecated `#migration_keys`.
925
+ When the `:unique_by` option of `ActiveRecord::Persistence.insert_all` and
926
+ `ActiveRecord::Persistence.upsert_all` was used with the name of an expression index, an error
927
+ was raised. Adding a guard around the formatting behavior for the `:unique_by` corrects this.
857
928
 
858
- *Ryuta Kamizono*
929
+ Usage:
859
930
 
860
- * Automatically guess the inverse associations for STI.
931
+ ```ruby
932
+ create_table :books, id: :integer, force: true do |t|
933
+ t.column :name, :string
934
+ t.index "lower(name)", unique: true
935
+ end
861
936
 
862
- *Yuichiro Kaneko*
937
+ Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
938
+ ```
863
939
 
864
- * Ensure `sum` honors `distinct` on `has_many :through` associations.
940
+ Fixes #39516.
865
941
 
866
- Fixes #16791.
942
+ *Austen Madden*
867
943
 
868
- *Aaron Wortham*
944
+ * Add basic support for CHECK constraints to database migrations.
869
945
 
870
- * Add `binary` fixture helper method.
946
+ Usage:
871
947
 
872
- *Atsushi Yoshida*
948
+ ```ruby
949
+ add_check_constraint :products, "price > 0", name: "price_check"
950
+ remove_check_constraint :products, name: "price_check"
951
+ ```
873
952
 
874
- * When using `Relation#or`, extract the common conditions and put them before the OR condition.
953
+ *fatkodima*
875
954
 
876
- *Maxime Handfield Lapointe*
955
+ * Add `ActiveRecord::Base.strict_loading_by_default` and `ActiveRecord::Base.strict_loading_by_default=`
956
+ to enable/disable strict_loading mode by default for a model. The configuration's value is
957
+ inheritable by subclasses, but they can override that value and it will not impact parent class.
877
958
 
878
- * `Relation#or` now accepts two relations who have different values for
879
- `references` only, as `references` can be implicitly called by `where`.
959
+ Usage:
880
960
 
881
- Fixes #29411.
961
+ ```ruby
962
+ class Developer < ApplicationRecord
963
+ self.strict_loading_by_default = true
882
964
 
883
- *Sean Griffin*
965
+ has_many :projects
966
+ end
884
967
 
885
- * `ApplicationRecord` is no longer generated when generating models. If you
886
- need to generate it, it can be created with `rails g application_record`.
968
+ dev = Developer.first
969
+ dev.projects.first
970
+ # => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.
971
+ ```
887
972
 
888
- *Lisa Ugray*
973
+ *bogdanvlviv*
889
974
 
890
- * Fix `COUNT(DISTINCT ...)` with `ORDER BY` and `LIMIT` to keep the existing select list.
975
+ * Deprecate passing an Active Record object to `quote`/`type_cast` directly.
891
976
 
892
977
  *Ryuta Kamizono*
893
978
 
894
- * When a `has_one` association is destroyed by `dependent: destroy`,
895
- `destroyed_by_association` will now be set to the reflection, matching the
896
- behaviour of `has_many` associations.
979
+ * Default engine `ENGINE=InnoDB` is no longer dumped to make schema more agnostic.
897
980
 
898
- *Lisa Ugray*
981
+ Before:
899
982
 
900
- * Fix `unscoped(where: [columns])` removing the wrong bind values.
983
+ ```ruby
984
+ create_table "accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
985
+ end
986
+ ```
901
987
 
902
- When the `where` is called on a relation after a `or`, unscoping the column of that later `where` removed
903
- bind values used by the `or` instead. (possibly other cases too)
988
+ After:
904
989
 
905
- ```
906
- Post.where(id: 1).or(Post.where(id: 2)).where(foo: 3).unscope(where: :foo).to_sql
907
- # Currently:
908
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 2 OR "posts"."id" = 3)
909
- # With fix:
910
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1 OR "posts"."id" = 2)
990
+ ```ruby
991
+ create_table "accounts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
992
+ end
911
993
  ```
912
994
 
913
- *Maxime Handfield Lapointe*
995
+ *Ryuta Kamizono*
914
996
 
915
- * Values constructed using multi-parameter assignment will now use the
916
- post-type-cast value for rendering in single-field form inputs.
997
+ * Added delegated type as an alternative to single-table inheritance for representing class hierarchies.
998
+ See ActiveRecord::DelegatedType for the full description.
917
999
 
918
- *Sean Griffin*
1000
+ *DHH*
919
1001
 
920
- * `Relation#joins` is no longer affected by the target model's
921
- `current_scope`, with the exception of `unscoped`.
1002
+ * Deprecate aggregations with group by duplicated fields.
922
1003
 
923
- Fixes #29338.
1004
+ To migrate to Rails 7.0's behavior, use `uniq!(:group)` to deduplicate group fields.
924
1005
 
925
- *Sean Griffin*
1006
+ ```ruby
1007
+ accounts = Account.group(:firm_id)
1008
+
1009
+ # duplicated group fields, deprecated.
1010
+ accounts.merge(accounts.where.not(credit_limit: nil)).sum(:credit_limit)
1011
+ # => {
1012
+ # [1, 1] => 50,
1013
+ # [2, 2] => 60
1014
+ # }
1015
+
1016
+ # use `uniq!(:group)` to deduplicate group fields.
1017
+ accounts.merge(accounts.where.not(credit_limit: nil)).uniq!(:group).sum(:credit_limit)
1018
+ # => {
1019
+ # 1 => 50,
1020
+ # 2 => 60
1021
+ # }
1022
+ ```
926
1023
 
927
- * Change sqlite3 boolean serialization to use 1 and 0.
1024
+ *Ryuta Kamizono*
928
1025
 
929
- SQLite natively recognizes 1 and 0 as true and false, but does not natively
930
- recognize 't' and 'f' as was previously serialized.
1026
+ * Deprecate duplicated query annotations.
931
1027
 
932
- This change in serialization requires a migration of stored boolean data
933
- for SQLite databases, so it's implemented behind a configuration flag
934
- whose default false value is deprecated.
1028
+ To migrate to Rails 7.0's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
935
1029
 
936
- *Lisa Ugray*
1030
+ ```ruby
1031
+ accounts = Account.where(id: [1, 2]).annotate("david and mary")
937
1032
 
938
- * Skip query caching when working with batches of records (`find_each`, `find_in_batches`,
939
- `in_batches`).
1033
+ # duplicated annotations, deprecated.
1034
+ accounts.merge(accounts.rewhere(id: 3))
1035
+ # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */ /* david and mary */
940
1036
 
941
- Previously, records would be fetched in batches, but all records would be retained in memory
942
- until the end of the request or job.
1037
+ # use `uniq!(:annotate)` to deduplicate annotations.
1038
+ accounts.merge(accounts.rewhere(id: 3)).uniq!(:annotate)
1039
+ # SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */
1040
+ ```
943
1041
 
944
- *Eugene Kenny*
1042
+ *Ryuta Kamizono*
945
1043
 
946
- * Prevent errors raised by `sql.active_record` notification subscribers from being converted into
947
- `ActiveRecord::StatementInvalid` exceptions.
1044
+ * Resolve conflict between counter cache and optimistic locking.
948
1045
 
949
- *Dennis Taylor*
1046
+ Bump an Active Record instance's lock version after updating its counter
1047
+ cache. This avoids raising an unnecessary `ActiveRecord::StaleObjectError`
1048
+ upon subsequent transactions by maintaining parity with the corresponding
1049
+ database record's `lock_version` column.
950
1050
 
951
- * Fix eager loading/preloading association with scope including joins.
1051
+ Fixes #16449.
952
1052
 
953
- Fixes #28324.
1053
+ *Aaron Lipman*
954
1054
 
955
- *Ryuta Kamizono*
1055
+ * Support merging option `:rewhere` to allow mergee side condition to be replaced exactly.
956
1056
 
957
- * Fix transactions to apply state to child transactions.
1057
+ ```ruby
1058
+ david_and_mary = Author.where(id: david.id..mary.id)
958
1059
 
959
- Previously, if you had a nested transaction and the outer transaction was rolledback, the record from the
960
- inner transaction would still be marked as persisted.
1060
+ # both conflict conditions exists
1061
+ david_and_mary.merge(Author.where(id: bob)) # => []
961
1062
 
962
- This change fixes that by applying the state of the parent transaction to the child transaction when the
963
- parent transaction is rolledback. This will correctly mark records from the inner transaction as not persisted.
1063
+ # mergee side condition is replaced by rewhere
1064
+ david_and_mary.merge(Author.rewhere(id: bob)) # => [bob]
964
1065
 
965
- *Eileen M. Uchitelle*, *Aaron Patterson*
1066
+ # mergee side condition is replaced by rewhere option
1067
+ david_and_mary.merge(Author.where(id: bob), rewhere: true) # => [bob]
1068
+ ```
966
1069
 
967
- * Deprecate `set_state` method in `TransactionState`.
1070
+ *Ryuta Kamizono*
968
1071
 
969
- Deprecated the `set_state` method in favor of setting the state via specific methods. If you need to mark the
970
- state of the transaction you can now use `rollback!`, `commit!` or `nullify!` instead of
971
- `set_state(:rolledback)`, `set_state(:committed)`, or `set_state(nil)`.
1072
+ * Add support for finding records based on signed ids, which are tamper-proof, verified ids that can be
1073
+ set to expire and scoped with a purpose. This is particularly useful for things like password reset
1074
+ or email verification, where you want the bearer of the signed id to be able to interact with the
1075
+ underlying record, but usually only within a certain time period.
972
1076
 
973
- *Eileen M. Uchitelle*, *Aaron Patterson*
1077
+ ```ruby
1078
+ signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset
1079
+
1080
+ User.find_signed signed_id # => nil, since the purpose does not match
1081
+
1082
+ travel 16.minutes
1083
+ User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired
1084
+
1085
+ travel_back
1086
+ User.find_signed signed_id, purpose: :password_reset # => User.first
1087
+
1088
+ User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
1089
+ ```
1090
+
1091
+ *DHH*
1092
+
1093
+ * Support `ALGORITHM = INSTANT` DDL option for index operations on MySQL.
974
1094
 
975
- * Deprecate delegating to `arel` in `Relation`.
1095
+ *Ryuta Kamizono*
1096
+
1097
+ * Fix index creation to preserve index comment in bulk change table on MySQL.
976
1098
 
977
1099
  *Ryuta Kamizono*
978
1100
 
979
- * Query cache was unavailable when entering the `ActiveRecord::Base.cache` block
980
- without being connected.
1101
+ * Allow `unscope` to be aware of table name qualified values.
981
1102
 
982
- *Tsukasa Oishi*
1103
+ It is possible to unscope only the column in the specified table.
983
1104
 
984
- * Previously, when building records using a `has_many :through` association,
985
- if the child records were deleted before the parent was saved, they would
986
- still be persisted. Now, if child records are deleted before the parent is saved
987
- on a `has_many :through` association, the child records will not be persisted.
1105
+ ```ruby
1106
+ posts = Post.joins(:comments).group(:"posts.hidden")
1107
+ posts = posts.where("posts.hidden": false, "comments.hidden": false)
988
1108
 
989
- *Tobias Kraze*
1109
+ posts.count
1110
+ # => { false => 10 }
990
1111
 
991
- * Merging two relations representing nested joins no longer transforms the joins of
992
- the merged relation into LEFT OUTER JOIN.
1112
+ # unscope both hidden columns
1113
+ posts.unscope(where: :hidden).count
1114
+ # => { false => 11, true => 1 }
993
1115
 
994
- Example:
1116
+ # unscope only comments.hidden column
1117
+ posts.unscope(where: :"comments.hidden").count
1118
+ # => { false => 11 }
1119
+ ```
1120
+
1121
+ *Ryuta Kamizono*, *Slava Korolev*
1122
+
1123
+ * Fix `rewhere` to truly overwrite collided where clause by new where clause.
1124
+
1125
+ ```ruby
1126
+ steve = Person.find_by(name: "Steve")
1127
+ david = Author.find_by(name: "David")
1128
+
1129
+ relation = Essay.where(writer: steve)
995
1130
 
1131
+ # Before
1132
+ relation.rewhere(writer: david).to_a # => []
1133
+
1134
+ # After
1135
+ relation.rewhere(writer: david).to_a # => [david]
996
1136
  ```
997
- Author.joins(:posts).merge(Post.joins(:comments))
998
- # Before the change:
999
- #=> SELECT ... FROM authors INNER JOIN posts ON ... LEFT OUTER JOIN comments ON...
1000
1137
 
1001
- # After the change:
1002
- #=> SELECT ... FROM authors INNER JOIN posts ON ... INNER JOIN comments ON...
1138
+ *Ryuta Kamizono*
1139
+
1140
+ * Inspect time attributes with subsec and time zone offset.
1141
+
1142
+ ```ruby
1143
+ p Knot.create
1144
+ => #<Knot id: 1, created_at: "2016-05-05 01:29:47.116928000 +0000">
1003
1145
  ```
1004
1146
 
1005
- *Maxime Handfield Lapointe*
1147
+ *akinomaeni*, *Jonathan Hefner*
1006
1148
 
1007
- * `ActiveRecord::Persistence#touch` does not work well when optimistic locking enabled and
1008
- `locking_column`, without default value, is null in the database.
1149
+ * Deprecate passing a column to `type_cast`.
1009
1150
 
1010
- *bogdanvlviv*
1151
+ *Ryuta Kamizono*
1011
1152
 
1012
- * Fix destroying existing object does not work well when optimistic locking enabled and
1013
- `locking_column` is null in the database.
1153
+ * Deprecate `in_clause_length` and `allowed_index_name_length` in `DatabaseLimits`.
1014
1154
 
1015
- *bogdanvlviv*
1155
+ *Ryuta Kamizono*
1156
+
1157
+ * Support bulk insert/upsert on relation to preserve scope values.
1158
+
1159
+ *Josef Šimánek*, *Ryuta Kamizono*
1160
+
1161
+ * Preserve column comment value on changing column name on MySQL.
1162
+
1163
+ *Islam Taha*
1164
+
1165
+ * Add support for `if_exists` option for removing an index.
1166
+
1167
+ 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.
1168
+
1169
+ *Eileen M. Uchitelle*
1170
+
1171
+ * Remove ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base.
1172
+
1173
+ *Ryuta Kamizono*
1174
+
1175
+ * Prevent `build_association` from `touching` a parent record if the record isn't persisted for `has_one` associations.
1176
+
1177
+ Fixes #38219.
1178
+
1179
+ *Josh Brody*
1180
+
1181
+ * Add support for `if_not_exists` option for adding index.
1182
+
1183
+ The `add_index` method respects `if_not_exists` option. If it is set to true
1184
+ index won't be added.
1185
+
1186
+ Usage:
1187
+
1188
+ ```ruby
1189
+ add_index :users, :account_id, if_not_exists: true
1190
+ ```
1191
+
1192
+ The `if_not_exists` option passed to `create_table` also gets propagated to indexes
1193
+ created within that migration so that if table and its indexes exist then there is no
1194
+ attempt to create them again.
1195
+
1196
+ *Prathamesh Sonpatki*
1197
+
1198
+ * Add `ActiveRecord::Base#previously_new_record?` to show if a record was new before the last save.
1199
+
1200
+ *Tom Ward*
1201
+
1202
+ * Support descending order for `find_each`, `find_in_batches`, and `in_batches`.
1203
+
1204
+ 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.
1205
+
1206
+ This change allows reversing the order, batching from newest to oldest. This is useful when you need to process newer batches of records first.
1207
+
1208
+ Pass `order: :desc` to yield batches in descending order. The default remains `order: :asc`.
1209
+
1210
+ ```ruby
1211
+ Person.find_each(order: :desc) do |person|
1212
+ person.party_all_night!
1213
+ end
1214
+ ```
1215
+
1216
+ *Alexey Vasiliev*
1217
+
1218
+ * Fix `insert_all` with enum values.
1219
+
1220
+ Fixes #38716.
1221
+
1222
+ *Joel Blum*
1223
+
1224
+ * Add support for `db:rollback:name` for multiple database applications.
1225
+
1226
+ Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
1227
+
1228
+ *Eileen M. Uchitelle*
1229
+
1230
+ * `Relation#pick` now uses already loaded results instead of making another query.
1231
+
1232
+ *Eugene Kenny*
1233
+
1234
+ * Deprecate using `return`, `break` or `throw` to exit a transaction block after writes.
1235
+
1236
+ *Dylan Thacker-Smith*
1237
+
1238
+ * Dump the schema or structure of a database when calling `db:migrate:name`.
1239
+
1240
+ 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.
1241
+
1242
+ Going forward, calls to `rails db:migrate:name` will dump the schema (or structure) of the database being migrated.
1243
+
1244
+ *Kyle Thompson*
1245
+
1246
+ * Reset the `ActiveRecord::Base` connection after `rails db:migrate:name`.
1247
+
1248
+ 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.
1249
+
1250
+ *Kyle Thompson*
1251
+
1252
+ * Disallow calling `connected_to` on subclasses of `ActiveRecord::Base`.
1253
+
1254
+ 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.
1255
+
1256
+ *Eileen M. Uchitelle*, *John Crepezzi*
1257
+
1258
+ * Add support for horizontal sharding to `connects_to` and `connected_to`.
1259
+
1260
+ 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.
1261
+
1262
+ Usage:
1263
+
1264
+ Given the following configuration:
1265
+
1266
+ ```yaml
1267
+ # config/database.yml
1268
+ production:
1269
+ primary:
1270
+ database: my_database
1271
+ primary_shard_one:
1272
+ database: my_database_shard_one
1273
+ ```
1274
+
1275
+ Connect to multiple shards:
1276
+
1277
+ ```ruby
1278
+ class ApplicationRecord < ActiveRecord::Base
1279
+ self.abstract_class = true
1280
+
1281
+ connects_to shards: {
1282
+ default: { writing: :primary },
1283
+ shard_one: { writing: :primary_shard_one }
1284
+ }
1285
+ ```
1286
+
1287
+ Swap between shards in your controller / model code:
1288
+
1289
+ ```ruby
1290
+ ActiveRecord::Base.connected_to(shard: :shard_one) do
1291
+ # Read from shard one
1292
+ end
1293
+ ```
1294
+
1295
+ The horizontal sharding API also supports read replicas. See guides for more details.
1296
+
1297
+ *Eileen M. Uchitelle*, *John Crepezzi*
1298
+
1299
+ * Deprecate `spec_name` in favor of `name` on database configurations.
1300
+
1301
+ The accessors for `spec_name` on `configs_for` and `DatabaseConfig` are deprecated. Please use `name` instead.
1302
+
1303
+ Deprecated behavior:
1304
+
1305
+ ```ruby
1306
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
1307
+ db_config.spec_name
1308
+ ```
1309
+
1310
+ New behavior:
1311
+
1312
+ ```ruby
1313
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "development", name: "primary")
1314
+ db_config.name
1315
+ ```
1316
+
1317
+ *Eileen M. Uchitelle*
1318
+
1319
+ * Add additional database-specific rake tasks for multi-database users.
1320
+
1321
+ Previously, `rails db:create`, `rails db:drop`, and `rails db:migrate` were the only rails tasks that could operate on a single
1322
+ database. For example:
1323
+
1324
+ ```
1325
+ rails db:create
1326
+ rails db:create:primary
1327
+ rails db:create:animals
1328
+ rails db:drop
1329
+ rails db:drop:primary
1330
+ rails db:drop:animals
1331
+ rails db:migrate
1332
+ rails db:migrate:primary
1333
+ rails db:migrate:animals
1334
+ ```
1335
+
1336
+ With these changes, `rails db:schema:dump`, `rails db:schema:load`, `rails db:structure:dump`, `rails db:structure:load` and
1337
+ `rails db:test:prepare` can additionally operate on a single database. For example:
1338
+
1339
+ ```
1340
+ rails db:schema:dump
1341
+ rails db:schema:dump:primary
1342
+ rails db:schema:dump:animals
1343
+ rails db:schema:load
1344
+ rails db:schema:load:primary
1345
+ rails db:schema:load:animals
1346
+ rails db:structure:dump
1347
+ rails db:structure:dump:primary
1348
+ rails db:structure:dump:animals
1349
+ rails db:structure:load
1350
+ rails db:structure:load:primary
1351
+ rails db:structure:load:animals
1352
+ rails db:test:prepare
1353
+ rails db:test:prepare:primary
1354
+ rails db:test:prepare:animals
1355
+ ```
1356
+
1357
+ *Kyle Thompson*
1358
+
1359
+ * Add support for `strict_loading` mode on association declarations.
1360
+
1361
+ 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.
1362
+
1363
+ Usage:
1364
+
1365
+ ```ruby
1366
+ class Developer < ApplicationRecord
1367
+ has_many :projects, strict_loading: true
1368
+ end
1369
+
1370
+ dev = Developer.first
1371
+ dev.projects.first
1372
+ # => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.
1373
+ ```
1374
+
1375
+ *Kevin Deisz*
1376
+
1377
+ * Add support for `strict_loading` mode to prevent lazy loading of records.
1378
+
1379
+ 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.
1380
+
1381
+ Usage:
1382
+
1383
+ ```ruby
1384
+ dev = Developer.strict_loading.first
1385
+ dev.audit_logs.to_a
1386
+ # => ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.
1387
+ ```
1388
+
1389
+ *Eileen M. Uchitelle*, *Aaron Patterson*
1390
+
1391
+ * Add support for PostgreSQL 11+ partitioned indexes when using `upsert_all`.
1392
+
1393
+ *Sebastián Palma*
1394
+
1395
+ * Adds support for `if_not_exists` to `add_column` and `if_exists` to `remove_column`.
1396
+
1397
+ 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.
1398
+
1399
+ Example Usage:
1400
+
1401
+ ```ruby
1402
+ class AddColumnTitle < ActiveRecord::Migration[6.1]
1403
+ def change
1404
+ add_column :posts, :title, :string, if_not_exists: true
1405
+ end
1406
+ end
1407
+ ```
1408
+
1409
+ ```ruby
1410
+ class RemoveColumnTitle < ActiveRecord::Migration[6.1]
1411
+ def change
1412
+ remove_column :posts, :title, if_exists: true
1413
+ end
1414
+ end
1415
+ ```
1416
+
1417
+ *Eileen M. Uchitelle*
1016
1418
 
1017
- * Use bulk INSERT to insert fixtures for better performance.
1419
+ * Regexp-escape table name for MS SQL Server.
1420
+
1421
+ 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.
1422
+
1423
+ *Larry Reid*
1424
+
1425
+ * Store advisory locks on their own named connection.
1426
+
1427
+ 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.
1428
+
1429
+ 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.
1430
+
1431
+ *Eileen M. Uchitelle*, *John Crepezzi*
1432
+
1433
+ * Allow schema cache path to be defined in the database configuration file.
1434
+
1435
+ For example:
1436
+
1437
+ ```yaml
1438
+ development:
1439
+ adapter: postgresql
1440
+ database: blog_development
1441
+ pool: 5
1442
+ schema_cache_path: tmp/schema/main.yml
1443
+ ```
1444
+
1445
+ *Katrina Owen*
1446
+
1447
+ * Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
1448
+
1449
+ `#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 Rails 7.0.
1450
+
1451
+ *Eileen M. Uchitelle*, *John Crepezzi*
1452
+
1453
+ * Deprecate `#default_hash` and it's alias `#[]` on database configurations.
1454
+
1455
+ Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in Rails 7.0.
1456
+
1457
+ *Eileen M. Uchitelle*, *John Crepezzi*
1458
+
1459
+ * Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
1460
+
1461
+ *Gannon McGibbon*
1462
+
1463
+ * Find orphans by looking for missing relations through chaining `where.missing`:
1464
+
1465
+ Before:
1466
+
1467
+ ```ruby
1468
+ Post.left_joins(:author).where(authors: { id: nil })
1469
+ ```
1470
+
1471
+ After:
1472
+
1473
+ ```ruby
1474
+ Post.where.missing(:author)
1475
+ ```
1476
+
1477
+ *Tom Rossi*
1478
+
1479
+ * Ensure `:reading` connections always raise if a write is attempted.
1480
+
1481
+ 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`.
1482
+
1483
+ *Eileen M. Uchitelle*
1484
+
1485
+ * Deprecate `"primary"` as the `connection_specification_name` for `ActiveRecord::Base`.
1486
+
1487
+ `"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"`.
1488
+
1489
+ *Eileen M. Uchitelle*, *John Crepezzi*
1490
+
1491
+ * Add `ActiveRecord::Validations::NumericalityValidator` with
1492
+ support for casting floats using a database columns' precision value.
1493
+
1494
+ *Gannon McGibbon*
1495
+
1496
+ * Enforce fresh ETag header after a collection's contents change by adding
1497
+ ActiveRecord::Relation#cache_key_with_version. This method will be used by
1498
+ ActionController::ConditionalGet to ensure that when collection cache versioning
1499
+ is enabled, requests using ConditionalGet don't return the same ETag header
1500
+ after a collection is modified.
1501
+
1502
+ Fixes #38078.
1503
+
1504
+ *Aaron Lipman*
1505
+
1506
+ * Skip test database when running `db:create` or `db:drop` in development
1507
+ with `DATABASE_URL` set.
1508
+
1509
+ *Brian Buchalter*
1510
+
1511
+ * Don't allow mutations on the database configurations hash.
1512
+
1513
+ 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.
1514
+
1515
+ Before:
1516
+
1517
+ ```ruby
1518
+ @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
1519
+ @db_config.configuration_hash.merge!(idle_timeout: "0.02")
1520
+ ```
1521
+
1522
+ After:
1523
+
1524
+ ```ruby
1525
+ @db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
1526
+ config = @db_config.configuration_hash.merge(idle_timeout: "0.02")
1527
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(@db_config.env_name, @db_config.spec_name, config)
1528
+ ```
1529
+
1530
+ *Eileen M. Uchitelle*, *John Crepezzi*
1531
+
1532
+ * Remove `:connection_id` from the `sql.active_record` notification.
1533
+
1534
+ *Aaron Patterson*, *Rafael Mendonça França*
1535
+
1536
+ * The `:name` key will no longer be returned as part of `DatabaseConfig#configuration_hash`. Please use `DatabaseConfig#owner_name` instead.
1537
+
1538
+ *Eileen M. Uchitelle*, *John Crepezzi*
1539
+
1540
+ * ActiveRecord's `belongs_to_required_by_default` flag can now be set per model.
1541
+
1542
+ You can now opt-out/opt-in specific models from having their associations required
1543
+ by default.
1544
+
1545
+ This change is meant to ease the process of migrating all your models to have
1546
+ their association required.
1547
+
1548
+ *Edouard Chin*
1549
+
1550
+ * The `connection_config` method has been deprecated, please use `connection_db_config` instead which will return a `DatabaseConfigurations::DatabaseConfig` instead of a `Hash`.
1551
+
1552
+ *Eileen M. Uchitelle*, *John Crepezzi*
1553
+
1554
+ * Retain explicit selections on the base model after applying `includes` and `joins`.
1555
+
1556
+ Resolves #34889.
1557
+
1558
+ *Patrick Rebsch*
1559
+
1560
+ * 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.
1561
+
1562
+ *Eileen M. Uchitelle*, *John Crepezzi*
1563
+
1564
+ * Allow attributes to be fetched from Arel node groupings.
1565
+
1566
+ *Jeff Emminger*, *Gannon McGibbon*
1567
+
1568
+ * A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgreSQL `options`.
1569
+
1570
+ *Joshua Flanagan*
1571
+
1572
+ * 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`.
1573
+
1574
+ *John Crepezzi*
1575
+
1576
+ * Specifying `implicit_order_column` now subsorts the records by primary key if available to ensure deterministic results.
1577
+
1578
+ *Paweł Urbanek*
1579
+
1580
+ * `where(attr => [])` now loads an empty result without making a query.
1581
+
1582
+ *John Hawthorn*
1583
+
1584
+ * Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
1585
+
1586
+ *Hiroyuki Ishii*
1587
+
1588
+ * Add support for `belongs_to` to `has_many` inversing.
1589
+
1590
+ *Gannon McGibbon*
1591
+
1592
+ * Allow length configuration for `has_secure_token` method. The minimum length
1593
+ is set at 24 characters.
1594
+
1595
+ Before:
1596
+
1597
+ ```ruby
1598
+ has_secure_token :auth_token
1599
+ ```
1600
+
1601
+ After:
1602
+
1603
+ ```ruby
1604
+ has_secure_token :default_token # 24 characters
1605
+ has_secure_token :auth_token, length: 36 # 36 characters
1606
+ has_secure_token :invalid_token, length: 12 # => ActiveRecord::SecureToken::MinimumLengthError
1607
+ ```
1608
+
1609
+ *Bernardo de Araujo*
1610
+
1611
+ * Deprecate `DatabaseConfigurations#to_h`. These connection hashes are still available via `ActiveRecord::Base.configurations.configs_for`.
1612
+
1613
+ *Eileen Uchitelle*, *John Crepezzi*
1614
+
1615
+ * 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.
1616
+
1617
+ *John Crepezzi*, *Eileen Uchitelle*
1618
+
1619
+ * Allow column names to be passed to `remove_index` positionally along with other options.
1620
+
1621
+ Passing other options can be necessary to make `remove_index` correctly reversible.
1622
+
1623
+ Before:
1624
+
1625
+ add_index :reports, :report_id # => works
1626
+ add_index :reports, :report_id, unique: true # => works
1627
+ remove_index :reports, :report_id # => works
1628
+ remove_index :reports, :report_id, unique: true # => ArgumentError
1629
+
1630
+ After:
1631
+
1632
+ remove_index :reports, :report_id, unique: true # => works
1633
+
1634
+ *Eugene Kenny*
1635
+
1636
+ * Allow bulk `ALTER` statements to drop and recreate indexes with the same name.
1637
+
1638
+ *Eugene Kenny*
1639
+
1640
+ * `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
1641
+
1642
+ *Eugene Kenny*
1643
+
1644
+ * Call `while_preventing_writes` directly from `connected_to`.
1645
+
1646
+ 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)`.
1647
+
1648
+ 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.
1649
+
1650
+ *Eileen M. Uchitelle*
1651
+
1652
+ * Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
1018
1653
 
1019
1654
  *Kir Shatrov*
1020
1655
 
1021
- * Prevent creation of bind param if casted value is nil.
1656
+ * Stop trying to read yaml file fixtures when loading Active Record fixtures.
1657
+
1658
+ *Gannon McGibbon*
1659
+
1660
+ * Deprecate `.reorder(nil)` with `.first` / `.first!` taking non-deterministic result.
1661
+
1662
+ To continue taking non-deterministic result, use `.take` / `.take!` instead.
1022
1663
 
1023
1664
  *Ryuta Kamizono*
1024
1665
 
1025
- * Deprecate passing arguments and block at the same time to `count` and `sum` in `ActiveRecord::Calculations`.
1666
+ * Preserve user supplied joins order as much as possible.
1667
+
1668
+ Fixes #36761, #34328, #24281, #12953.
1026
1669
 
1027
1670
  *Ryuta Kamizono*
1028
1671
 
1029
- * Loading model schema from database is now thread-safe.
1672
+ * Allow `matches_regex` and `does_not_match_regexp` on the MySQL Arel visitor.
1030
1673
 
1031
- Fixes #28589.
1674
+ *James Pearson*
1032
1675
 
1033
- *Vikrant Chaudhary*, *David Abdemoulaie*
1676
+ * Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section.
1034
1677
 
1035
- * Add `ActiveRecord::Base#cache_version` to support recyclable cache keys via the new versioned entries
1036
- in `ActiveSupport::Cache`. This also means that `ActiveRecord::Base#cache_key` will now return a stable key
1037
- that does not include a timestamp any more.
1678
+ *Tongfei Gao*
1038
1679
 
1039
- NOTE: This feature is turned off by default, and `#cache_key` will still return cache keys with timestamps
1040
- until you set `ActiveRecord::Base.cache_versioning = true`. That's the setting for all new apps on Rails 5.2+
1680
+ * Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
1041
1681
 
1042
- *DHH*
1682
+ *John Crepezzi*, *Eileen Uchitelle*
1043
1683
 
1044
- * Respect `SchemaDumper.ignore_tables` in rake tasks for databases structure dump.
1684
+ * Add a warning for enum elements with 'not_' prefix.
1045
1685
 
1046
- *Rusty Geldmacher*, *Guillermo Iguaran*
1686
+ class Foo
1687
+ enum status: [:sent, :not_sent]
1688
+ end
1047
1689
 
1048
- * Add type caster to `RuntimeReflection#alias_name`.
1690
+ *Edu Depetris*
1049
1691
 
1050
- Fixes #28959.
1692
+ * Make currency symbols optional for money column type in PostgreSQL.
1051
1693
 
1052
- *Jon Moss*
1694
+ *Joel Schneider*
1053
1695
 
1054
- * Deprecate `supports_statement_cache?`.
1696
+ * Add support for beginless ranges, introduced in Ruby 2.7.
1055
1697
 
1056
- *Ryuta Kamizono*
1698
+ *Josh Goodall*
1057
1699
 
1058
- * Raise error `UnknownMigrationVersionError` on the movement of migrations
1059
- when the current migration does not exist.
1700
+ * Add `database_exists?` method to connection adapters to check if a database exists.
1060
1701
 
1061
- *bogdanvlviv*
1702
+ *Guilherme Mansur*
1062
1703
 
1063
- * Fix `bin/rails db:forward` first migration.
1704
+ * Loading the schema for a model that has no `table_name` raises a `TableNotSpecified` error.
1064
1705
 
1065
- *bogdanvlviv*
1706
+ *Guilherme Mansur*, *Eugene Kenny*
1066
1707
 
1067
- * Support Descending Indexes for MySQL.
1708
+ * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
1068
1709
 
1069
- MySQL 8.0.1 and higher supports descending indexes: `DESC` in an index definition is no longer ignored.
1070
- See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
1710
+ Fixes #36022.
1071
1711
 
1072
1712
  *Ryuta Kamizono*
1073
1713
 
1074
- * Fix inconsistency with changed attributes when overriding Active Record attribute reader.
1714
+ * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
1075
1715
 
1076
- *bogdanvlviv*
1716
+ Fixes #36465.
1717
+
1718
+ *Jeff Doering*
1719
+
1720
+ * Add support for multiple databases to `rails db:abort_if_pending_migrations`.
1721
+
1722
+ *Mark Lee*
1723
+
1724
+ * Fix sqlite3 collation parsing when using decimal columns.
1725
+
1726
+ *Martin R. Schuster*
1727
+
1728
+ * Fix invalid schema when primary key column has a comment.
1729
+
1730
+ Fixes #29966.
1731
+
1732
+ *Guilherme Goettems Schneider*
1733
+
1734
+ * Fix table comment also being applied to the primary key column.
1735
+
1736
+ *Guilherme Goettems Schneider*
1077
1737
 
1078
- * When calling the dynamic fixture accessor method with no arguments, it now returns all fixtures of this type.
1079
- Previously this method always returned an empty array.
1738
+ * Allow generated `create_table` migrations to include or skip timestamps.
1080
1739
 
1081
- *Kevin McPhillips*
1740
+ *Michael Duchemin*
1082
1741
 
1083
1742
 
1084
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activerecord/CHANGELOG.md) for previous changes.
1743
+ Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activerecord/CHANGELOG.md) for previous changes.