activerecord 6.0.0 → 7.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +996 -594
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +34 -34
  5. data/examples/performance.rb +2 -2
  6. data/lib/active_record/aggregations.rb +22 -20
  7. data/lib/active_record/association_relation.rb +22 -12
  8. data/lib/active_record/associations/alias_tracker.rb +41 -30
  9. data/lib/active_record/associations/association.rb +106 -41
  10. data/lib/active_record/associations/association_scope.rb +30 -21
  11. data/lib/active_record/associations/belongs_to_association.rb +69 -14
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +20 -6
  13. data/lib/active_record/associations/builder/association.rb +39 -6
  14. data/lib/active_record/associations/builder/belongs_to.rb +47 -17
  15. data/lib/active_record/associations/builder/collection_association.rb +14 -6
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -10
  17. data/lib/active_record/associations/builder/has_many.rb +7 -3
  18. data/lib/active_record/associations/builder/has_one.rb +13 -16
  19. data/lib/active_record/associations/builder/singular_association.rb +7 -3
  20. data/lib/active_record/associations/collection_association.rb +90 -53
  21. data/lib/active_record/associations/collection_proxy.rb +54 -19
  22. data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
  23. data/lib/active_record/associations/errors.rb +265 -0
  24. data/lib/active_record/associations/foreign_association.rb +21 -1
  25. data/lib/active_record/associations/has_many_association.rb +41 -10
  26. data/lib/active_record/associations/has_many_through_association.rb +29 -12
  27. data/lib/active_record/associations/has_one_association.rb +33 -9
  28. data/lib/active_record/associations/has_one_through_association.rb +1 -1
  29. data/lib/active_record/associations/join_dependency/join_association.rb +41 -17
  30. data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
  31. data/lib/active_record/associations/join_dependency.rb +97 -54
  32. data/lib/active_record/associations/nested_error.rb +47 -0
  33. data/lib/active_record/associations/preloader/association.rb +237 -54
  34. data/lib/active_record/associations/preloader/batch.rb +48 -0
  35. data/lib/active_record/associations/preloader/branch.rb +153 -0
  36. data/lib/active_record/associations/preloader/through_association.rb +51 -17
  37. data/lib/active_record/associations/preloader.rb +55 -121
  38. data/lib/active_record/associations/singular_association.rb +16 -4
  39. data/lib/active_record/associations/through_association.rb +26 -15
  40. data/lib/active_record/associations.rb +454 -440
  41. data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
  42. data/lib/active_record/attribute_assignment.rb +11 -14
  43. data/lib/active_record/attribute_methods/before_type_cast.rb +36 -11
  44. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  45. data/lib/active_record/attribute_methods/dirty.rb +75 -34
  46. data/lib/active_record/attribute_methods/primary_key.rb +53 -31
  47. data/lib/active_record/attribute_methods/query.rb +31 -22
  48. data/lib/active_record/attribute_methods/read.rb +16 -17
  49. data/lib/active_record/attribute_methods/serialization.rb +177 -35
  50. data/lib/active_record/attribute_methods/time_zone_conversion.rb +18 -15
  51. data/lib/active_record/attribute_methods/write.rb +16 -28
  52. data/lib/active_record/attribute_methods.rb +227 -100
  53. data/lib/active_record/attributes.rb +94 -56
  54. data/lib/active_record/autosave_association.rb +119 -73
  55. data/lib/active_record/base.rb +31 -21
  56. data/lib/active_record/callbacks.rb +168 -55
  57. data/lib/active_record/coders/column_serializer.rb +61 -0
  58. data/lib/active_record/coders/json.rb +1 -1
  59. data/lib/active_record/coders/yaml_column.rb +70 -25
  60. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +284 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
  62. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +79 -0
  63. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +367 -565
  64. data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -57
  65. data/lib/active_record/connection_adapters/abstract/database_statements.rb +277 -89
  66. data/lib/active_record/connection_adapters/abstract/query_cache.rb +241 -69
  67. data/lib/active_record/connection_adapters/abstract/quoting.rb +122 -134
  68. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
  69. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
  70. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +324 -72
  71. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +17 -4
  72. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +611 -211
  73. data/lib/active_record/connection_adapters/abstract/transaction.rb +425 -82
  74. data/lib/active_record/connection_adapters/abstract_adapter.rb +698 -211
  75. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +464 -239
  76. data/lib/active_record/connection_adapters/column.rb +28 -1
  77. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  78. data/lib/active_record/connection_adapters/mysql/column.rb +2 -1
  79. data/lib/active_record/connection_adapters/mysql/database_statements.rb +32 -137
  80. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
  81. data/lib/active_record/connection_adapters/mysql/quoting.rb +90 -43
  82. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +41 -7
  83. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +18 -1
  84. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +13 -4
  85. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +53 -15
  86. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  87. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
  88. data/lib/active_record/connection_adapters/mysql2_adapter.rb +127 -63
  89. data/lib/active_record/connection_adapters/pool_config.rb +83 -0
  90. data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
  91. data/lib/active_record/connection_adapters/postgresql/column.rb +54 -2
  92. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +127 -100
  93. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
  94. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +9 -5
  95. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +10 -2
  96. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +15 -2
  97. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  98. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -15
  99. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -3
  101. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +5 -4
  103. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  104. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -3
  105. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +35 -8
  106. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  109. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
  110. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +23 -4
  111. data/lib/active_record/connection_adapters/postgresql/oid.rb +4 -0
  112. data/lib/active_record/connection_adapters/postgresql/quoting.rb +139 -106
  113. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +30 -2
  114. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +98 -4
  115. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +176 -4
  116. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -1
  117. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +462 -118
  118. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  119. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -11
  120. data/lib/active_record/connection_adapters/postgresql_adapter.rb +585 -295
  121. data/lib/active_record/connection_adapters/schema_cache.rb +399 -60
  122. data/lib/active_record/connection_adapters/sql_type_metadata.rb +8 -0
  123. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  124. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +99 -48
  125. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +80 -54
  126. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +27 -1
  127. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
  128. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
  129. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +102 -24
  130. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +425 -174
  131. data/lib/active_record/connection_adapters/statement_pool.rb +7 -1
  132. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
  133. data/lib/active_record/connection_adapters/trilogy_adapter.rb +229 -0
  134. data/lib/active_record/connection_adapters.rb +176 -0
  135. data/lib/active_record/connection_handling.rb +243 -115
  136. data/lib/active_record/core.rb +481 -199
  137. data/lib/active_record/counter_cache.rb +69 -32
  138. data/lib/active_record/database_configurations/connection_url_resolver.rb +107 -0
  139. data/lib/active_record/database_configurations/database_config.rb +77 -10
  140. data/lib/active_record/database_configurations/hash_config.rb +148 -26
  141. data/lib/active_record/database_configurations/url_config.rb +44 -45
  142. data/lib/active_record/database_configurations.rb +190 -114
  143. data/lib/active_record/delegated_type.rb +279 -0
  144. data/lib/active_record/deprecator.rb +7 -0
  145. data/lib/active_record/destroy_association_async_job.rb +38 -0
  146. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  147. data/lib/active_record/dynamic_matchers.rb +5 -6
  148. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  149. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  150. data/lib/active_record/encryption/cipher.rb +53 -0
  151. data/lib/active_record/encryption/config.rb +68 -0
  152. data/lib/active_record/encryption/configurable.rb +60 -0
  153. data/lib/active_record/encryption/context.rb +42 -0
  154. data/lib/active_record/encryption/contexts.rb +76 -0
  155. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  156. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  157. data/lib/active_record/encryption/encryptable_record.rb +230 -0
  158. data/lib/active_record/encryption/encrypted_attribute_type.rb +175 -0
  159. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  160. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  161. data/lib/active_record/encryption/encryptor.rb +171 -0
  162. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  163. data/lib/active_record/encryption/errors.rb +15 -0
  164. data/lib/active_record/encryption/extended_deterministic_queries.rb +157 -0
  165. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  166. data/lib/active_record/encryption/key.rb +28 -0
  167. data/lib/active_record/encryption/key_generator.rb +53 -0
  168. data/lib/active_record/encryption/key_provider.rb +46 -0
  169. data/lib/active_record/encryption/message.rb +33 -0
  170. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  171. data/lib/active_record/encryption/message_serializer.rb +96 -0
  172. data/lib/active_record/encryption/null_encryptor.rb +25 -0
  173. data/lib/active_record/encryption/properties.rb +76 -0
  174. data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
  175. data/lib/active_record/encryption/scheme.rb +100 -0
  176. data/lib/active_record/encryption.rb +58 -0
  177. data/lib/active_record/enum.rb +224 -73
  178. data/lib/active_record/errors.rb +254 -36
  179. data/lib/active_record/explain.rb +30 -17
  180. data/lib/active_record/explain_registry.rb +11 -6
  181. data/lib/active_record/explain_subscriber.rb +2 -2
  182. data/lib/active_record/fixture_set/file.rb +22 -15
  183. data/lib/active_record/fixture_set/model_metadata.rb +15 -6
  184. data/lib/active_record/fixture_set/render_context.rb +3 -1
  185. data/lib/active_record/fixture_set/table_row.rb +88 -16
  186. data/lib/active_record/fixture_set/table_rows.rb +4 -5
  187. data/lib/active_record/fixtures.rb +229 -116
  188. data/lib/active_record/future_result.rb +178 -0
  189. data/lib/active_record/gem_version.rb +4 -4
  190. data/lib/active_record/inheritance.rb +121 -48
  191. data/lib/active_record/insert_all.rb +178 -29
  192. data/lib/active_record/integration.rb +16 -14
  193. data/lib/active_record/internal_metadata.rb +132 -21
  194. data/lib/active_record/legacy_yaml_adapter.rb +3 -36
  195. data/lib/active_record/locking/optimistic.rb +64 -33
  196. data/lib/active_record/locking/pessimistic.rb +21 -8
  197. data/lib/active_record/log_subscriber.rb +61 -30
  198. data/lib/active_record/marshalling.rb +59 -0
  199. data/lib/active_record/message_pack.rb +124 -0
  200. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  201. data/lib/active_record/middleware/database_selector/resolver.rb +19 -19
  202. data/lib/active_record/middleware/database_selector.rb +25 -13
  203. data/lib/active_record/middleware/shard_selector.rb +62 -0
  204. data/lib/active_record/migration/command_recorder.rb +160 -55
  205. data/lib/active_record/migration/compatibility.rb +286 -43
  206. data/lib/active_record/migration/default_strategy.rb +22 -0
  207. data/lib/active_record/migration/execution_strategy.rb +19 -0
  208. data/lib/active_record/migration/join_table.rb +1 -2
  209. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  210. data/lib/active_record/migration.rb +421 -193
  211. data/lib/active_record/model_schema.rb +217 -125
  212. data/lib/active_record/nested_attributes.rb +62 -27
  213. data/lib/active_record/no_touching.rb +4 -4
  214. data/lib/active_record/normalization.rb +163 -0
  215. data/lib/active_record/persistence.rb +322 -319
  216. data/lib/active_record/promise.rb +84 -0
  217. data/lib/active_record/query_cache.rb +18 -15
  218. data/lib/active_record/query_logs.rb +193 -0
  219. data/lib/active_record/query_logs_formatter.rb +41 -0
  220. data/lib/active_record/querying.rb +54 -14
  221. data/lib/active_record/railtie.rb +250 -72
  222. data/lib/active_record/railties/console_sandbox.rb +2 -4
  223. data/lib/active_record/railties/controller_runtime.rb +25 -11
  224. data/lib/active_record/railties/databases.rake +312 -197
  225. data/lib/active_record/railties/job_runtime.rb +23 -0
  226. data/lib/active_record/readonly_attributes.rb +45 -3
  227. data/lib/active_record/reflection.rb +389 -146
  228. data/lib/active_record/relation/batches/batch_enumerator.rb +61 -16
  229. data/lib/active_record/relation/batches.rb +214 -73
  230. data/lib/active_record/relation/calculations.rb +379 -124
  231. data/lib/active_record/relation/delegation.rb +36 -23
  232. data/lib/active_record/relation/finder_methods.rb +159 -49
  233. data/lib/active_record/relation/from_clause.rb +5 -1
  234. data/lib/active_record/relation/merger.rb +41 -33
  235. data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -11
  236. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -7
  237. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +20 -13
  238. data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
  239. data/lib/active_record/relation/predicate_builder.rb +79 -53
  240. data/lib/active_record/relation/query_attribute.rb +30 -12
  241. data/lib/active_record/relation/query_methods.rb +1156 -279
  242. data/lib/active_record/relation/record_fetch_warning.rb +12 -11
  243. data/lib/active_record/relation/spawn_methods.rb +10 -9
  244. data/lib/active_record/relation/where_clause.rb +100 -66
  245. data/lib/active_record/relation.rb +829 -194
  246. data/lib/active_record/result.rb +76 -56
  247. data/lib/active_record/runtime_registry.rb +71 -13
  248. data/lib/active_record/sanitization.rb +86 -47
  249. data/lib/active_record/schema.rb +39 -23
  250. data/lib/active_record/schema_dumper.rb +140 -33
  251. data/lib/active_record/schema_migration.rb +74 -29
  252. data/lib/active_record/scoping/default.rb +73 -19
  253. data/lib/active_record/scoping/named.rb +10 -28
  254. data/lib/active_record/scoping.rb +65 -35
  255. data/lib/active_record/secure_password.rb +60 -0
  256. data/lib/active_record/secure_token.rb +34 -8
  257. data/lib/active_record/serialization.rb +11 -4
  258. data/lib/active_record/signed_id.rb +138 -0
  259. data/lib/active_record/statement_cache.rb +26 -10
  260. data/lib/active_record/store.rb +19 -14
  261. data/lib/active_record/suppressor.rb +15 -17
  262. data/lib/active_record/table_metadata.rb +46 -36
  263. data/lib/active_record/tasks/database_tasks.rb +371 -205
  264. data/lib/active_record/tasks/mysql_database_tasks.rb +43 -36
  265. data/lib/active_record/tasks/postgresql_database_tasks.rb +54 -41
  266. data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -13
  267. data/lib/active_record/test_databases.rb +5 -4
  268. data/lib/active_record/test_fixtures.rb +189 -104
  269. data/lib/active_record/testing/query_assertions.rb +121 -0
  270. data/lib/active_record/timestamp.rb +35 -25
  271. data/lib/active_record/token_for.rb +123 -0
  272. data/lib/active_record/touch_later.rb +31 -27
  273. data/lib/active_record/transaction.rb +132 -0
  274. data/lib/active_record/transactions.rb +131 -99
  275. data/lib/active_record/translation.rb +3 -5
  276. data/lib/active_record/type/adapter_specific_registry.rb +33 -18
  277. data/lib/active_record/type/hash_lookup_type_map.rb +34 -2
  278. data/lib/active_record/type/internal/timezone.rb +7 -2
  279. data/lib/active_record/type/serialized.rb +11 -6
  280. data/lib/active_record/type/time.rb +14 -0
  281. data/lib/active_record/type/type_map.rb +17 -21
  282. data/lib/active_record/type/unsigned_integer.rb +0 -1
  283. data/lib/active_record/type.rb +7 -2
  284. data/lib/active_record/type_caster/connection.rb +4 -5
  285. data/lib/active_record/type_caster/map.rb +8 -5
  286. data/lib/active_record/validations/absence.rb +1 -1
  287. data/lib/active_record/validations/associated.rb +13 -8
  288. data/lib/active_record/validations/numericality.rb +36 -0
  289. data/lib/active_record/validations/presence.rb +5 -28
  290. data/lib/active_record/validations/uniqueness.rb +88 -18
  291. data/lib/active_record/validations.rb +15 -8
  292. data/lib/active_record/version.rb +1 -1
  293. data/lib/active_record.rb +446 -40
  294. data/lib/arel/alias_predication.rb +1 -1
  295. data/lib/arel/attributes/attribute.rb +4 -8
  296. data/lib/arel/collectors/bind.rb +8 -1
  297. data/lib/arel/collectors/composite.rb +15 -0
  298. data/lib/arel/collectors/sql_string.rb +7 -0
  299. data/lib/arel/collectors/substitute_binds.rb +7 -0
  300. data/lib/arel/crud.rb +30 -22
  301. data/lib/arel/delete_manager.rb +23 -4
  302. data/lib/arel/errors.rb +10 -0
  303. data/lib/arel/factory_methods.rb +4 -0
  304. data/lib/arel/filter_predications.rb +9 -0
  305. data/lib/arel/insert_manager.rb +2 -3
  306. data/lib/arel/nodes/binary.rb +82 -9
  307. data/lib/arel/nodes/bind_param.rb +8 -0
  308. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  309. data/lib/arel/nodes/casted.rb +22 -10
  310. data/lib/arel/nodes/cte.rb +36 -0
  311. data/lib/arel/nodes/delete_statement.rb +14 -13
  312. data/lib/arel/nodes/equality.rb +6 -9
  313. data/lib/arel/nodes/filter.rb +10 -0
  314. data/lib/arel/nodes/fragments.rb +35 -0
  315. data/lib/arel/nodes/function.rb +1 -0
  316. data/lib/arel/nodes/grouping.rb +3 -0
  317. data/lib/arel/nodes/homogeneous_in.rb +68 -0
  318. data/lib/arel/nodes/in.rb +8 -1
  319. data/lib/arel/nodes/infix_operation.rb +13 -1
  320. data/lib/arel/nodes/insert_statement.rb +2 -2
  321. data/lib/arel/nodes/join_source.rb +1 -1
  322. data/lib/arel/nodes/leading_join.rb +8 -0
  323. data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
  324. data/lib/arel/nodes/node.rb +122 -11
  325. data/lib/arel/nodes/ordering.rb +27 -0
  326. data/lib/arel/nodes/select_core.rb +2 -2
  327. data/lib/arel/nodes/select_statement.rb +2 -2
  328. data/lib/arel/nodes/sql_literal.rb +16 -0
  329. data/lib/arel/nodes/table_alias.rb +11 -3
  330. data/lib/arel/nodes/unary.rb +0 -1
  331. data/lib/arel/nodes/update_statement.rb +11 -4
  332. data/lib/arel/nodes.rb +10 -3
  333. data/lib/arel/predications.rb +31 -28
  334. data/lib/arel/select_manager.rb +18 -9
  335. data/lib/arel/table.rb +21 -10
  336. data/lib/arel/tree_manager.rb +8 -15
  337. data/lib/arel/update_manager.rb +25 -5
  338. data/lib/arel/visitors/dot.rb +94 -90
  339. data/lib/arel/visitors/mysql.rb +34 -6
  340. data/lib/arel/visitors/postgresql.rb +5 -16
  341. data/lib/arel/visitors/sqlite.rb +25 -1
  342. data/lib/arel/visitors/to_sql.rb +227 -81
  343. data/lib/arel/visitors/visitor.rb +2 -3
  344. data/lib/arel/visitors.rb +0 -7
  345. data/lib/arel.rb +37 -15
  346. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  347. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  348. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
  349. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  350. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +6 -1
  351. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -4
  352. data/lib/rails/generators/active_record/migration.rb +9 -3
  353. data/lib/rails/generators/active_record/model/USAGE +113 -0
  354. data/lib/rails/generators/active_record/model/model_generator.rb +49 -4
  355. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  356. data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
  357. data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
  358. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  359. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  360. metadata +117 -30
  361. data/lib/active_record/attribute_decorators.rb +0 -90
  362. data/lib/active_record/connection_adapters/connection_specification.rb +0 -297
  363. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  364. data/lib/active_record/define_callbacks.rb +0 -22
  365. data/lib/active_record/null_relation.rb +0 -68
  366. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  367. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  368. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  369. data/lib/arel/attributes.rb +0 -22
  370. data/lib/arel/visitors/depth_first.rb +0 -204
  371. data/lib/arel/visitors/ibm_db.rb +0 -34
  372. data/lib/arel/visitors/informix.rb +0 -62
  373. data/lib/arel/visitors/mssql.rb +0 -157
  374. data/lib/arel/visitors/oracle.rb +0 -159
  375. data/lib/arel/visitors/oracle12.rb +0 -66
  376. data/lib/arel/visitors/where_sql.rb +0 -23
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "active_record"
4
4
  require "rails"
5
+ require "active_support/core_ext/object/try"
5
6
  require "active_model/railtie"
6
7
 
7
8
  # For now, action_controller must always be present with
@@ -14,6 +15,7 @@ module ActiveRecord
14
15
  # = Active Record Railtie
15
16
  class Railtie < Rails::Railtie # :nodoc:
16
17
  config.active_record = ActiveSupport::OrderedOptions.new
18
+ config.active_record.encryption = ActiveSupport::OrderedOptions.new
17
19
 
18
20
  config.app_generators.orm :active_record, migration: true,
19
21
  timestamps: true
@@ -21,23 +23,29 @@ module ActiveRecord
21
23
  config.action_dispatch.rescue_responses.merge!(
22
24
  "ActiveRecord::RecordNotFound" => :not_found,
23
25
  "ActiveRecord::StaleObjectError" => :conflict,
24
- "ActiveRecord::RecordInvalid" => :unprocessable_entity,
25
- "ActiveRecord::RecordNotSaved" => :unprocessable_entity
26
+ "ActiveRecord::RecordInvalid" => ActionDispatch::Constants::UNPROCESSABLE_CONTENT,
27
+ "ActiveRecord::RecordNotSaved" => ActionDispatch::Constants::UNPROCESSABLE_CONTENT
26
28
  )
27
29
 
28
30
  config.active_record.use_schema_cache_dump = true
31
+ config.active_record.check_schema_cache_dump_version = true
29
32
  config.active_record.maintain_test_schema = true
33
+ config.active_record.has_many_inversing = false
34
+ config.active_record.query_log_tags_enabled = false
35
+ config.active_record.query_log_tags = [ :application ]
36
+ config.active_record.query_log_tags_format = :legacy
37
+ config.active_record.cache_query_log_tags = false
38
+ config.active_record.raise_on_assign_to_attr_readonly = false
39
+ config.active_record.belongs_to_required_validates_foreign_key = true
40
+ config.active_record.generate_secure_token_on = :create
30
41
 
31
- config.active_record.sqlite3 = ActiveSupport::OrderedOptions.new
32
- config.active_record.sqlite3.represent_boolean_as_integer = nil
42
+ config.active_record.queues = ActiveSupport::InheritableOptions.new
33
43
 
34
44
  config.eager_load_namespaces << ActiveRecord
35
45
 
36
46
  rake_tasks do
37
47
  namespace :db do
38
48
  task :load_config do
39
- ActiveRecord::Tasks::DatabaseTasks.database_configuration = Rails.application.config.database_configuration
40
-
41
49
  if defined?(ENGINE_ROOT) && engine = Rails::Engine.find(ENGINE_ROOT)
42
50
  if engine.paths["db/migrate"].existent
43
51
  ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths["db/migrate"].to_a
@@ -57,19 +65,32 @@ module ActiveRecord
57
65
  require "active_record/base"
58
66
  unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDERR, STDOUT)
59
67
  console = ActiveSupport::Logger.new(STDERR)
60
- Rails.logger.extend ActiveSupport::Logger.broadcast console
68
+ console.level = Rails.logger.level
69
+ Rails.logger.broadcast_to(console)
61
70
  end
62
- ActiveRecord::Base.verbose_query_logs = false
71
+ ActiveRecord.verbose_query_logs = false
72
+ ActiveRecord::Base.attributes_for_inspect = :all
63
73
  end
64
74
 
65
75
  runner do
66
76
  require "active_record/base"
67
77
  end
68
78
 
79
+ initializer "active_record.deprecator", before: :load_environment_config do |app|
80
+ app.deprecators[:active_record] = ActiveRecord.deprecator
81
+ end
82
+
69
83
  initializer "active_record.initialize_timezone" do
70
84
  ActiveSupport.on_load(:active_record) do
71
85
  self.time_zone_aware_attributes = true
72
- self.default_timezone = :utc
86
+ end
87
+ end
88
+
89
+ initializer "active_record.postgresql_time_zone_aware_types" do
90
+ ActiveSupport.on_load(:active_record_postgresqladapter) do
91
+ ActiveSupport.on_load(:active_record) do
92
+ ActiveRecord::Base.time_zone_aware_types << :timestamptz
93
+ end
73
94
  end
74
95
  end
75
96
 
@@ -81,22 +102,15 @@ module ActiveRecord
81
102
  ActiveSupport.on_load(:active_record) { LogSubscriber.backtrace_cleaner = ::Rails.backtrace_cleaner }
82
103
  end
83
104
 
84
- initializer "active_record.migration_error" do
85
- if config.active_record.delete(:migration_error) == :page_load
105
+ initializer "active_record.migration_error" do |app|
106
+ if config.active_record.migration_error == :page_load
86
107
  config.app_middleware.insert_after ::ActionDispatch::Callbacks,
87
- ActiveRecord::Migration::CheckPending
88
- end
89
- end
90
-
91
- initializer "active_record.database_selector" do
92
- if options = config.active_record.delete(:database_selector)
93
- resolver = config.active_record.delete(:database_resolver)
94
- operations = config.active_record.delete(:database_resolver_context)
95
- config.app_middleware.use ActiveRecord::Middleware::DatabaseSelector, resolver, operations, options
108
+ ActiveRecord::Migration::CheckPending,
109
+ file_watcher: app.config.file_watcher
96
110
  end
97
111
  end
98
112
 
99
- initializer "Check for cache versioning support" do
113
+ initializer "active_record.cache_versioning_support" do
100
114
  config.after_initialize do |app|
101
115
  ActiveSupport.on_load(:active_record) do
102
116
  if app.config.active_record.cache_versioning && Rails.cache
@@ -114,50 +128,56 @@ To keep using the current cache store, you can turn off cache versioning entirel
114
128
 
115
129
  config.active_record.cache_versioning = false
116
130
 
117
- end_error
131
+ end_error
118
132
  end
119
133
  end
120
134
  end
121
135
  end
122
136
  end
123
137
 
124
- initializer "active_record.check_schema_cache_dump" do
125
- if config.active_record.delete(:use_schema_cache_dump)
126
- config.after_initialize do |app|
127
- ActiveSupport.on_load(:active_record) do
128
- filename = File.join(app.config.paths["db"].first, "schema_cache.yml")
138
+ initializer "active_record.copy_schema_cache_config" do
139
+ active_record_config = config.active_record
129
140
 
130
- if File.file?(filename)
131
- current_version = ActiveRecord::Migrator.current_version
132
-
133
- next if current_version.nil?
134
-
135
- cache = YAML.load(File.read(filename))
136
- if cache.version == current_version
137
- connection_pool.schema_cache = cache.dup
138
- else
139
- warn "Ignoring db/schema_cache.yml because it has expired. The current schema version is #{current_version}, but the one in the cache is #{cache.version}."
140
- end
141
- end
142
- end
143
- end
144
- end
141
+ ActiveRecord::ConnectionAdapters::SchemaReflection.use_schema_cache_dump = active_record_config.use_schema_cache_dump
142
+ ActiveRecord::ConnectionAdapters::SchemaReflection.check_schema_cache_dump_version = active_record_config.check_schema_cache_dump_version
145
143
  end
146
144
 
147
145
  initializer "active_record.define_attribute_methods" do |app|
146
+ # For resiliency, it is critical that a Rails application should be
147
+ # able to boot without depending on the database (or any other service)
148
+ # being responsive.
149
+ #
150
+ # Otherwise a bad deploy adding a lot of load on the database may require to
151
+ # entirely shutdown the application so the database can recover before a fixed
152
+ # version can be deployed again.
153
+ #
154
+ # This is why this initializer tries hard not to query the database, and if it
155
+ # does, it makes sure to rescue any possible database error.
156
+ check_schema_cache_dump_version = config.active_record.check_schema_cache_dump_version
148
157
  config.after_initialize do
149
158
  ActiveSupport.on_load(:active_record) do
150
- if app.config.eager_load
151
- descendants.each do |model|
152
- # SchemaMigration and InternalMetadata both override `table_exists?`
153
- # to bypass the schema cache, so skip them to avoid the extra queries.
154
- next if model._internal?
155
-
156
- # If there's no connection yet, or the schema cache doesn't have the columns
157
- # hash for the model cached, `define_attribute_methods` would trigger a query.
158
- next unless model.connected? && model.connection.schema_cache.columns_hash?(model.table_name)
159
-
160
- model.define_attribute_methods
159
+ # In development and test we shouldn't eagerly define attribute methods because
160
+ # db:test:prepare will trigger later and might change the schema.
161
+ #
162
+ # Additionally if `check_schema_cache_dump_version` is enabled (which is the default),
163
+ # loading the schema cache dump trigger a database connection to compare the schema
164
+ # versions.
165
+ # This means the attribute methods will be lazily defined when the model is accessed,
166
+ # likely as part of the first few requests or jobs. This isn't good for performance
167
+ # but we unfortunately have to arbitrate between resiliency and performance, and chose
168
+ # resiliency.
169
+ if !check_schema_cache_dump_version && app.config.eager_load && !Rails.env.local?
170
+ begin
171
+ descendants.each do |model|
172
+ if model.connection_pool.schema_reflection.cached?(model.table_name)
173
+ model.define_attribute_methods
174
+ end
175
+ end
176
+ rescue ActiveRecordError => error
177
+ # Regardless of whether there was already a connection or not, we rescue any database
178
+ # error because it is critical that the application can boot even if the database
179
+ # is unhealthy.
180
+ warn "Failed to define attribute methods because of #{error.class}: #{error.message}"
161
181
  end
162
182
  end
163
183
  end
@@ -166,28 +186,91 @@ end_error
166
186
 
167
187
  initializer "active_record.warn_on_records_fetched_greater_than" do
168
188
  if config.active_record.warn_on_records_fetched_greater_than
189
+ ActiveRecord.deprecator.warn <<~MSG.squish
190
+ `config.active_record.warn_on_records_fetched_greater_than` is deprecated and will be
191
+ removed in Rails 8.0.
192
+ Please subscribe to `sql.active_record` notifications and access the row count field to
193
+ detect large result set sizes.
194
+ MSG
169
195
  ActiveSupport.on_load(:active_record) do
170
196
  require "active_record/relation/record_fetch_warning"
171
197
  end
172
198
  end
173
199
  end
174
200
 
175
- initializer "active_record.set_configs" do |app|
176
- ActiveSupport.on_load(:active_record) do
177
- configs = app.config.active_record
178
-
179
- represent_boolean_as_integer = configs.sqlite3.delete(:represent_boolean_as_integer)
201
+ initializer "active_record.sqlite3_deprecated_warning" do
202
+ if config.active_record.key?(:sqlite3_production_warning)
203
+ config.active_record.delete(:sqlite3_production_warning)
204
+ ActiveRecord.deprecator.warn <<~MSG.squish
205
+ The `config.active_record.sqlite3_production_warning` configuration no longer has any effect
206
+ and can be safely removed.
207
+ MSG
208
+ end
209
+ end
180
210
 
181
- unless represent_boolean_as_integer.nil?
211
+ initializer "active_record.sqlite3_adapter_strict_strings_by_default" do
212
+ config.after_initialize do
213
+ if config.active_record.sqlite3_adapter_strict_strings_by_default
182
214
  ActiveSupport.on_load(:active_record_sqlite3adapter) do
183
- ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer = represent_boolean_as_integer
215
+ self.strict_strings_by_default = true
216
+ end
217
+ end
218
+ end
219
+ end
220
+
221
+ initializer "active_record.postgresql_adapter_decode_dates" do
222
+ config.after_initialize do
223
+ if config.active_record.postgresql_adapter_decode_dates
224
+ ActiveSupport.on_load(:active_record_postgresqladapter) do
225
+ self.decode_dates = true
184
226
  end
185
227
  end
228
+ end
229
+ end
186
230
 
187
- configs.delete(:sqlite3)
231
+ initializer "active_record.set_configs" do |app|
232
+ configs = app.config.active_record
188
233
 
234
+ config.after_initialize do
189
235
  configs.each do |k, v|
190
- send "#{k}=", v
236
+ next if k == :encryption
237
+ setter = "#{k}="
238
+ if ActiveRecord.respond_to?(setter)
239
+ ActiveRecord.send(setter, v)
240
+ end
241
+ end
242
+ end
243
+
244
+ ActiveSupport.on_load(:active_record) do
245
+ configs_used_in_other_initializers = configs.except(
246
+ :migration_error,
247
+ :database_selector,
248
+ :database_resolver,
249
+ :database_resolver_context,
250
+ :shard_selector,
251
+ :shard_resolver,
252
+ :query_log_tags_enabled,
253
+ :query_log_tags,
254
+ :query_log_tags_format,
255
+ :cache_query_log_tags,
256
+ :sqlite3_adapter_strict_strings_by_default,
257
+ :check_schema_cache_dump_version,
258
+ :use_schema_cache_dump,
259
+ :postgresql_adapter_decode_dates,
260
+ )
261
+
262
+ configs_used_in_other_initializers.each do |k, v|
263
+ next if k == :encryption
264
+ setter = "#{k}="
265
+ # Some existing initializers might rely on Active Record configuration
266
+ # being copied from the config object to their actual destination when
267
+ # `ActiveRecord::Base` is loaded.
268
+ # So to preserve backward compatibility we copy the config a second time.
269
+ if ActiveRecord.respond_to?(setter)
270
+ ActiveRecord.send(setter, v)
271
+ else
272
+ send(setter, v)
273
+ end
191
274
  end
192
275
  end
193
276
  end
@@ -196,24 +279,22 @@ end_error
196
279
  # and then establishes the connection.
197
280
  initializer "active_record.initialize_database" do
198
281
  ActiveSupport.on_load(:active_record) do
199
- self.connection_handlers = { writing_role => ActiveRecord::Base.default_connection_handler }
200
282
  self.configurations = Rails.application.config.database_configuration
283
+
201
284
  establish_connection
202
285
  end
203
286
  end
204
287
 
205
- # Expose database runtime to controller for logging.
288
+ # Expose database runtime for logging.
206
289
  initializer "active_record.log_runtime" do
207
290
  require "active_record/railties/controller_runtime"
208
291
  ActiveSupport.on_load(:action_controller) do
209
292
  include ActiveRecord::Railties::ControllerRuntime
210
293
  end
211
- end
212
294
 
213
- initializer "active_record.collection_cache_association_loading" do
214
- require "active_record/railties/collection_cache_association_loading"
215
- ActiveSupport.on_load(:action_view) do
216
- ActionView::PartialRenderer.prepend(ActiveRecord::Railties::CollectionCacheAssociationLoading)
295
+ require "active_record/railties/job_runtime"
296
+ ActiveSupport.on_load(:active_job) do
297
+ include ActiveRecord::Railties::JobRuntime
217
298
  end
218
299
  end
219
300
 
@@ -222,7 +303,7 @@ end_error
222
303
  ActiveSupport::Reloader.before_class_unload do
223
304
  if ActiveRecord::Base.connected?
224
305
  ActiveRecord::Base.clear_cache!
225
- ActiveRecord::Base.clear_reloadable_connections!
306
+ ActiveRecord::Base.connection_handler.clear_reloadable_connections!(:all)
226
307
  end
227
308
  end
228
309
  end
@@ -230,6 +311,8 @@ end_error
230
311
 
231
312
  initializer "active_record.set_executor_hooks" do
232
313
  ActiveRecord::QueryCache.install_executor_hooks
314
+ ActiveRecord::AsynchronousQueriesTracker.install_executor_hooks
315
+ ActiveRecord::ConnectionAdapters::ConnectionPool.install_executor_hooks
233
316
  end
234
317
 
235
318
  initializer "active_record.add_watchable_files" do |app|
@@ -248,8 +331,8 @@ end_error
248
331
  # this connection is trivial: the rest of the pool would need to be
249
332
  # populated anyway.
250
333
 
251
- clear_active_connections!
252
- flush_idle_connections!
334
+ connection_handler.clear_active_connections!(:all)
335
+ connection_handler.flush_idle_connections!(:all)
253
336
  end
254
337
  end
255
338
  end
@@ -259,5 +342,100 @@ end_error
259
342
  self.filter_attributes += Rails.application.config.filter_parameters
260
343
  end
261
344
  end
345
+
346
+ initializer "active_record.set_signed_id_verifier_secret" do
347
+ ActiveSupport.on_load(:active_record) do
348
+ self.signed_id_verifier_secret ||= -> { Rails.application.key_generator.generate_key("active_record/signed_id") }
349
+ end
350
+ end
351
+
352
+ initializer "active_record.generated_token_verifier" do
353
+ config.after_initialize do |app|
354
+ ActiveSupport.on_load(:active_record) do
355
+ self.generated_token_verifier ||= app.message_verifier("active_record/token_for")
356
+ end
357
+ end
358
+ end
359
+
360
+ initializer "active_record_encryption.configuration" do |app|
361
+ ActiveSupport.on_load(:active_record_encryption) do
362
+ ActiveRecord::Encryption.configure(
363
+ primary_key: app.credentials.dig(:active_record_encryption, :primary_key),
364
+ deterministic_key: app.credentials.dig(:active_record_encryption, :deterministic_key),
365
+ key_derivation_salt: app.credentials.dig(:active_record_encryption, :key_derivation_salt),
366
+ **app.config.active_record.encryption
367
+ )
368
+
369
+ auto_filtered_parameters = ActiveRecord::Encryption::AutoFilteredParameters.new(app)
370
+ auto_filtered_parameters.enable if ActiveRecord::Encryption.config.add_to_filter_parameters
371
+ end
372
+
373
+ ActiveSupport.on_load(:active_record) do
374
+ # Support extended queries for deterministic attributes and validations
375
+ if ActiveRecord::Encryption.config.extend_queries
376
+ ActiveRecord::Encryption::ExtendedDeterministicQueries.install_support
377
+ ActiveRecord::Encryption::ExtendedDeterministicUniquenessValidator.install_support
378
+ end
379
+ end
380
+
381
+ ActiveSupport.on_load(:active_record_fixture_set) do
382
+ # Encrypt Active Record fixtures
383
+ if ActiveRecord::Encryption.config.encrypt_fixtures
384
+ ActiveRecord::Fixture.prepend ActiveRecord::Encryption::EncryptedFixtures
385
+ end
386
+ end
387
+ end
388
+
389
+ initializer "active_record.query_log_tags_config" do |app|
390
+ config.after_initialize do
391
+ if app.config.active_record.query_log_tags_enabled
392
+ ActiveRecord.query_transformers << ActiveRecord::QueryLogs
393
+ ActiveRecord::QueryLogs.taggings.merge!(
394
+ application: Rails.application.class.name.split("::").first,
395
+ pid: -> { Process.pid.to_s },
396
+ socket: ->(context) { context[:connection].pool.db_config.socket },
397
+ db_host: ->(context) { context[:connection].pool.db_config.host },
398
+ database: ->(context) { context[:connection].pool.db_config.database },
399
+ source_location: -> { QueryLogs.query_source_location }
400
+ )
401
+ ActiveRecord.disable_prepared_statements = true
402
+
403
+ if app.config.active_record.query_log_tags.present?
404
+ ActiveRecord::QueryLogs.tags = app.config.active_record.query_log_tags
405
+ end
406
+
407
+ if app.config.active_record.query_log_tags_format
408
+ ActiveRecord::QueryLogs.update_formatter(app.config.active_record.query_log_tags_format)
409
+ end
410
+
411
+ if app.config.active_record.cache_query_log_tags
412
+ ActiveRecord::QueryLogs.cache_query_log_tags = true
413
+ end
414
+ end
415
+ end
416
+ end
417
+
418
+ initializer "active_record.unregister_current_scopes_on_unload" do |app|
419
+ config.after_initialize do
420
+ if app.config.reloading_enabled?
421
+ Rails.autoloaders.main.on_unload do |_cpath, value, _abspath|
422
+ # Conditions are written this way to be robust against custom
423
+ # implementations of value#is_a? or value#<.
424
+ if Class === value && ActiveRecord::Base > value
425
+ value.current_scope = nil
426
+ end
427
+ end
428
+ end
429
+ end
430
+ end
431
+
432
+ initializer "active_record.message_pack" do
433
+ ActiveSupport.on_load(:message_pack) do
434
+ ActiveSupport.on_load(:active_record) do
435
+ require "active_record/message_pack"
436
+ ActiveRecord::MessagePack::Extensions.install(ActiveSupport::MessagePack::CacheSerializer)
437
+ end
438
+ end
439
+ end
262
440
  end
263
441
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ActiveRecord::Base.connection.begin_transaction(joinable: false)
4
-
5
- at_exit do
6
- ActiveRecord::Base.connection.rollback_transaction
3
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.set_callback(:checkout, :after) do
4
+ begin_transaction(joinable: false)
7
5
  end
@@ -1,21 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/core_ext/module/attr_internal"
4
- require "active_record/log_subscriber"
4
+ require "active_record/runtime_registry"
5
5
 
6
6
  module ActiveRecord
7
7
  module Railties # :nodoc:
8
- module ControllerRuntime #:nodoc:
8
+ module ControllerRuntime # :nodoc:
9
9
  extend ActiveSupport::Concern
10
10
 
11
11
  module ClassMethods # :nodoc:
12
12
  def log_process_action(payload)
13
13
  messages, db_runtime = super, payload[:db_runtime]
14
- messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
14
+
15
+ if db_runtime
16
+ queries_count = payload[:queries_count] || 0
17
+ cached_queries_count = payload[:cached_queries_count] || 0
18
+ messages << ("ActiveRecord: %.1fms (%d %s, %d cached)" % [db_runtime.to_f, queries_count,
19
+ "query".pluralize(queries_count), cached_queries_count])
20
+ end
21
+
15
22
  messages
16
23
  end
17
24
  end
18
25
 
26
+ def initialize(...) # :nodoc:
27
+ super
28
+ self.db_runtime = nil
29
+ end
30
+
19
31
  private
20
32
  attr_internal :db_runtime
21
33
 
@@ -23,18 +35,19 @@ module ActiveRecord
23
35
  # We also need to reset the runtime before each action
24
36
  # because of queries in middleware or in cases we are streaming
25
37
  # and it won't be cleaned up by the method below.
26
- ActiveRecord::LogSubscriber.reset_runtime
38
+ ActiveRecord::RuntimeRegistry.reset
27
39
  super
28
40
  end
29
41
 
30
42
  def cleanup_view_runtime
31
- if logger && logger.info? && ActiveRecord::Base.connected?
32
- db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
43
+ if logger && logger.info?
44
+ db_rt_before_render = ActiveRecord::RuntimeRegistry.reset_runtimes
33
45
  self.db_runtime = (db_runtime || 0) + db_rt_before_render
34
46
  runtime = super
35
- db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
47
+ queries_rt = ActiveRecord::RuntimeRegistry.sql_runtime - ActiveRecord::RuntimeRegistry.async_sql_runtime
48
+ db_rt_after_render = ActiveRecord::RuntimeRegistry.reset_runtimes
36
49
  self.db_runtime += db_rt_after_render
37
- runtime - db_rt_after_render
50
+ runtime - queries_rt
38
51
  else
39
52
  super
40
53
  end
@@ -42,9 +55,10 @@ module ActiveRecord
42
55
 
43
56
  def append_info_to_payload(payload)
44
57
  super
45
- if ActiveRecord::Base.connected?
46
- payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::LogSubscriber.reset_runtime
47
- end
58
+
59
+ payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::RuntimeRegistry.reset_runtimes
60
+ payload[:queries_count] = ActiveRecord::RuntimeRegistry.reset_queries_count
61
+ payload[:cached_queries_count] = ActiveRecord::RuntimeRegistry.reset_cached_queries_count
48
62
  end
49
63
  end
50
64
  end