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