activerecord 5.2.6 → 6.0.0.beta1

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 (241) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +299 -758
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +1 -1
  5. data/examples/performance.rb +1 -1
  6. data/lib/active_record.rb +2 -1
  7. data/lib/active_record/aggregations.rb +4 -2
  8. data/lib/active_record/associations.rb +16 -12
  9. data/lib/active_record/associations/association.rb +35 -19
  10. data/lib/active_record/associations/association_scope.rb +4 -6
  11. data/lib/active_record/associations/belongs_to_association.rb +36 -42
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +0 -4
  13. data/lib/active_record/associations/builder/belongs_to.rb +14 -50
  14. data/lib/active_record/associations/builder/collection_association.rb +3 -3
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -38
  16. data/lib/active_record/associations/collection_association.rb +11 -25
  17. data/lib/active_record/associations/collection_proxy.rb +32 -6
  18. data/lib/active_record/associations/foreign_association.rb +7 -0
  19. data/lib/active_record/associations/has_many_association.rb +1 -1
  20. data/lib/active_record/associations/has_many_through_association.rb +25 -18
  21. data/lib/active_record/associations/has_one_association.rb +28 -30
  22. data/lib/active_record/associations/has_one_through_association.rb +5 -5
  23. data/lib/active_record/associations/join_dependency.rb +15 -20
  24. data/lib/active_record/associations/join_dependency/join_association.rb +11 -26
  25. data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
  26. data/lib/active_record/associations/preloader.rb +32 -29
  27. data/lib/active_record/associations/preloader/association.rb +1 -2
  28. data/lib/active_record/associations/singular_association.rb +2 -16
  29. data/lib/active_record/attribute_assignment.rb +7 -10
  30. data/lib/active_record/attribute_methods.rb +34 -56
  31. data/lib/active_record/attribute_methods/dirty.rb +64 -26
  32. data/lib/active_record/attribute_methods/primary_key.rb +8 -7
  33. data/lib/active_record/attribute_methods/read.rb +16 -48
  34. data/lib/active_record/attribute_methods/serialization.rb +1 -1
  35. data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -1
  36. data/lib/active_record/attribute_methods/write.rb +15 -16
  37. data/lib/active_record/autosave_association.rb +7 -21
  38. data/lib/active_record/base.rb +2 -2
  39. data/lib/active_record/callbacks.rb +3 -17
  40. data/lib/active_record/collection_cache_key.rb +1 -1
  41. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +13 -36
  42. data/lib/active_record/connection_adapters/abstract/database_limits.rb +9 -0
  43. data/lib/active_record/connection_adapters/abstract/database_statements.rb +25 -84
  44. data/lib/active_record/connection_adapters/abstract/query_cache.rb +17 -14
  45. data/lib/active_record/connection_adapters/abstract/quoting.rb +5 -11
  46. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +15 -11
  47. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +30 -13
  48. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +0 -2
  49. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +41 -27
  50. data/lib/active_record/connection_adapters/abstract/transaction.rb +81 -52
  51. data/lib/active_record/connection_adapters/abstract_adapter.rb +95 -31
  52. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +65 -90
  53. data/lib/active_record/connection_adapters/connection_specification.rb +52 -42
  54. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +5 -9
  55. data/lib/active_record/connection_adapters/mysql/database_statements.rb +29 -7
  56. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  57. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +3 -4
  58. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +65 -10
  59. data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -4
  60. data/lib/active_record/connection_adapters/postgresql/column.rb +1 -2
  61. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +16 -1
  62. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
  63. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
  64. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -1
  65. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +1 -1
  66. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  67. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +1 -1
  68. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
  69. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  70. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +11 -36
  71. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +9 -2
  72. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +38 -20
  73. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -1
  74. data/lib/active_record/connection_adapters/postgresql_adapter.rb +75 -56
  75. data/lib/active_record/connection_adapters/schema_cache.rb +5 -0
  76. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +5 -5
  77. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +14 -9
  78. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +95 -62
  79. data/lib/active_record/connection_handling.rb +132 -26
  80. data/lib/active_record/core.rb +76 -43
  81. data/lib/active_record/counter_cache.rb +4 -29
  82. data/lib/active_record/database_configurations.rb +184 -0
  83. data/lib/active_record/database_configurations/database_config.rb +37 -0
  84. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  85. data/lib/active_record/database_configurations/url_config.rb +74 -0
  86. data/lib/active_record/enum.rb +22 -7
  87. data/lib/active_record/errors.rb +24 -21
  88. data/lib/active_record/explain.rb +1 -1
  89. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  90. data/lib/active_record/fixture_set/render_context.rb +17 -0
  91. data/lib/active_record/fixture_set/table_row.rb +153 -0
  92. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  93. data/lib/active_record/fixtures.rb +140 -472
  94. data/lib/active_record/gem_version.rb +4 -4
  95. data/lib/active_record/inheritance.rb +12 -2
  96. data/lib/active_record/integration.rb +56 -16
  97. data/lib/active_record/internal_metadata.rb +5 -1
  98. data/lib/active_record/locking/optimistic.rb +2 -2
  99. data/lib/active_record/locking/pessimistic.rb +3 -3
  100. data/lib/active_record/log_subscriber.rb +7 -26
  101. data/lib/active_record/migration.rb +38 -37
  102. data/lib/active_record/migration/command_recorder.rb +35 -5
  103. data/lib/active_record/migration/compatibility.rb +34 -16
  104. data/lib/active_record/model_schema.rb +30 -9
  105. data/lib/active_record/nested_attributes.rb +2 -2
  106. data/lib/active_record/no_touching.rb +7 -0
  107. data/lib/active_record/persistence.rb +18 -7
  108. data/lib/active_record/query_cache.rb +11 -4
  109. data/lib/active_record/querying.rb +19 -11
  110. data/lib/active_record/railtie.rb +71 -42
  111. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  112. data/lib/active_record/railties/controller_runtime.rb +30 -35
  113. data/lib/active_record/railties/databases.rake +94 -43
  114. data/lib/active_record/reflection.rb +60 -44
  115. data/lib/active_record/relation.rb +150 -69
  116. data/lib/active_record/relation/batches.rb +13 -10
  117. data/lib/active_record/relation/calculations.rb +38 -28
  118. data/lib/active_record/relation/delegation.rb +4 -13
  119. data/lib/active_record/relation/finder_methods.rb +12 -25
  120. data/lib/active_record/relation/merger.rb +2 -6
  121. data/lib/active_record/relation/predicate_builder.rb +4 -6
  122. data/lib/active_record/relation/predicate_builder/array_handler.rb +5 -4
  123. data/lib/active_record/relation/predicate_builder/association_query_value.rb +1 -4
  124. data/lib/active_record/relation/predicate_builder/base_handler.rb +1 -2
  125. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
  126. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -4
  127. data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
  128. data/lib/active_record/relation/query_attribute.rb +15 -12
  129. data/lib/active_record/relation/query_methods.rb +29 -52
  130. data/lib/active_record/relation/where_clause.rb +4 -0
  131. data/lib/active_record/relation/where_clause_factory.rb +1 -2
  132. data/lib/active_record/result.rb +30 -11
  133. data/lib/active_record/sanitization.rb +2 -39
  134. data/lib/active_record/schema.rb +1 -10
  135. data/lib/active_record/schema_dumper.rb +12 -6
  136. data/lib/active_record/schema_migration.rb +4 -0
  137. data/lib/active_record/scoping.rb +9 -8
  138. data/lib/active_record/scoping/default.rb +10 -3
  139. data/lib/active_record/scoping/named.rb +10 -14
  140. data/lib/active_record/statement_cache.rb +32 -5
  141. data/lib/active_record/store.rb +39 -8
  142. data/lib/active_record/table_metadata.rb +1 -4
  143. data/lib/active_record/tasks/database_tasks.rb +89 -23
  144. data/lib/active_record/tasks/mysql_database_tasks.rb +2 -4
  145. data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -7
  146. data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -8
  147. data/lib/active_record/test_databases.rb +38 -0
  148. data/lib/active_record/test_fixtures.rb +224 -0
  149. data/lib/active_record/timestamp.rb +4 -6
  150. data/lib/active_record/transactions.rb +3 -22
  151. data/lib/active_record/translation.rb +1 -1
  152. data/lib/active_record/type.rb +3 -4
  153. data/lib/active_record/type/adapter_specific_registry.rb +1 -8
  154. data/lib/active_record/type_caster/connection.rb +1 -6
  155. data/lib/active_record/type_caster/map.rb +1 -4
  156. data/lib/active_record/validations/uniqueness.rb +13 -25
  157. data/lib/arel.rb +44 -0
  158. data/lib/arel/alias_predication.rb +9 -0
  159. data/lib/arel/attributes.rb +22 -0
  160. data/lib/arel/attributes/attribute.rb +37 -0
  161. data/lib/arel/collectors/bind.rb +24 -0
  162. data/lib/arel/collectors/composite.rb +31 -0
  163. data/lib/arel/collectors/plain_string.rb +20 -0
  164. data/lib/arel/collectors/sql_string.rb +20 -0
  165. data/lib/arel/collectors/substitute_binds.rb +28 -0
  166. data/lib/arel/crud.rb +42 -0
  167. data/lib/arel/delete_manager.rb +18 -0
  168. data/lib/arel/errors.rb +9 -0
  169. data/lib/arel/expressions.rb +29 -0
  170. data/lib/arel/factory_methods.rb +49 -0
  171. data/lib/arel/insert_manager.rb +49 -0
  172. data/lib/arel/math.rb +45 -0
  173. data/lib/arel/nodes.rb +67 -0
  174. data/lib/arel/nodes/and.rb +32 -0
  175. data/lib/arel/nodes/ascending.rb +23 -0
  176. data/lib/arel/nodes/binary.rb +52 -0
  177. data/lib/arel/nodes/bind_param.rb +36 -0
  178. data/lib/arel/nodes/case.rb +55 -0
  179. data/lib/arel/nodes/casted.rb +50 -0
  180. data/lib/arel/nodes/count.rb +12 -0
  181. data/lib/arel/nodes/delete_statement.rb +45 -0
  182. data/lib/arel/nodes/descending.rb +23 -0
  183. data/lib/arel/nodes/equality.rb +18 -0
  184. data/lib/arel/nodes/extract.rb +24 -0
  185. data/lib/arel/nodes/false.rb +16 -0
  186. data/lib/arel/nodes/full_outer_join.rb +8 -0
  187. data/lib/arel/nodes/function.rb +44 -0
  188. data/lib/arel/nodes/grouping.rb +8 -0
  189. data/lib/arel/nodes/in.rb +8 -0
  190. data/lib/arel/nodes/infix_operation.rb +80 -0
  191. data/lib/arel/nodes/inner_join.rb +8 -0
  192. data/lib/arel/nodes/insert_statement.rb +37 -0
  193. data/lib/arel/nodes/join_source.rb +20 -0
  194. data/lib/arel/nodes/matches.rb +18 -0
  195. data/lib/arel/nodes/named_function.rb +23 -0
  196. data/lib/arel/nodes/node.rb +50 -0
  197. data/lib/arel/nodes/node_expression.rb +13 -0
  198. data/lib/arel/nodes/outer_join.rb +8 -0
  199. data/lib/arel/nodes/over.rb +15 -0
  200. data/lib/arel/nodes/regexp.rb +16 -0
  201. data/lib/arel/nodes/right_outer_join.rb +8 -0
  202. data/lib/arel/nodes/select_core.rb +63 -0
  203. data/lib/arel/nodes/select_statement.rb +41 -0
  204. data/lib/arel/nodes/sql_literal.rb +16 -0
  205. data/lib/arel/nodes/string_join.rb +11 -0
  206. data/lib/arel/nodes/table_alias.rb +27 -0
  207. data/lib/arel/nodes/terminal.rb +16 -0
  208. data/lib/arel/nodes/true.rb +16 -0
  209. data/lib/arel/nodes/unary.rb +44 -0
  210. data/lib/arel/nodes/unary_operation.rb +20 -0
  211. data/lib/arel/nodes/unqualified_column.rb +22 -0
  212. data/lib/arel/nodes/update_statement.rb +41 -0
  213. data/lib/arel/nodes/values.rb +16 -0
  214. data/lib/arel/nodes/values_list.rb +24 -0
  215. data/lib/arel/nodes/window.rb +126 -0
  216. data/lib/arel/nodes/with.rb +11 -0
  217. data/lib/arel/order_predications.rb +13 -0
  218. data/lib/arel/predications.rb +257 -0
  219. data/lib/arel/select_manager.rb +271 -0
  220. data/lib/arel/table.rb +110 -0
  221. data/lib/arel/tree_manager.rb +72 -0
  222. data/lib/arel/update_manager.rb +34 -0
  223. data/lib/arel/visitors.rb +20 -0
  224. data/lib/arel/visitors/depth_first.rb +199 -0
  225. data/lib/arel/visitors/dot.rb +292 -0
  226. data/lib/arel/visitors/ibm_db.rb +21 -0
  227. data/lib/arel/visitors/informix.rb +56 -0
  228. data/lib/arel/visitors/mssql.rb +143 -0
  229. data/lib/arel/visitors/mysql.rb +83 -0
  230. data/lib/arel/visitors/oracle.rb +159 -0
  231. data/lib/arel/visitors/oracle12.rb +67 -0
  232. data/lib/arel/visitors/postgresql.rb +116 -0
  233. data/lib/arel/visitors/sqlite.rb +39 -0
  234. data/lib/arel/visitors/to_sql.rb +913 -0
  235. data/lib/arel/visitors/visitor.rb +42 -0
  236. data/lib/arel/visitors/where_sql.rb +23 -0
  237. data/lib/arel/window_predications.rb +9 -0
  238. data/lib/rails/generators/active_record/migration.rb +14 -1
  239. data/lib/rails/generators/active_record/migration/migration_generator.rb +2 -5
  240. data/lib/rails/generators/active_record/model/model_generator.rb +1 -0
  241. metadata +104 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c89677cc90fc43ae97552359837dfe44ad6e1ce6334050e4b39785385b810ba3
4
- data.tar.gz: 4af06aec9bb0548a91db3b9f47376040f7dd7ba51b5826ef78ad54d7af441858
3
+ metadata.gz: 3c6ced19e10b6f6d4eb33ac9745ce89e3b4ee124c02080e582abe07b9e5ac9a6
4
+ data.tar.gz: d0267bc9be2b86eea525eebd296a3eba6dd098ae154c6ec6b91978164e91a898
5
5
  SHA512:
6
- metadata.gz: becac0be95270f15be72938b50450e0913f46dc8a0e64805e2d9fb1165e2b6a46d6be4df4eb6faa1f8e0cf5740a74ed05c89d8e165835488bcdaa7b42157073e
7
- data.tar.gz: 68692c07b65288b74ff1a55af76fd92846109c874cbaad1f66252461d96739865864fbf842d8e56169fddf0dd1ac935aed1e5ffc78cbac2669e20d1b478e0492
6
+ metadata.gz: 0fa88cf19b4df3cafcb246c31b104bc0df9a231f131d8c046fa20adb20f06285da1379a55ee82b3ef18e313212b4ae88f8f35752ae99bffcd0e669ca6f255b1d
7
+ data.tar.gz: 37f5229326765cb0c16f1501c4f3ade8594166a7999402f1016e23dfc9ec01ca009fa6abaf6e0751e288d533393592fe1db64fd0301c1ae1e1bfe5ff4c08d010
data/CHANGELOG.md CHANGED
@@ -1,113 +1,80 @@
1
- ## Rails 5.2.6 (May 05, 2021) ##
1
+ ## Rails 6.0.0.beta1 (January 18, 2019) ##
2
2
 
3
- * No changes.
3
+ * Remove deprecated `#set_state` from the transaction object.
4
4
 
5
+ *Rafael Mendonça França*
5
6
 
6
- ## Rails 5.2.5 (March 26, 2021) ##
7
-
8
- * No changes.
9
-
10
-
11
- ## Rails 5.2.4.6 (May 05, 2021) ##
12
-
13
- * No changes.
14
-
15
-
16
- ## Rails 5.2.4.5 (February 10, 2021) ##
17
-
18
- * Fix possible DoS vector in PostgreSQL money type
19
-
20
- Carefully crafted input can cause a DoS via the regular expressions used
21
- for validating the money format in the PostgreSQL adapter. This patch
22
- fixes the regexp.
23
-
24
- Thanks to @dee-see from Hackerone for this patch!
25
-
26
- [CVE-2021-22880]
27
-
28
- *Aaron Patterson*
29
-
30
-
31
- ## Rails 5.2.4.4 (September 09, 2020) ##
32
-
33
- * No changes.
34
-
35
-
36
- ## Rails 5.2.4.3 (May 18, 2020) ##
37
-
38
- * No changes.
7
+ * Remove deprecated `#supports_statement_cache?` from the database adapters.
39
8
 
40
- ## Rails 5.2.4.2 (March 19, 2020) ##
9
+ *Rafael Mendonça França*
41
10
 
42
- * No changes.
11
+ * Remove deprecated `#insert_fixtures` from the database adapters.
43
12
 
13
+ *Rafael Mendonça França*
44
14
 
45
- ## Rails 5.2.4.1 (December 18, 2019) ##
15
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::SQLite3Adapter#valid_alter_table_type?`.
46
16
 
47
- * No changes.
17
+ *Rafael Mendonça França*
48
18
 
19
+ * Do not allow passing the column name to `sum` when a block is passed.
49
20
 
50
- ## Rails 5.2.4 (November 27, 2019) ##
21
+ *Rafael Mendonça França*
51
22
 
52
- * Fix circular `autosave: true` causes invalid records to be saved.
23
+ * Do not allow passing the column name to `count` when a block is passed.
53
24
 
54
- Prior to the fix, when there was a circular series of `autosave: true`
55
- associations, the callback for a `has_many` association was run while
56
- another instance of the same callback on the same association hadn't
57
- finished running. When control returned to the first instance of the
58
- callback, the instance variable had changed, and subsequent associated
59
- records weren't saved correctly. Specifically, the ID field for the
60
- `belongs_to` corresponding to the `has_many` was `nil`.
25
+ *Rafael Mendonça França*
61
26
 
62
- Fixes #28080.
27
+ * Remove delegation of missing methods in a relation to arel.
63
28
 
64
- *Larry Reid*
29
+ *Rafael Mendonça França*
65
30
 
66
- * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
31
+ * Remove delegation of missing methods in a relation to private methods of the class.
67
32
 
68
- Fixes #36022.
33
+ *Rafael Mendonça França*
69
34
 
70
- *Ryuta Kamizono*
35
+ * Deprecate `config.activerecord.sqlite3.represent_boolean_as_integer`.
71
36
 
72
- * Fix sqlite3 collation parsing when using decimal columns.
37
+ *Rafael Mendonça França*
73
38
 
74
- *Martin R. Schuster*
39
+ * Change `SQLite3Adapter` to always represent boolean values as integers.
75
40
 
76
- * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
41
+ *Rafael Mendonça França*
77
42
 
78
- Fixes #36465.
43
+ * Remove ability to specify a timestamp name for `#cache_key`.
79
44
 
80
- *Jeff Doering*
45
+ *Rafael Mendonça França*
81
46
 
82
- * Assign all attributes before calling `build` to ensure the child record is visible in
83
- `before_add` and `after_add` callbacks for `has_many :through` associations.
47
+ * Remove deprecated `ActiveRecord::Migrator.migrations_path=`.
84
48
 
85
- Fixes #33249.
49
+ *Rafael Mendonça França*
86
50
 
87
- *Ryan H. Kerr*
51
+ * Remove deprecated `expand_hash_conditions_for_aggregates`.
88
52
 
53
+ *Rafael Mendonça França*
89
54
 
90
- ## Rails 5.2.3 (March 27, 2019) ##
55
+ * Set polymorphic type column to NULL on `dependent: :nullify` strategy.
91
56
 
92
- * Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
57
+ On polymorphic associations both the foreign key and the foreign type columns will be set to NULL.
93
58
 
94
- Fixes #35214.
59
+ *Laerti Papa*
95
60
 
96
- *Juani Villarejo*
61
+ * Allow permitted instance of `ActionController::Parameters` as argument of `ActiveRecord::Relation#exists?`.
97
62
 
98
- * Fix prepared statements caching to be enabled even when query caching is enabled.
63
+ *Gannon McGibbon*
99
64
 
100
- *Ryuta Kamizono*
65
+ * Add support for endless ranges introduces in Ruby 2.6.
101
66
 
102
- * Don't allow `where` with invalid value matches to nil values.
67
+ *Greg Navis*
103
68
 
104
- Fixes #33624.
69
+ * Deprecate passing `migrations_paths` to `connection.assume_migrated_upto_version`.
105
70
 
106
71
  *Ryuta Kamizono*
107
72
 
108
- * Restore an ability that class level `update` without giving ids.
73
+ * MySQL: `ROW_FORMAT=DYNAMIC` create table option by default.
109
74
 
110
- Fixes #34743.
75
+ Since MySQL 5.7.9, the `innodb_default_row_format` option defines the default row
76
+ format for InnoDB tables. The default setting is `DYNAMIC`.
77
+ The row format is required for indexing on `varchar(255)` with `utf8mb4` columns.
111
78
 
112
79
  *Ryuta Kamizono*
113
80
 
@@ -115,6 +82,10 @@
115
82
 
116
83
  *Gannon McGibbon*
117
84
 
85
+ * Allow disabling scopes generated by `ActiveRecord.enum`.
86
+
87
+ *Alfred Dominic*
88
+
118
89
  * Ensure that `delete_all` on collection proxy returns affected count.
119
90
 
120
91
  *Ryuta Kamizono*
@@ -123,17 +94,21 @@
123
94
 
124
95
  *Gannon McGibbon*
125
96
 
97
+ * Add the ability to prevent writes to a database for the duration of a block.
126
98
 
127
- ## Rails 5.2.2.1 (March 11, 2019) ##
99
+ Allows the application to prevent writes to a database. This can be useful when
100
+ you're building out multiple databases and want to make sure you're not sending
101
+ writes when you want a read.
128
102
 
129
- * No changes.
103
+ If `while_preventing_writes` is called and the query is considered a write
104
+ query the database will raise an exception regardless of whether the database
105
+ user is able to write.
130
106
 
107
+ This is not meant to be a catch-all for write queries but rather a way to enforce
108
+ read-only queries without opening a second connection. One purpose of this is to
109
+ catch accidental writes, not all writes.
131
110
 
132
- ## Rails 5.2.2 (December 04, 2018) ##
133
-
134
- * Do not ignore the scoping with query methods in the scope block.
135
-
136
- *Ryuta Kamizono*
111
+ *Eileen M. Uchitelle*
137
112
 
138
113
  * Allow aliased attributes to be used in `#update_columns` and `#update`.
139
114
 
@@ -141,8 +116,7 @@
141
116
 
142
117
  * Allow spaces in postgres table names.
143
118
 
144
- Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres
145
- adapter.
119
+ Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres adapter.
146
120
 
147
121
  *Gannon McGibbon*
148
122
 
@@ -175,852 +149,419 @@
175
149
 
176
150
  *Dmitry Tsepelev*
177
151
 
178
- * Values of enum are frozen, raising an error when attempting to modify them.
179
-
180
- *Emmanuel Byrd*
181
-
182
- * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
183
- if the attribute does not exist.
184
-
185
- *Sean Griffin*
186
-
187
- * Do not use prepared statement in queries that have a large number of binds.
188
-
189
- *Ryuta Kamizono*
190
-
191
- * Fix query cache to load before first request.
192
-
193
- *Eileen M. Uchitelle*
194
-
195
- * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
196
-
197
- Fixes #33056.
198
-
199
- *Federico Martinez*
200
-
201
- * Fix duplicated record creation when using nested attributes with `create_with`.
202
-
203
- *Darwin Wu*
204
-
205
- * Fix regression setting children record in parent `before_save` callback.
206
-
207
- *Guo Xiang Tan*
208
-
209
- * Prevent leaking of user's DB credentials on `rails db:create` failure.
210
-
211
- *bogdanvlviv*
212
-
213
- * Clear mutation tracker before continuing the around callbacks.
214
-
215
- *Yuya Tanaka*
216
-
217
- * Prevent deadlocks when waiting for connection from pool.
218
-
219
- *Brent Wheeldon*
220
-
221
- * Avoid extra scoping when using `Relation#update` that was causing this method to change the current scope.
222
-
223
- *Ryuta Kamizono*
224
-
225
- * Fix numericality validator not to be affected by custom getter.
226
-
227
- *Ryuta Kamizono*
228
-
229
- * Fix bulk change table ignores comment option on PostgreSQL.
230
-
231
- *Yoshiyuki Kinjo*
232
-
233
-
234
- ## Rails 5.2.1.1 (November 27, 2018) ##
235
-
236
- * No changes.
237
-
238
-
239
- ## Rails 5.2.1 (August 07, 2018) ##
240
-
241
- * PostgreSQL: Support new relkind for partitioned tables.
242
-
243
- Fixes #33008.
244
-
245
- *Yannick Schutz*
152
+ * Make the implicit order column configurable.
246
153
 
247
- * Rollback parent transaction when children fails to update.
154
+ When calling ordered finder methods such as +first+ or +last+ without an
155
+ explicit order clause, ActiveRecord sorts records by primary key. This can
156
+ result in unpredictable and surprising behaviour when the primary key is
157
+ not an auto-incrementing integer, for example when it's a UUID. This change
158
+ makes it possible to override the column used for implicit ordering such
159
+ that +first+ and +last+ will return more predictable results.
248
160
 
249
- *Guillaume Malette*
250
-
251
- * Fix default value for MySQL time types with specified precision.
252
-
253
- *Nikolay Kondratyev*
254
-
255
- * Fix `touch` option to behave consistently with `Persistence#touch` method.
256
-
257
- *Ryuta Kamizono*
258
-
259
- * Fix `save` in `after_create_commit` won't invoke extra `after_create_commit`.
260
-
261
- Fixes #32831.
262
-
263
- *Ryuta Kamizono*
264
-
265
- * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
266
-
267
- *Brian Durand*
268
-
269
- * Fix parent record should not get saved with duplicate children records.
270
-
271
- Fixes #32940.
272
-
273
- *Santosh Wadghule*
274
-
275
- * Fix that association's after_touch is not called with counter cache.
276
-
277
- Fixes #31559.
278
-
279
- *Ryuta Kamizono*
280
-
281
- * `becomes` should clear the mutation tracker which is created in `after_initialize`.
282
-
283
- Fixes #32867.
284
-
285
- *Ryuta Kamizono*
286
-
287
- * Allow a belonging to parent object to be created from a new record.
288
-
289
- *Jolyon Pawlyn*
290
-
291
- * Fix that building record with assigning multiple has_one associations
292
- wrongly persists through record.
293
-
294
- Fixes #32511.
295
-
296
- *Sam DeCesare*
297
-
298
- * Fix relation merging when one of the relations is going to skip the
299
- query cache.
300
-
301
- *James Williams*
302
-
303
-
304
- ## Rails 5.2.0 (April 09, 2018) ##
305
-
306
- * MySQL: Support mysql2 0.5.x.
307
-
308
- *Aaron Stone*
309
-
310
- * Apply time column precision on assignment.
311
-
312
- PR #20317 changed the behavior of datetime columns so that when they
313
- have a specified precision then on assignment the value is rounded to
314
- that precision. This behavior is now applied to time columns as well.
315
-
316
- Fixes #30301.
317
-
318
- *Andrew White*
319
-
320
- * Normalize time column values for SQLite database.
321
-
322
- For legacy reasons, time columns in SQLite are stored as full datetimes
323
- because until #24542 the quoting for time columns didn't remove the date
324
- component. To ensure that values are consistent we now normalize the
325
- date component to 2001-01-01 on reading and writing.
326
-
327
- *Andrew White*
328
-
329
- * Ensure that the date component is removed when quoting times.
330
-
331
- PR #24542 altered the quoting for time columns so that the date component
332
- was removed however it only removed it when it was 2001-01-01. Now the
333
- date component is removed irrespective of what the date is.
334
-
335
- *Andrew White*
336
-
337
- * Fix `dependent: :destroy` issue for has_one/belongs_to relationship where
338
- the parent class was getting deleted when the child was not.
339
-
340
- Fixes #32022.
341
-
342
- *Fernando Gorodscy*
343
-
344
- * Whitelist `NULLS FIRST` and `NULLS LAST` in order clauses too.
345
-
346
- *Xavier Noria*
347
-
348
- * Fix that after commit callbacks on update does not triggered when optimistic locking is enabled.
349
-
350
- *Ryuta Kamizono*
161
+ Example:
351
162
 
352
- * Fix `#columns_for_distinct` of MySQL and PostgreSQL to make
353
- `ActiveRecord::FinderMethods#limited_ids_for` use correct primary key values
354
- even if `ORDER BY` columns include other table's primary key.
163
+ class Project < ActiveRecord::Base
164
+ self.implicit_order_column = "created_at"
165
+ end
355
166
 
356
- Fixes #28364.
167
+ *Tekin Suleyman*
357
168
 
358
- *Takumi Kagiyama*
169
+ * Bump minimum PostgreSQL version to 9.3.
359
170
 
360
- * Make `reflection.klass` raise if `polymorphic?` not to be misused.
171
+ *Yasuo Honda*
361
172
 
362
- Fixes #31876.
173
+ * Values of enum are frozen, raising an error when attempting to modify them.
363
174
 
364
- *Ryuta Kamizono*
175
+ *Emmanuel Byrd*
365
176
 
366
- * PostgreSQL: Allow pg-1.0 gem to be used with Active Record.
177
+ * Move `ActiveRecord::StatementInvalid` SQL to error property and include binds as separate error property.
367
178
 
368
- *Lars Kanis*
179
+ `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception_class` now requires `binds` to be passed as the last argument.
369
180
 
370
- * Deprecate `expand_hash_conditions_for_aggregates` without replacement.
371
- Using a `Relation` for performing queries is the prefered API.
181
+ `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception` now requires `message`, `sql`, and `binds` to be passed as keyword arguments.
372
182
 
373
- *Ryuta Kamizono*
183
+ Subclasses of `ActiveRecord::StatementInvalid` must now provide `sql:` and `binds:` arguments to `super`.
374
184
 
375
- * Fix not expanded problem when passing an Array object as argument to the where method using `composed_of` column.
185
+ Example:
376
186
 
377
187
  ```
378
- david_balance = customers(:david).balance
379
- Customer.where(balance: [david_balance]).to_sql
380
-
381
- # Before: WHERE `customers`.`balance` = NULL
382
- # After : WHERE `customers`.`balance` = 50
188
+ class MySubclassedError < ActiveRecord::StatementInvalid
189
+ def initialize(message, sql:, binds:)
190
+ super(message, sql: sql, binds: binds)
191
+ end
192
+ end
383
193
  ```
384
194
 
385
- Fixes #31723.
386
-
387
- *Yutaro Kanagawa*
388
-
389
- * Fix `count(:all)` with eager loading and having an order other than the driving table.
390
-
391
- Fixes #31783.
392
-
393
- *Ryuta Kamizono*
394
-
395
- * Clear the transaction state when an Active Record object is duped.
396
-
397
- Fixes #31670.
398
-
399
- *Yuriy Ustushenko*
400
-
401
- * Support for PostgreSQL foreign tables.
402
-
403
- *fatkodima*
404
-
405
- * Fix relation merger issue with `left_outer_joins`.
406
-
407
- *Mehmet Emin İNAÇ*
408
-
409
- * Don't allow destroyed object mutation after `save` or `save!` is called.
410
-
411
- *Ryuta Kamizono*
412
-
413
- * Take into account association conditions when deleting through records.
414
-
415
- Fixes #18424.
416
-
417
- *Piotr Jakubowski*
195
+ *Gannon McGibbon*
418
196
 
419
- * Fix nested `has_many :through` associations on unpersisted parent instances.
197
+ * Add an `:if_not_exists` option to `create_table`.
420
198
 
421
- For example, if you have
199
+ Example:
422
200
 
423
- class Post < ActiveRecord::Base
424
- belongs_to :author
425
- has_many :books, through: :author
426
- has_many :subscriptions, through: :books
201
+ create_table :posts, if_not_exists: true do |t|
202
+ t.string :title
427
203
  end
428
204
 
429
- class Author < ActiveRecord::Base
430
- has_one :post
431
- has_many :books
432
- has_many :subscriptions, through: :books
433
- end
205
+ That would execute:
434
206
 
435
- class Book < ActiveRecord::Base
436
- belongs_to :author
437
- has_many :subscriptions
438
- end
207
+ CREATE TABLE IF NOT EXISTS posts (
208
+ ...
209
+ )
439
210
 
440
- class Subscription < ActiveRecord::Base
441
- belongs_to :book
442
- end
211
+ If the table already exists, `if_not_exists: false` (the default) raises an
212
+ exception whereas `if_not_exists: true` does nothing.
443
213
 
444
- Before:
214
+ *fatkodima*, *Stefan Kanev*
445
215
 
446
- If `post` is not persisted, then `post.subscriptions` will be empty.
216
+ * Defining an Enum as a Hash with blank key, or as an Array with a blank value, now raises an `ArgumentError`.
447
217
 
448
- After:
218
+ *Christophe Maximin*
449
219
 
450
- If `post` is not persisted, then `post.subscriptions` can be set and used
451
- just like it would if `post` were persisted.
220
+ * Adds support for multiple databases to `rails db:schema:cache:dump` and `rails db:schema:cache:clear`.
452
221
 
453
- Fixes #16313.
222
+ *Gannon McGibbon*
454
223
 
455
- *Zoltan Kiss*
224
+ * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
225
+ if the attribute does not exist.
456
226
 
457
- * Fixed inconsistency with `first(n)` when used with `limit()`.
458
- The `first(n)` finder now respects the `limit()`, making it consistent
459
- with `relation.to_a.first(n)`, and also with the behavior of `last(n)`.
227
+ *Sean Griffin*
460
228
 
461
- Fixes #23979.
229
+ * Add support for hash and url configs in database hash of `ActiveRecord::Base.connected_to`.
462
230
 
463
- *Brian Christian*
231
+ ````
232
+ User.connected_to(database: { writing: "postgres://foo" }) do
233
+ User.create!(name: "Gannon")
234
+ end
464
235
 
465
- * Use `count(:all)` in `HasManyAssociation#count_records` to prevent invalid
466
- SQL queries for association counting.
236
+ config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
237
+ User.connected_to(database: { reading: config }) do
238
+ User.count
239
+ end
240
+ ````
467
241
 
468
- *Klas Eskilson*
242
+ *Gannon McGibbon*
469
243
 
470
- * Fix to invoke callbacks when using `update_attribute`.
244
+ * Support default expression for MySQL.
471
245
 
472
- *Mike Busch*
246
+ MySQL 8.0.13 and higher supports default value to be a function or expression.
473
247
 
474
- * Fix `count(:all)` to correctly work `distinct` with custom SELECT list.
248
+ https://dev.mysql.com/doc/refman/8.0/en/create-table.html
475
249
 
476
250
  *Ryuta Kamizono*
477
251
 
478
- * Using subselect for `delete_all` with `limit` or `offset`.
252
+ * Support expression indexes for MySQL.
479
253
 
480
- *Ryuta Kamizono*
254
+ MySQL 8.0.13 and higher supports functional key parts that index
255
+ expression values rather than column or column prefix values.
481
256
 
482
- * Undefine attribute methods on descendants when resetting column
483
- information.
257
+ https://dev.mysql.com/doc/refman/8.0/en/create-index.html
484
258
 
485
- *Chris Salzberg*
259
+ *Ryuta Kamizono*
486
260
 
487
- * Log database query callers.
261
+ * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
488
262
 
489
- Add `verbose_query_logs` configuration option to display the caller
490
- of database queries in the log to facilitate N+1 query resolution
491
- and other debugging.
263
+ Fixes #33056.
492
264
 
493
- Enabled in development only for new and upgraded applications. Not
494
- recommended for use in the production environment since it relies
495
- on Ruby's `Kernel#caller_locations` which is fairly slow.
265
+ *Federico Martinez*
496
266
 
497
- *Olivier Lacan*
267
+ * Add basic API for connection switching to support multiple databases.
498
268
 
499
- * Fix conflicts `counter_cache` with `touch: true` by optimistic locking.
269
+ 1) Adds a `connects_to` method for models to connect to multiple databases. Example:
500
270
 
501
271
  ```
502
- # create_table :posts do |t|
503
- # t.integer :comments_count, default: 0
504
- # t.integer :lock_version
505
- # t.timestamps
506
- # end
507
- class Post < ApplicationRecord
272
+ class AnimalsModel < ApplicationRecord
273
+ self.abstract_class = true
274
+
275
+ connects_to database: { writing: :animals_primary, reading: :animals_replica }
508
276
  end
509
277
 
510
- # create_table :comments do |t|
511
- # t.belongs_to :post
512
- # end
513
- class Comment < ApplicationRecord
514
- belongs_to :post, touch: true, counter_cache: true
278
+ class Dog < AnimalsModel
279
+ # connected to both the animals_primary db for writing and the animals_replica for reading
515
280
  end
516
281
  ```
517
282
 
518
- Before:
283
+ 2) Adds a `connected_to` block method for switching connection roles or connecting to
284
+ a database that the model didn't connect to. Connecting to the database in this block is
285
+ useful when you have another defined connection, for example `slow_replica` that you don't
286
+ want to connect to by default but need in the console, or a specific code block.
287
+
519
288
  ```
520
- post = Post.create!
521
- # => begin transaction
522
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
523
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
524
- commit transaction
525
-
526
- comment = Comment.create!(post: post)
527
- # => begin transaction
528
- INSERT INTO "comments" ("post_id") VALUES (1)
529
-
530
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
531
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
532
-
533
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:27:11.398330',
534
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
535
- rollback transaction
536
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
537
-
538
- Comment.take.destroy!
539
- # => begin transaction
540
- DELETE FROM "comments" WHERE "comments"."id" = 1
541
-
542
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
543
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
544
-
545
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:42:47.785901',
546
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
547
- rollback transaction
548
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
289
+ ActiveRecord::Base.connected_to(role: :reading) do
290
+ Dog.first # finds dog from replica connected to AnimalsBase
291
+ Book.first # doesn't have a reading connection, will raise an error
292
+ end
549
293
  ```
550
294
 
551
- After:
552
295
  ```
553
- post = Post.create!
554
- # => begin transaction
555
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
556
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
557
- commit transaction
558
-
559
- comment = Comment.create!(post: post)
560
- # => begin transaction
561
- INSERT INTO "comments" ("post_id") VALUES (1)
562
-
563
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
564
- "lock_version" = COALESCE("lock_version", 0) + 1,
565
- "updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
566
- commit transaction
567
-
568
- comment.destroy!
569
- # => begin transaction
570
- DELETE FROM "comments" WHERE "comments"."id" = 1
571
-
572
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
573
- "lock_version" = COALESCE("lock_version", 0) + 1,
574
- "updated_at" = '2017-12-11 21:39:02.685520' WHERE "posts"."id" = 1
575
- commit transaction
296
+ ActiveRecord::Base.connected_to(database: :slow_replica) do
297
+ SlowReplicaModel.first # if the db config has a slow_replica configuration this will be used to do the lookup, otherwise this will throw an exception
298
+ end
576
299
  ```
577
300
 
578
- Fixes #31199.
579
-
580
- *bogdanvlviv*
581
-
582
- * Add support for PostgreSQL operator classes to `add_index`.
583
-
584
- Example:
585
-
586
- add_index :users, :name, using: :gist, opclass: { name: :gist_trgm_ops }
587
-
588
- *Greg Navis*
589
-
590
- * Don't allow scopes to be defined which conflict with instance methods on `Relation`.
591
-
592
- Fixes #31120.
593
-
594
- *kinnrot*
595
-
596
- * Add new error class `QueryCanceled` which will be raised
597
- when canceling statement due to user request.
301
+ *Eileen M. Uchitelle*
598
302
 
599
- *Ryuta Kamizono*
303
+ * Enum raises on invalid definition values
600
304
 
601
- * Add `#up_only` to database migrations for code that is only relevant when
602
- migrating up, e.g. populating a new column.
305
+ When defining a Hash enum it can be easy to use [] instead of {}. This
306
+ commit checks that only valid definition values are provided, those can
307
+ be a Hash, an array of Symbols or an array of Strings. Otherwise it
308
+ raises an ArgumentError.
603
309
 
604
- *Rich Daley*
310
+ Fixes #33961
605
311
 
606
- * Require raw SQL fragments to be explicitly marked when used in
607
- relation query methods.
312
+ *Alberto Almagro*
608
313
 
609
- Before:
610
- ```
611
- Article.order("LENGTH(title)")
612
- ```
314
+ * Reloading associations now clears the Query Cache like `Persistence#reload` does.
613
315
 
614
- After:
615
316
  ```
616
- Article.order(Arel.sql("LENGTH(title)"))
617
- ```
618
-
619
- This prevents SQL injection if applications use the [strongly
620
- discouraged] form `Article.order(params[:my_order])`, under the
621
- mistaken belief that only column names will be accepted.
622
-
623
- Raw SQL strings will now cause a deprecation warning, which will
624
- become an UnknownAttributeReference error in Rails 6.0. Applications
625
- can opt in to the future behavior by setting `allow_unsafe_raw_sql`
626
- to `:disabled`.
317
+ class Post < ActiveRecord::Base
318
+ has_one :category
319
+ belongs_to :author
320
+ has_many :comments
321
+ end
627
322
 
628
- Common and judged-safe string values (such as simple column
629
- references) are unaffected:
630
- ```
631
- Article.order("title DESC")
323
+ # Each of the following will now clear the query cache.
324
+ post.reload_category
325
+ post.reload_author
326
+ post.comments.reload
632
327
  ```
633
328
 
634
- *Ben Toews*
635
-
636
- * `update_all` will now pass its values to `Type#cast` before passing them to
637
- `Type#serialize`. This means that `update_all(foo: 'true')` will properly
638
- persist a boolean.
639
-
640
- *Sean Griffin*
641
-
642
- * Add new error class `StatementTimeout` which will be raised
643
- when statement timeout exceeded.
644
-
645
- *Ryuta Kamizono*
646
-
647
- * Fix `bin/rails db:migrate` with specified `VERSION`.
648
- `bin/rails db:migrate` with empty VERSION behaves as without `VERSION`.
649
- Check a format of `VERSION`: Allow a migration version number
650
- or name of a migration file. Raise error if format of `VERSION` is invalid.
651
- Raise error if target migration doesn't exist.
652
-
653
- *bogdanvlviv*
654
-
655
- * Fixed a bug where column orders for an index weren't written to
656
- `db/schema.rb` when using the sqlite adapter.
657
-
658
- Fixes #30902.
659
-
660
- *Paul Kuruvilla*
661
-
662
- * Remove deprecated method `#sanitize_conditions`.
663
-
664
- *Rafael Mendonça França*
665
-
666
- * Remove deprecated method `#scope_chain`.
667
-
668
- *Rafael Mendonça França*
669
-
670
- * Remove deprecated configuration `.error_on_ignored_order_or_limit`.
671
-
672
- *Rafael Mendonça França*
673
-
674
- * Remove deprecated arguments from `#verify!`.
675
-
676
- *Rafael Mendonça França*
677
-
678
- * Remove deprecated argument `name` from `#indexes`.
679
-
680
- *Rafael Mendonça França*
329
+ *Christophe Maximin*
681
330
 
682
- * Remove deprecated method `ActiveRecord::Migrator.schema_migrations_table_name`.
331
+ * Added `index` option for `change_table` migration helpers.
332
+ With this change you can create indexes while adding new
333
+ columns into the existing tables.
683
334
 
684
- *Rafael Mendonça França*
335
+ Example:
685
336
 
686
- * Remove deprecated method `supports_primary_key?`.
337
+ change_table(:languages) do |t|
338
+ t.string :country_code, index: true
339
+ end
687
340
 
688
- *Rafael Mendonça França*
341
+ *Mehmet Emin İNAÇ*
689
342
 
690
- * Remove deprecated method `supports_migrations?`.
343
+ * Fix `transaction` reverting for migrations.
691
344
 
692
- *Rafael Mendonça França*
345
+ Before: Commands inside a `transaction` in a reverted migration ran uninverted.
346
+ Now: This change fixes that by reverting commands inside `transaction` block.
693
347
 
694
- * Remove deprecated methods `initialize_schema_migrations_table` and `initialize_internal_metadata_table`.
348
+ *fatkodima*, *David Verhasselt*
695
349
 
696
- *Rafael Mendonça França*
350
+ * Raise an error instead of scanning the filesystem root when `fixture_path` is blank.
697
351
 
698
- * Raises when calling `lock!` in a dirty record.
352
+ *Gannon McGibbon*, *Max Albrecht*
699
353
 
700
- *Rafael Mendonça França*
354
+ * Allow `ActiveRecord::Base.configurations=` to be set with a symbolized hash.
701
355
 
702
- * Remove deprecated support to passing a class to `:class_name` on associations.
356
+ *Gannon McGibbon*
703
357
 
704
- *Rafael Mendonça França*
358
+ * Don't update counter cache unless the record is actually saved.
705
359
 
706
- * Remove deprecated argument `default` from `index_name_exists?`.
360
+ Fixes #31493, #33113, #33117.
707
361
 
708
- *Rafael Mendonça França*
362
+ *Ryuta Kamizono*
709
363
 
710
- * Remove deprecated support to `quoted_id` when typecasting an Active Record object.
364
+ * Deprecate `ActiveRecord::Result#to_hash` in favor of `ActiveRecord::Result#to_a`.
711
365
 
712
- *Rafael Mendonça França*
366
+ *Gannon McGibbon*, *Kevin Cheng*
713
367
 
714
- * Fix `bin/rails db:setup` and `bin/rails db:test:prepare` create wrong
715
- ar_internal_metadata's data for a test database.
368
+ * SQLite3 adapter supports expression indexes.
716
369
 
717
- Before:
718
- ```
719
- $ RAILS_ENV=test rails dbconsole
720
- > SELECT * FROM ar_internal_metadata;
721
- key|value|created_at|updated_at
722
- environment|development|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
723
370
  ```
371
+ create_table :users do |t|
372
+ t.string :email
373
+ end
724
374
 
725
- After:
726
- ```
727
- $ RAILS_ENV=test rails dbconsole
728
- > SELECT * FROM ar_internal_metadata;
729
- key|value|created_at|updated_at
730
- environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
375
+ add_index :users, 'lower(email)', name: 'index_users_on_email', unique: true
731
376
  ```
732
377
 
733
- Fixes #26731.
378
+ *Gray Kemmey*
734
379
 
735
- *bogdanvlviv*
380
+ * Allow subclasses to redefine autosave callbacks for associated records.
736
381
 
737
- * Fix longer sequence name detection for serial columns.
382
+ Fixes #33305.
738
383
 
739
- Fixes #28332.
384
+ *Andrey Subbota*
740
385
 
741
- *Ryuta Kamizono*
742
-
743
- * MySQL: Don't lose `auto_increment: true` in the `db/schema.rb`.
386
+ * Bump minimum MySQL version to 5.5.8.
744
387
 
745
- Fixes #30894.
388
+ *Yasuo Honda*
746
389
 
747
- *Ryuta Kamizono*
390
+ * Use MySQL utf8mb4 character set by default.
748
391
 
749
- * Fix `COUNT(DISTINCT ...)` for `GROUP BY` with `ORDER BY` and `LIMIT`.
392
+ `utf8mb4` character set with 4-Byte encoding supports supplementary characters including emoji.
393
+ The previous default 3-Byte encoding character set `utf8` is not enough to support them.
750
394
 
751
- Fixes #30886.
752
-
753
- *Ryuta Kamizono*
395
+ *Yasuo Honda*
754
396
 
755
- * PostgreSQL `tsrange` now preserves subsecond precision.
756
-
757
- PostgreSQL 9.1+ introduced range types, and Rails added support for using
758
- this datatype in Active Record. However, the serialization of
759
- `PostgreSQL::OID::Range` was incomplete, because it did not properly
760
- cast the bounds that make up the range. This led to subseconds being
761
- dropped in SQL commands:
762
-
763
- Before:
764
-
765
- connection.type_cast(tsrange.serialize(range_value))
766
- # => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
767
-
768
- Now:
769
-
770
- connection.type_cast(tsrange.serialize(range_value))
771
- # => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
772
-
773
- *Thomas Cannon*
774
-
775
- * Passing a `Set` to `Relation#where` now behaves the same as passing an
776
- array.
777
-
778
- *Sean Griffin*
779
-
780
- * Use given algorithm while removing index from database.
781
-
782
- Fixes #24190.
783
-
784
- *Mehmet Emin İNAÇ*
785
-
786
- * Update payload names for `sql.active_record` instrumentation to be
787
- more descriptive.
397
+ * Fix duplicated record creation when using nested attributes with `create_with`.
788
398
 
789
- Fixes #30586.
399
+ *Darwin Wu*
790
400
 
791
- *Jeremy Green*
401
+ * Configuration item `config.filter_parameters` could also filter out
402
+ sensitive values of database columns when call `#inspect`.
403
+ We also added `ActiveRecord::Base::filter_attributes`/`=` in order to
404
+ specify sensitive attributes to specific model.
792
405
 
793
- * Add new error class `LockWaitTimeout` which will be raised
794
- when lock wait timeout exceeded.
406
+ ```
407
+ Rails.application.config.filter_parameters += [:credit_card_number, /phone/]
408
+ Account.last.inspect # => #<Account id: 123, name: "DHH", credit_card_number: [FILTERED], telephone_number: [FILTERED] ...>
409
+ SecureAccount.filter_attributes += [:name]
410
+ SecureAccount.last.inspect # => #<SecureAccount id: 42, name: [FILTERED], credit_card_number: [FILTERED] ...>
411
+ ```
795
412
 
796
- *Gabriel Courtemanche*
413
+ *Zhang Kang*, *Yoshiyuki Kinjo*
797
414
 
798
- * Remove deprecated `#migration_keys`.
415
+ * Deprecate `column_name_length`, `table_name_length`, `columns_per_table`,
416
+ `indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
417
+ and `joins_per_query` methods in `DatabaseLimits`.
799
418
 
800
419
  *Ryuta Kamizono*
801
420
 
802
- * Automatically guess the inverse associations for STI.
803
-
804
- *Yuichiro Kaneko*
805
-
806
- * Ensure `sum` honors `distinct` on `has_many :through` associations.
807
-
808
- Fixes #16791.
809
-
810
- *Aaron Wortham*
421
+ * `ActiveRecord::Base.configurations` now returns an object.
811
422
 
812
- * Add `binary` fixture helper method.
423
+ `ActiveRecord::Base.configurations` used to return a hash, but this
424
+ is an inflexible data model. In order to improve multiple-database
425
+ handling in Rails, we've changed this to return an object. Some methods
426
+ are provided to make the object behave hash-like in order to ease the
427
+ transition process. Since most applications don't manipulate the hash
428
+ we've decided to add backwards-compatible functionality that will throw
429
+ a deprecation warning if used, however calling `ActiveRecord::Base.configurations`
430
+ will use the new version internally and externally.
813
431
 
814
- *Atsushi Yoshida*
432
+ For example, the following `database.yml`:
815
433
 
816
- * When using `Relation#or`, extract the common conditions and put them before the OR condition.
817
-
818
- *Maxime Handfield Lapointe*
819
-
820
- * `Relation#or` now accepts two relations who have different values for
821
- `references` only, as `references` can be implicitly called by `where`.
822
-
823
- Fixes #29411.
824
-
825
- *Sean Griffin*
826
-
827
- * `ApplicationRecord` is no longer generated when generating models. If you
828
- need to generate it, it can be created with `rails g application_record`.
829
-
830
- *Lisa Ugray*
831
-
832
- * Fix `COUNT(DISTINCT ...)` with `ORDER BY` and `LIMIT` to keep the existing select list.
833
-
834
- *Ryuta Kamizono*
835
-
836
- * When a `has_one` association is destroyed by `dependent: destroy`,
837
- `destroyed_by_association` will now be set to the reflection, matching the
838
- behaviour of `has_many` associations.
434
+ ```
435
+ development:
436
+ adapter: sqlite3
437
+ database: db/development.sqlite3
438
+ ```
839
439
 
840
- *Lisa Ugray*
440
+ Used to become a hash:
841
441
 
842
- * Fix `unscoped(where: [columns])` removing the wrong bind values.
442
+ ```
443
+ { "development" => { "adapter" => "sqlite3", "database" => "db/development.sqlite3" } }
444
+ ```
843
445
 
844
- When the `where` is called on a relation after a `or`, unscoping the column of that later `where` removed
845
- bind values used by the `or` instead. (possibly other cases too)
446
+ Is now converted into the following object:
846
447
 
847
448
  ```
848
- Post.where(id: 1).or(Post.where(id: 2)).where(foo: 3).unscope(where: :foo).to_sql
849
- # Currently:
850
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 2 OR "posts"."id" = 3)
851
- # With fix:
852
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1 OR "posts"."id" = 2)
449
+ #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
450
+ #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
451
+ @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
452
+ ]
853
453
  ```
854
454
 
855
- *Maxime Handfield Lapointe*
455
+ Iterating over the database configurations has also changed. Instead of
456
+ calling hash methods on the `configurations` hash directly, a new method `configs_for` has
457
+ been provided that allows you to select the correct configuration. `env_name`, and
458
+ `spec_name` arguments are optional. For example these return an array of
459
+ database config objects for the requested environment and a single database config object
460
+ will be returned for the requested environment and specification name respectively.
856
461
 
857
- * Values constructed using multi-parameter assignment will now use the
858
- post-type-cast value for rendering in single-field form inputs.
462
+ ```
463
+ ActiveRecord::Base.configurations.configs_for(env_name: "development")
464
+ ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
465
+ ```
859
466
 
860
- *Sean Griffin*
467
+ *Eileen M. Uchitelle*, *Aaron Patterson*
861
468
 
862
- * `Relation#joins` is no longer affected by the target model's
863
- `current_scope`, with the exception of `unscoped`.
469
+ * Add database configuration to disable advisory locks.
864
470
 
865
- Fixes #29338.
471
+ ```
472
+ production:
473
+ adapter: postgresql
474
+ advisory_locks: false
475
+ ```
866
476
 
867
- *Sean Griffin*
477
+ *Guo Xiang*
868
478
 
869
- * Change sqlite3 boolean serialization to use 1 and 0.
479
+ * SQLite3 adapter `alter_table` method restores foreign keys.
870
480
 
871
- SQLite natively recognizes 1 and 0 as true and false, but does not natively
872
- recognize 't' and 'f' as was previously serialized.
481
+ *Yasuo Honda*
873
482
 
874
- This change in serialization requires a migration of stored boolean data
875
- for SQLite databases, so it's implemented behind a configuration flag
876
- whose default false value is deprecated.
483
+ * Allow `:to_table` option to `invert_remove_foreign_key`.
877
484
 
878
- *Lisa Ugray*
485
+ Example:
879
486
 
880
- * Skip query caching when working with batches of records (`find_each`, `find_in_batches`,
881
- `in_batches`).
487
+ remove_foreign_key :accounts, to_table: :owners
882
488
 
883
- Previously, records would be fetched in batches, but all records would be retained in memory
884
- until the end of the request or job.
489
+ *Nikolay Epifanov*, *Rich Chen*
885
490
 
886
- *Eugene Kenny*
491
+ * Add environment & load_config dependency to `bin/rake db:seed` to enable
492
+ seed load in environments without Rails and custom DB configuration
887
493
 
888
- * Prevent errors raised by `sql.active_record` notification subscribers from being converted into
889
- `ActiveRecord::StatementInvalid` exceptions.
494
+ *Tobias Bielohlawek*
890
495
 
891
- *Dennis Taylor*
496
+ * Fix default value for mysql time types with specified precision.
892
497
 
893
- * Fix eager loading/preloading association with scope including joins.
498
+ *Nikolay Kondratyev*
894
499
 
895
- Fixes #28324.
500
+ * Fix `touch` option to behave consistently with `Persistence#touch` method.
896
501
 
897
502
  *Ryuta Kamizono*
898
503
 
899
- * Fix transactions to apply state to child transactions.
504
+ * Migrations raise when duplicate column definition.
900
505
 
901
- Previously, if you had a nested transaction and the outer transaction was rolledback, the record from the
902
- inner transaction would still be marked as persisted.
903
-
904
- This change fixes that by applying the state of the parent transaction to the child transaction when the
905
- parent transaction is rolledback. This will correctly mark records from the inner transaction as not persisted.
906
-
907
- *Eileen M. Uchitelle*, *Aaron Patterson*
506
+ Fixes #33024.
908
507
 
909
- * Deprecate `set_state` method in `TransactionState`.
910
-
911
- Deprecated the `set_state` method in favor of setting the state via specific methods. If you need to mark the
912
- state of the transaction you can now use `rollback!`, `commit!` or `nullify!` instead of
913
- `set_state(:rolledback)`, `set_state(:committed)`, or `set_state(nil)`.
914
-
915
- *Eileen M. Uchitelle*, *Aaron Patterson*
508
+ *Federico Martinez*
916
509
 
917
- * Deprecate delegating to `arel` in `Relation`.
510
+ * Bump minimum SQLite version to 3.8
918
511
 
919
- *Ryuta Kamizono*
512
+ *Yasuo Honda*
920
513
 
921
- * Query cache was unavailable when entering the `ActiveRecord::Base.cache` block
922
- without being connected.
514
+ * Fix parent record should not get saved with duplicate children records.
923
515
 
924
- *Tsukasa Oishi*
516
+ Fixes #32940.
925
517
 
926
- * Previously, when building records using a `has_many :through` association,
927
- if the child records were deleted before the parent was saved, they would
928
- still be persisted. Now, if child records are deleted before the parent is saved
929
- on a `has_many :through` association, the child records will not be persisted.
518
+ *Santosh Wadghule*
930
519
 
931
- *Tobias Kraze*
520
+ * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
932
521
 
933
- * Merging two relations representing nested joins no longer transforms the joins of
934
- the merged relation into LEFT OUTER JOIN.
522
+ *Brian Durand*
935
523
 
936
- Example:
524
+ * Ensure `Associations::CollectionAssociation#size` and `Associations::CollectionAssociation#empty?`
525
+ use loaded association ids if present.
937
526
 
938
- ```
939
- Author.joins(:posts).merge(Post.joins(:comments))
940
- # Before the change:
941
- #=> SELECT ... FROM authors INNER JOIN posts ON ... LEFT OUTER JOIN comments ON...
527
+ *Graham Turner*
942
528
 
943
- # After the change:
944
- #=> SELECT ... FROM authors INNER JOIN posts ON ... INNER JOIN comments ON...
945
- ```
529
+ * Add support to preload associations of polymorphic associations when not all the records have the requested associations.
946
530
 
947
- *Maxime Handfield Lapointe*
531
+ *Dana Sherson*
948
532
 
949
- * `ActiveRecord::Persistence#touch` does not work well when optimistic locking enabled and
950
- `locking_column`, without default value, is null in the database.
533
+ * Add `touch_all` method to `ActiveRecord::Relation`.
951
534
 
952
- *bogdanvlviv*
535
+ Example:
953
536
 
954
- * Fix destroying existing object does not work well when optimistic locking enabled and
955
- `locking_column` is null in the database.
537
+ Person.where(name: "David").touch_all(time: Time.new(2020, 5, 16, 0, 0, 0))
956
538
 
957
- *bogdanvlviv*
539
+ *fatkodima*, *duggiefresh*
958
540
 
959
- * Use bulk INSERT to insert fixtures for better performance.
541
+ * Add `ActiveRecord::Base.base_class?` predicate.
960
542
 
961
- *Kir Shatrov*
543
+ *Bogdan Gusiev*
962
544
 
963
- * Prevent creation of bind param if casted value is nil.
545
+ * Add custom prefix/suffix options to `ActiveRecord::Store.store_accessor`.
964
546
 
965
- *Ryuta Kamizono*
547
+ *Tan Huynh*, *Yukio Mizuta*
966
548
 
967
- * Deprecate passing arguments and block at the same time to `count` and `sum` in `ActiveRecord::Calculations`.
549
+ * Rails 6 requires Ruby 2.5.0 or newer.
968
550
 
969
- *Ryuta Kamizono*
551
+ *Jeremy Daer*, *Kasper Timm Hansen*
970
552
 
971
- * Loading model schema from database is now thread-safe.
553
+ * Deprecate `update_attributes`/`!` in favor of `update`/`!`.
972
554
 
973
- Fixes #28589.
555
+ *Eddie Lebow*
974
556
 
975
- *Vikrant Chaudhary*, *David Abdemoulaie*
976
-
977
- * Add `ActiveRecord::Base#cache_version` to support recyclable cache keys via the new versioned entries
978
- in `ActiveSupport::Cache`. This also means that `ActiveRecord::Base#cache_key` will now return a stable key
979
- that does not include a timestamp any more.
980
-
981
- NOTE: This feature is turned off by default, and `#cache_key` will still return cache keys with timestamps
982
- until you set `ActiveRecord::Base.cache_versioning = true`. That's the setting for all new apps on Rails 5.2+
557
+ * Add `ActiveRecord::Base.create_or_find_by`/`!` to deal with the SELECT/INSERT race condition in
558
+ `ActiveRecord::Base.find_or_create_by`/`!` by leaning on unique constraints in the database.
983
559
 
984
560
  *DHH*
985
561
 
986
- * Respect `SchemaDumper.ignore_tables` in rake tasks for databases structure dump.
987
-
988
- *Rusty Geldmacher*, *Guillermo Iguaran*
989
-
990
- * Add type caster to `RuntimeReflection#alias_name`.
991
-
992
- Fixes #28959.
993
-
994
- *Jon Moss*
995
-
996
- * Deprecate `supports_statement_cache?`.
997
-
998
- *Ryuta Kamizono*
999
-
1000
- * Raise error `UnknownMigrationVersionError` on the movement of migrations
1001
- when the current migration does not exist.
1002
-
1003
- *bogdanvlviv*
562
+ * Add `Relation#pick` as short-hand for single-value plucks.
1004
563
 
1005
- * Fix `bin/rails db:forward` first migration.
1006
-
1007
- *bogdanvlviv*
1008
-
1009
- * Support Descending Indexes for MySQL.
1010
-
1011
- MySQL 8.0.1 and higher supports descending indexes: `DESC` in an index definition is no longer ignored.
1012
- See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
1013
-
1014
- *Ryuta Kamizono*
1015
-
1016
- * Fix inconsistency with changed attributes when overriding Active Record attribute reader.
1017
-
1018
- *bogdanvlviv*
1019
-
1020
- * When calling the dynamic fixture accessor method with no arguments, it now returns all fixtures of this type.
1021
- Previously this method always returned an empty array.
1022
-
1023
- *Kevin McPhillips*
564
+ *DHH*
1024
565
 
1025
566
 
1026
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activerecord/CHANGELOG.md) for previous changes.
567
+ Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activerecord/CHANGELOG.md) for previous changes.