activerecord 6.1.7 → 7.1.5

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