activerecord 3.2.6 → 6.0.0

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 (371) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +611 -6417
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +44 -47
  5. data/examples/performance.rb +79 -71
  6. data/examples/simple.rb +6 -5
  7. data/lib/active_record/aggregations.rb +268 -238
  8. data/lib/active_record/association_relation.rb +40 -0
  9. data/lib/active_record/associations/alias_tracker.rb +47 -42
  10. data/lib/active_record/associations/association.rb +173 -81
  11. data/lib/active_record/associations/association_scope.rb +124 -92
  12. data/lib/active_record/associations/belongs_to_association.rb +83 -38
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +11 -9
  14. data/lib/active_record/associations/builder/association.rb +113 -32
  15. data/lib/active_record/associations/builder/belongs_to.rb +105 -60
  16. data/lib/active_record/associations/builder/collection_association.rb +53 -56
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +98 -41
  18. data/lib/active_record/associations/builder/has_many.rb +11 -63
  19. data/lib/active_record/associations/builder/has_one.rb +47 -45
  20. data/lib/active_record/associations/builder/singular_association.rb +30 -18
  21. data/lib/active_record/associations/collection_association.rb +217 -295
  22. data/lib/active_record/associations/collection_proxy.rb +1074 -77
  23. data/lib/active_record/associations/foreign_association.rb +20 -0
  24. data/lib/active_record/associations/has_many_association.rb +78 -50
  25. data/lib/active_record/associations/has_many_through_association.rb +99 -61
  26. data/lib/active_record/associations/has_one_association.rb +75 -30
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +45 -119
  29. data/lib/active_record/associations/join_dependency/join_base.rb +11 -12
  30. data/lib/active_record/associations/join_dependency/join_part.rb +35 -42
  31. data/lib/active_record/associations/join_dependency.rb +208 -164
  32. data/lib/active_record/associations/preloader/association.rb +93 -87
  33. data/lib/active_record/associations/preloader/through_association.rb +87 -38
  34. data/lib/active_record/associations/preloader.rb +134 -110
  35. data/lib/active_record/associations/singular_association.rb +19 -24
  36. data/lib/active_record/associations/through_association.rb +61 -27
  37. data/lib/active_record/associations.rb +1766 -1505
  38. data/lib/active_record/attribute_assignment.rb +57 -193
  39. data/lib/active_record/attribute_decorators.rb +90 -0
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +58 -8
  41. data/lib/active_record/attribute_methods/dirty.rb +187 -67
  42. data/lib/active_record/attribute_methods/primary_key.rb +100 -78
  43. data/lib/active_record/attribute_methods/query.rb +10 -8
  44. data/lib/active_record/attribute_methods/read.rb +29 -118
  45. data/lib/active_record/attribute_methods/serialization.rb +60 -72
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +69 -42
  47. data/lib/active_record/attribute_methods/write.rb +36 -44
  48. data/lib/active_record/attribute_methods.rb +306 -161
  49. data/lib/active_record/attributes.rb +279 -0
  50. data/lib/active_record/autosave_association.rb +324 -238
  51. data/lib/active_record/base.rb +114 -507
  52. data/lib/active_record/callbacks.rb +147 -83
  53. data/lib/active_record/coders/json.rb +15 -0
  54. data/lib/active_record/coders/yaml_column.rb +32 -23
  55. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +962 -279
  56. data/lib/active_record/connection_adapters/abstract/database_limits.rb +32 -5
  57. data/lib/active_record/connection_adapters/abstract/database_statements.rb +331 -209
  58. data/lib/active_record/connection_adapters/abstract/query_cache.rb +95 -23
  59. data/lib/active_record/connection_adapters/abstract/quoting.rb +201 -65
  60. data/lib/active_record/connection_adapters/abstract/savepoints.rb +23 -0
  61. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +510 -289
  63. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +93 -0
  64. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1182 -313
  65. data/lib/active_record/connection_adapters/abstract/transaction.rb +323 -0
  66. data/lib/active_record/connection_adapters/abstract_adapter.rb +585 -120
  67. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +610 -463
  68. data/lib/active_record/connection_adapters/column.rb +58 -233
  69. data/lib/active_record/connection_adapters/connection_specification.rb +297 -0
  70. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  71. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
  73. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  74. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  79. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  80. data/lib/active_record/connection_adapters/mysql2_adapter.rb +75 -207
  81. data/lib/active_record/connection_adapters/postgresql/column.rb +30 -0
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +182 -0
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +92 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +50 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +21 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +71 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +41 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +65 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +97 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +113 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +26 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid.rb +34 -0
  107. data/lib/active_record/connection_adapters/postgresql/quoting.rb +205 -0
  108. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +43 -0
  109. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +222 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +776 -0
  113. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  114. data/lib/active_record/connection_adapters/postgresql/utils.rb +81 -0
  115. data/lib/active_record/connection_adapters/postgresql_adapter.rb +695 -1052
  116. data/lib/active_record/connection_adapters/schema_cache.rb +115 -24
  117. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  118. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +528 -26
  126. data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
  127. data/lib/active_record/connection_handling.rb +267 -0
  128. data/lib/active_record/core.rb +599 -0
  129. data/lib/active_record/counter_cache.rb +177 -103
  130. data/lib/active_record/database_configurations/database_config.rb +37 -0
  131. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  132. data/lib/active_record/database_configurations/url_config.rb +79 -0
  133. data/lib/active_record/database_configurations.rb +233 -0
  134. data/lib/active_record/define_callbacks.rb +22 -0
  135. data/lib/active_record/dynamic_matchers.rb +107 -64
  136. data/lib/active_record/enum.rb +274 -0
  137. data/lib/active_record/errors.rb +254 -61
  138. data/lib/active_record/explain.rb +35 -70
  139. data/lib/active_record/explain_registry.rb +32 -0
  140. data/lib/active_record/explain_subscriber.rb +18 -8
  141. data/lib/active_record/fixture_set/file.rb +82 -0
  142. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  143. data/lib/active_record/fixture_set/render_context.rb +17 -0
  144. data/lib/active_record/fixture_set/table_row.rb +153 -0
  145. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  146. data/lib/active_record/fixtures.rb +291 -475
  147. data/lib/active_record/gem_version.rb +17 -0
  148. data/lib/active_record/inheritance.rb +219 -100
  149. data/lib/active_record/insert_all.rb +179 -0
  150. data/lib/active_record/integration.rb +175 -17
  151. data/lib/active_record/internal_metadata.rb +53 -0
  152. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  153. data/lib/active_record/locale/en.yml +9 -1
  154. data/lib/active_record/locking/optimistic.rb +106 -92
  155. data/lib/active_record/locking/pessimistic.rb +23 -11
  156. data/lib/active_record/log_subscriber.rb +80 -30
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  159. data/lib/active_record/middleware/database_selector.rb +75 -0
  160. data/lib/active_record/migration/command_recorder.rb +235 -56
  161. data/lib/active_record/migration/compatibility.rb +244 -0
  162. data/lib/active_record/migration/join_table.rb +17 -0
  163. data/lib/active_record/migration.rb +917 -301
  164. data/lib/active_record/model_schema.rb +351 -175
  165. data/lib/active_record/nested_attributes.rb +366 -235
  166. data/lib/active_record/no_touching.rb +65 -0
  167. data/lib/active_record/null_relation.rb +68 -0
  168. data/lib/active_record/persistence.rb +761 -166
  169. data/lib/active_record/query_cache.rb +22 -44
  170. data/lib/active_record/querying.rb +55 -31
  171. data/lib/active_record/railtie.rb +185 -47
  172. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  173. data/lib/active_record/railties/console_sandbox.rb +5 -4
  174. data/lib/active_record/railties/controller_runtime.rb +35 -33
  175. data/lib/active_record/railties/databases.rake +366 -463
  176. data/lib/active_record/readonly_attributes.rb +4 -6
  177. data/lib/active_record/reflection.rb +736 -228
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  179. data/lib/active_record/relation/batches.rb +252 -52
  180. data/lib/active_record/relation/calculations.rb +340 -270
  181. data/lib/active_record/relation/delegation.rb +117 -36
  182. data/lib/active_record/relation/finder_methods.rb +439 -286
  183. data/lib/active_record/relation/from_clause.rb +26 -0
  184. data/lib/active_record/relation/merger.rb +184 -0
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +49 -0
  186. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  187. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  189. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  190. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +19 -0
  192. data/lib/active_record/relation/predicate_builder.rb +131 -39
  193. data/lib/active_record/relation/query_attribute.rb +50 -0
  194. data/lib/active_record/relation/query_methods.rb +1163 -221
  195. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  196. data/lib/active_record/relation/spawn_methods.rb +49 -120
  197. data/lib/active_record/relation/where_clause.rb +190 -0
  198. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  199. data/lib/active_record/relation.rb +671 -349
  200. data/lib/active_record/result.rb +149 -15
  201. data/lib/active_record/runtime_registry.rb +24 -0
  202. data/lib/active_record/sanitization.rb +153 -133
  203. data/lib/active_record/schema.rb +22 -19
  204. data/lib/active_record/schema_dumper.rb +178 -112
  205. data/lib/active_record/schema_migration.rb +60 -0
  206. data/lib/active_record/scoping/default.rb +107 -98
  207. data/lib/active_record/scoping/named.rb +130 -115
  208. data/lib/active_record/scoping.rb +77 -123
  209. data/lib/active_record/secure_token.rb +40 -0
  210. data/lib/active_record/serialization.rb +10 -6
  211. data/lib/active_record/statement_cache.rb +148 -0
  212. data/lib/active_record/store.rb +256 -16
  213. data/lib/active_record/suppressor.rb +61 -0
  214. data/lib/active_record/table_metadata.rb +75 -0
  215. data/lib/active_record/tasks/database_tasks.rb +506 -0
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +115 -0
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +141 -0
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +77 -0
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +224 -0
  221. data/lib/active_record/timestamp.rb +93 -39
  222. data/lib/active_record/touch_later.rb +66 -0
  223. data/lib/active_record/transactions.rb +260 -129
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  226. data/lib/active_record/type/date.rb +9 -0
  227. data/lib/active_record/type/date_time.rb +9 -0
  228. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  229. data/lib/active_record/type/hash_lookup_type_map.rb +25 -0
  230. data/lib/active_record/type/internal/timezone.rb +17 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +71 -0
  233. data/lib/active_record/type/text.rb +11 -0
  234. data/lib/active_record/type/time.rb +21 -0
  235. data/lib/active_record/type/type_map.rb +62 -0
  236. data/lib/active_record/type/unsigned_integer.rb +17 -0
  237. data/lib/active_record/type.rb +78 -0
  238. data/lib/active_record/type_caster/connection.rb +34 -0
  239. data/lib/active_record/type_caster/map.rb +20 -0
  240. data/lib/active_record/type_caster.rb +9 -0
  241. data/lib/active_record/validations/absence.rb +25 -0
  242. data/lib/active_record/validations/associated.rb +35 -18
  243. data/lib/active_record/validations/length.rb +26 -0
  244. data/lib/active_record/validations/presence.rb +68 -0
  245. data/lib/active_record/validations/uniqueness.rb +123 -77
  246. data/lib/active_record/validations.rb +54 -43
  247. data/lib/active_record/version.rb +7 -7
  248. data/lib/active_record.rb +97 -49
  249. data/lib/arel/alias_predication.rb +9 -0
  250. data/lib/arel/attributes/attribute.rb +37 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/collectors/bind.rb +24 -0
  253. data/lib/arel/collectors/composite.rb +31 -0
  254. data/lib/arel/collectors/plain_string.rb +20 -0
  255. data/lib/arel/collectors/sql_string.rb +20 -0
  256. data/lib/arel/collectors/substitute_binds.rb +28 -0
  257. data/lib/arel/crud.rb +42 -0
  258. data/lib/arel/delete_manager.rb +18 -0
  259. data/lib/arel/errors.rb +9 -0
  260. data/lib/arel/expressions.rb +29 -0
  261. data/lib/arel/factory_methods.rb +49 -0
  262. data/lib/arel/insert_manager.rb +49 -0
  263. data/lib/arel/math.rb +45 -0
  264. data/lib/arel/nodes/and.rb +32 -0
  265. data/lib/arel/nodes/ascending.rb +23 -0
  266. data/lib/arel/nodes/binary.rb +52 -0
  267. data/lib/arel/nodes/bind_param.rb +36 -0
  268. data/lib/arel/nodes/case.rb +55 -0
  269. data/lib/arel/nodes/casted.rb +50 -0
  270. data/lib/arel/nodes/comment.rb +29 -0
  271. data/lib/arel/nodes/count.rb +12 -0
  272. data/lib/arel/nodes/delete_statement.rb +45 -0
  273. data/lib/arel/nodes/descending.rb +23 -0
  274. data/lib/arel/nodes/equality.rb +18 -0
  275. data/lib/arel/nodes/extract.rb +24 -0
  276. data/lib/arel/nodes/false.rb +16 -0
  277. data/lib/arel/nodes/full_outer_join.rb +8 -0
  278. data/lib/arel/nodes/function.rb +44 -0
  279. data/lib/arel/nodes/grouping.rb +8 -0
  280. data/lib/arel/nodes/in.rb +8 -0
  281. data/lib/arel/nodes/infix_operation.rb +80 -0
  282. data/lib/arel/nodes/inner_join.rb +8 -0
  283. data/lib/arel/nodes/insert_statement.rb +37 -0
  284. data/lib/arel/nodes/join_source.rb +20 -0
  285. data/lib/arel/nodes/matches.rb +18 -0
  286. data/lib/arel/nodes/named_function.rb +23 -0
  287. data/lib/arel/nodes/node.rb +50 -0
  288. data/lib/arel/nodes/node_expression.rb +13 -0
  289. data/lib/arel/nodes/outer_join.rb +8 -0
  290. data/lib/arel/nodes/over.rb +15 -0
  291. data/lib/arel/nodes/regexp.rb +16 -0
  292. data/lib/arel/nodes/right_outer_join.rb +8 -0
  293. data/lib/arel/nodes/select_core.rb +67 -0
  294. data/lib/arel/nodes/select_statement.rb +41 -0
  295. data/lib/arel/nodes/sql_literal.rb +16 -0
  296. data/lib/arel/nodes/string_join.rb +11 -0
  297. data/lib/arel/nodes/table_alias.rb +27 -0
  298. data/lib/arel/nodes/terminal.rb +16 -0
  299. data/lib/arel/nodes/true.rb +16 -0
  300. data/lib/arel/nodes/unary.rb +45 -0
  301. data/lib/arel/nodes/unary_operation.rb +20 -0
  302. data/lib/arel/nodes/unqualified_column.rb +22 -0
  303. data/lib/arel/nodes/update_statement.rb +41 -0
  304. data/lib/arel/nodes/values_list.rb +9 -0
  305. data/lib/arel/nodes/window.rb +126 -0
  306. data/lib/arel/nodes/with.rb +11 -0
  307. data/lib/arel/nodes.rb +68 -0
  308. data/lib/arel/order_predications.rb +13 -0
  309. data/lib/arel/predications.rb +257 -0
  310. data/lib/arel/select_manager.rb +271 -0
  311. data/lib/arel/table.rb +110 -0
  312. data/lib/arel/tree_manager.rb +72 -0
  313. data/lib/arel/update_manager.rb +34 -0
  314. data/lib/arel/visitors/depth_first.rb +204 -0
  315. data/lib/arel/visitors/dot.rb +297 -0
  316. data/lib/arel/visitors/ibm_db.rb +34 -0
  317. data/lib/arel/visitors/informix.rb +62 -0
  318. data/lib/arel/visitors/mssql.rb +157 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +159 -0
  321. data/lib/arel/visitors/oracle12.rb +66 -0
  322. data/lib/arel/visitors/postgresql.rb +110 -0
  323. data/lib/arel/visitors/sqlite.rb +39 -0
  324. data/lib/arel/visitors/to_sql.rb +889 -0
  325. data/lib/arel/visitors/visitor.rb +46 -0
  326. data/lib/arel/visitors/where_sql.rb +23 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +51 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  331. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +59 -9
  333. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  334. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  335. data/lib/rails/generators/active_record/migration.rb +41 -8
  336. data/lib/rails/generators/active_record/model/model_generator.rb +24 -22
  337. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +1 -1
  339. data/lib/rails/generators/active_record.rb +10 -16
  340. metadata +285 -149
  341. data/examples/associations.png +0 -0
  342. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -63
  343. data/lib/active_record/associations/join_helper.rb +0 -55
  344. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  345. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  346. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
  347. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  348. data/lib/active_record/associations/preloader/has_many_through.rb +0 -15
  349. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  350. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  351. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  352. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +0 -32
  353. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -188
  354. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -426
  355. data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -579
  356. data/lib/active_record/dynamic_finder_match.rb +0 -68
  357. data/lib/active_record/dynamic_scope_match.rb +0 -23
  358. data/lib/active_record/fixtures/file.rb +0 -65
  359. data/lib/active_record/identity_map.rb +0 -162
  360. data/lib/active_record/observer.rb +0 -121
  361. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  362. data/lib/active_record/serializers/xml_serializer.rb +0 -203
  363. data/lib/active_record/session_store.rb +0 -358
  364. data/lib/active_record/test_case.rb +0 -73
  365. data/lib/rails/generators/active_record/migration/templates/migration.rb +0 -34
  366. data/lib/rails/generators/active_record/model/templates/migration.rb +0 -15
  367. data/lib/rails/generators/active_record/model/templates/model.rb +0 -12
  368. data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
  369. data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -4
  370. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -25
  371. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -12
@@ -1,74 +1,52 @@
1
- require 'active_support/core_ext/object/blank'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecord
4
4
  # = Active Record Query Cache
5
5
  class QueryCache
6
6
  module ClassMethods
7
7
  # Enable the query cache within the block if Active Record is configured.
8
+ # If it's not, it will execute the given block.
8
9
  def cache(&block)
9
- if ActiveRecord::Base.configurations.blank?
10
- yield
11
- else
10
+ if connected? || !configurations.empty?
12
11
  connection.cache(&block)
12
+ else
13
+ yield
13
14
  end
14
15
  end
15
16
 
16
17
  # Disable the query cache within the block if Active Record is configured.
18
+ # If it's not, it will execute the given block.
17
19
  def uncached(&block)
18
- if ActiveRecord::Base.configurations.blank?
19
- yield
20
- else
20
+ if connected? || !configurations.empty?
21
21
  connection.uncached(&block)
22
+ else
23
+ yield
22
24
  end
23
25
  end
24
26
  end
25
27
 
26
- def initialize(app)
27
- @app = app
28
- end
29
-
30
- class BodyProxy # :nodoc:
31
- def initialize(original_cache_value, target, connection_id)
32
- @original_cache_value = original_cache_value
33
- @target = target
34
- @connection_id = connection_id
35
- end
28
+ def self.run
29
+ pools = []
36
30
 
37
- def method_missing(method_sym, *arguments, &block)
38
- @target.send(method_sym, *arguments, &block)
31
+ ActiveRecord::Base.connection_handlers.each do |key, handler|
32
+ pools << handler.connection_pool_list.reject { |p| p.query_cache_enabled }.each { |p| p.enable_query_cache! }
39
33
  end
40
34
 
41
- def respond_to?(method_sym, include_private = false)
42
- super || @target.respond_to?(method_sym)
43
- end
35
+ pools.flatten
36
+ end
44
37
 
45
- def each(&block)
46
- @target.each(&block)
47
- end
38
+ def self.complete(pools)
39
+ pools.each { |pool| pool.disable_query_cache! }
48
40
 
49
- def close
50
- @target.close if @target.respond_to?(:close)
51
- ensure
52
- ActiveRecord::Base.connection_id = @connection_id
53
- ActiveRecord::Base.connection.clear_query_cache
54
- unless @original_cache_value
55
- ActiveRecord::Base.connection.disable_query_cache!
41
+ ActiveRecord::Base.connection_handlers.each do |_, handler|
42
+ handler.connection_pool_list.each do |pool|
43
+ pool.release_connection if pool.active_connection? && !pool.connection.transaction_open?
56
44
  end
57
45
  end
58
46
  end
59
47
 
60
- def call(env)
61
- old = ActiveRecord::Base.connection.query_cache_enabled
62
- ActiveRecord::Base.connection.enable_query_cache!
63
-
64
- status, headers, body = @app.call(env)
65
- [status, headers, BodyProxy.new(old, body, ActiveRecord::Base.connection_id)]
66
- rescue Exception => e
67
- ActiveRecord::Base.connection.clear_query_cache
68
- unless old
69
- ActiveRecord::Base.connection.disable_query_cache!
70
- end
71
- raise e
48
+ def self.install_executor_hooks(executor = ActiveSupport::Executor)
49
+ executor.register_hook(self)
72
50
  end
73
51
  end
74
52
  end
@@ -1,58 +1,82 @@
1
- require 'active_support/core_ext/module/delegation'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecord
4
4
  module Querying
5
- delegate :find, :first, :first!, :last, :last!, :all, :exists?, :any?, :many?, :to => :scoped
6
- delegate :first_or_create, :first_or_create!, :first_or_initialize, :to => :scoped
7
- delegate :destroy, :destroy_all, :delete, :delete_all, :update, :update_all, :to => :scoped
8
- delegate :find_each, :find_in_batches, :to => :scoped
9
- delegate :select, :group, :order, :except, :reorder, :limit, :offset, :joins,
10
- :where, :preload, :eager_load, :includes, :from, :lock, :readonly,
11
- :having, :create_with, :uniq, :to => :scoped
12
- delegate :count, :average, :minimum, :maximum, :sum, :calculate, :pluck, :to => :scoped
5
+ QUERYING_METHODS = [
6
+ :find, :find_by, :find_by!, :take, :take!, :first, :first!, :last, :last!,
7
+ :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!,
8
+ :forty_two, :forty_two!, :third_to_last, :third_to_last!, :second_to_last, :second_to_last!,
9
+ :exists?, :any?, :many?, :none?, :one?,
10
+ :first_or_create, :first_or_create!, :first_or_initialize,
11
+ :find_or_create_by, :find_or_create_by!, :find_or_initialize_by,
12
+ :create_or_find_by, :create_or_find_by!,
13
+ :destroy_all, :delete_all, :update_all, :touch_all, :destroy_by, :delete_by,
14
+ :find_each, :find_in_batches, :in_batches,
15
+ :select, :reselect, :order, :reorder, :group, :limit, :offset, :joins, :left_joins, :left_outer_joins,
16
+ :where, :rewhere, :preload, :extract_associated, :eager_load, :includes, :from, :lock, :readonly, :extending, :or,
17
+ :having, :create_with, :distinct, :references, :none, :unscope, :optimizer_hints, :merge, :except, :only,
18
+ :count, :average, :minimum, :maximum, :sum, :calculate, :annotate,
19
+ :pluck, :pick, :ids
20
+ ].freeze # :nodoc:
21
+ delegate(*QUERYING_METHODS, to: :all)
13
22
 
14
23
  # Executes a custom SQL query against your database and returns all the results. The results will
15
- # be returned as an array with columns requested encapsulated as attributes of the model you call
16
- # this method from. If you call <tt>Product.find_by_sql</tt> then the results will be returned in
17
- # a Product object with the attributes you specified in the SQL query.
24
+ # be returned as an array, with the requested columns encapsulated as attributes of the model you call
25
+ # this method from. For example, if you call <tt>Product.find_by_sql</tt>, then the results will be returned in
26
+ # a +Product+ object with the attributes you specified in the SQL query.
18
27
  #
19
- # If you call a complicated SQL query which spans multiple tables the columns specified by the
28
+ # If you call a complicated SQL query which spans multiple tables, the columns specified by the
20
29
  # SELECT will be attributes of the model, whether or not they are columns of the corresponding
21
30
  # table.
22
31
  #
23
- # The +sql+ parameter is a full SQL query as a string. It will be called as is, there will be
24
- # no database agnostic conversions performed. This should be a last resort because using, for example,
25
- # MySQL specific terms will lock you to using that particular database engine or require you to
32
+ # The +sql+ parameter is a full SQL query as a string. It will be called as is; there will be
33
+ # no database agnostic conversions performed. This should be a last resort because using
34
+ # database-specific terms will lock you into using that particular database engine, or require you to
26
35
  # change your call if you switch engines.
27
36
  #
28
- # ==== Examples
29
37
  # # A simple SQL query spanning multiple tables
30
38
  # Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id"
31
- # > [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]
39
+ # # => [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]
40
+ #
41
+ # You can use the same string replacement techniques as you can with <tt>ActiveRecord::QueryMethods#where</tt>:
32
42
  #
33
- # # You can use the same string replacement techniques as you can with ActiveRecord#find
34
43
  # Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
35
- # > [#<Post:0x36bff9c @attributes={"title"=>"The Cheap Man Buys Twice"}>, ...]
36
- def find_by_sql(sql, binds = [])
37
- logging_query_plan do
38
- connection.select_all(sanitize_sql(sql), "#{name} Load", binds).collect! { |record| instantiate(record) }
44
+ # Post.find_by_sql ["SELECT body FROM comments WHERE author = :user_id OR approved_by = :user_id", { :user_id => user_id }]
45
+ def find_by_sql(sql, binds = [], preparable: nil, &block)
46
+ result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds, preparable: preparable)
47
+ column_types = result_set.column_types.dup
48
+ attribute_types.each_key { |k| column_types.delete k }
49
+ message_bus = ActiveSupport::Notifications.instrumenter
50
+
51
+ payload = {
52
+ record_count: result_set.length,
53
+ class_name: name
54
+ }
55
+
56
+ message_bus.instrument("instantiation.active_record", payload) do
57
+ if result_set.includes_column?(inheritance_column)
58
+ result_set.map { |record| instantiate(record, column_types, &block) }
59
+ else
60
+ # Instantiate a homogeneous set
61
+ result_set.map { |record| instantiate_instance_of(self, record, column_types, &block) }
62
+ end
39
63
  end
40
64
  end
41
65
 
42
66
  # Returns the result of an SQL statement that should only include a COUNT(*) in the SELECT part.
43
67
  # The use of this method should be restricted to complicated SQL queries that can't be executed
44
- # using the ActiveRecord::Calculations class methods. Look into those before using this.
45
- #
46
- # ==== Parameters
68
+ # using the ActiveRecord::Calculations class methods. Look into those before using this method,
69
+ # as it could lock you into a specific database engine or require a code change to switch
70
+ # database engines.
47
71
  #
48
- # * +sql+ - An SQL statement which should return a count query from the database, see the example below.
72
+ # Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
73
+ # # => 12
49
74
  #
50
- # ==== Examples
75
+ # ==== Parameters
51
76
  #
52
- # Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
77
+ # * +sql+ - An SQL statement which should return a count query from the database, see the example above.
53
78
  def count_by_sql(sql)
54
- sql = sanitize_conditions(sql)
55
- connection.select_value(sql, "#{name} Count").to_i
79
+ connection.select_value(sanitize_sql(sql), "#{name} Count").to_i
56
80
  end
57
81
  end
58
82
  end
@@ -1,35 +1,51 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_record"
2
4
  require "rails"
3
5
  require "active_model/railtie"
4
6
 
5
7
  # For now, action_controller must always be present with
6
- # rails, so let's make sure that it gets required before
8
+ # Rails, so let's make sure that it gets required before
7
9
  # here. This is needed for correctly setting up the middleware.
8
10
  # In the future, this might become an optional require.
9
11
  require "action_controller/railtie"
10
12
 
11
13
  module ActiveRecord
12
14
  # = Active Record Railtie
13
- class Railtie < Rails::Railtie
15
+ class Railtie < Rails::Railtie # :nodoc:
14
16
  config.active_record = ActiveSupport::OrderedOptions.new
15
17
 
16
- config.app_generators.orm :active_record, :migration => true,
17
- :timestamps => true
18
-
19
- config.app_middleware.insert_after "::ActionDispatch::Callbacks",
20
- "ActiveRecord::QueryCache"
21
-
22
- config.app_middleware.insert_after "::ActionDispatch::Callbacks",
23
- "ActiveRecord::ConnectionAdapters::ConnectionManagement"
18
+ config.app_generators.orm :active_record, migration: true,
19
+ timestamps: true
24
20
 
25
21
  config.action_dispatch.rescue_responses.merge!(
26
- 'ActiveRecord::RecordNotFound' => :not_found,
27
- 'ActiveRecord::StaleObjectError' => :conflict,
28
- 'ActiveRecord::RecordInvalid' => :unprocessable_entity,
29
- 'ActiveRecord::RecordNotSaved' => :unprocessable_entity
22
+ "ActiveRecord::RecordNotFound" => :not_found,
23
+ "ActiveRecord::StaleObjectError" => :conflict,
24
+ "ActiveRecord::RecordInvalid" => :unprocessable_entity,
25
+ "ActiveRecord::RecordNotSaved" => :unprocessable_entity
30
26
  )
31
27
 
28
+ config.active_record.use_schema_cache_dump = true
29
+ config.active_record.maintain_test_schema = true
30
+
31
+ config.active_record.sqlite3 = ActiveSupport::OrderedOptions.new
32
+ config.active_record.sqlite3.represent_boolean_as_integer = nil
33
+
34
+ config.eager_load_namespaces << ActiveRecord
35
+
32
36
  rake_tasks do
37
+ namespace :db do
38
+ task :load_config do
39
+ ActiveRecord::Tasks::DatabaseTasks.database_configuration = Rails.application.config.database_configuration
40
+
41
+ if defined?(ENGINE_ROOT) && engine = Rails::Engine.find(ENGINE_ROOT)
42
+ if engine.paths["db/migrate"].existent
43
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths["db/migrate"].to_a
44
+ end
45
+ end
46
+ end
47
+ end
48
+
33
49
  load "active_record/railties/databases.rake"
34
50
  end
35
51
 
@@ -38,7 +54,16 @@ module ActiveRecord
38
54
  # first time. Also, make it output to STDERR.
39
55
  console do |app|
40
56
  require "active_record/railties/console_sandbox" if app.sandbox?
41
- ActiveRecord::Base.logger = Logger.new(STDERR)
57
+ require "active_record/base"
58
+ unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDERR, STDOUT)
59
+ console = ActiveSupport::Logger.new(STDERR)
60
+ Rails.logger.extend ActiveSupport::Logger.broadcast console
61
+ end
62
+ ActiveRecord::Base.verbose_query_logs = false
63
+ end
64
+
65
+ runner do
66
+ require "active_record/base"
42
67
  end
43
68
 
44
69
  initializer "active_record.initialize_timezone" do
@@ -52,17 +77,116 @@ module ActiveRecord
52
77
  ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger }
53
78
  end
54
79
 
55
- initializer "active_record.identity_map" do |app|
56
- config.app_middleware.insert_after "::ActionDispatch::Callbacks",
57
- "ActiveRecord::IdentityMap::Middleware" if config.active_record.delete(:identity_map)
80
+ initializer "active_record.backtrace_cleaner" do
81
+ ActiveSupport.on_load(:active_record) { LogSubscriber.backtrace_cleaner = ::Rails.backtrace_cleaner }
82
+ end
83
+
84
+ initializer "active_record.migration_error" do
85
+ if config.active_record.delete(:migration_error) == :page_load
86
+ 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
96
+ end
97
+ end
98
+
99
+ initializer "Check for cache versioning support" do
100
+ config.after_initialize do |app|
101
+ ActiveSupport.on_load(:active_record) do
102
+ if app.config.active_record.cache_versioning && Rails.cache
103
+ unless Rails.cache.class.try(:supports_cache_versioning?)
104
+ raise <<-end_error
105
+
106
+ You're using a cache store that doesn't support native cache versioning.
107
+ Your best option is to upgrade to a newer version of #{Rails.cache.class}
108
+ that supports cache versioning (#{Rails.cache.class}.supports_cache_versioning? #=> true).
109
+
110
+ Next best, switch to a different cache store that does support cache versioning:
111
+ https://guides.rubyonrails.org/caching_with_rails.html#cache-stores.
112
+
113
+ To keep using the current cache store, you can turn off cache versioning entirely:
114
+
115
+ config.active_record.cache_versioning = false
116
+
117
+ end_error
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+
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")
129
+
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
145
+ end
146
+
147
+ initializer "active_record.define_attribute_methods" do |app|
148
+ config.after_initialize do
149
+ 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
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ initializer "active_record.warn_on_records_fetched_greater_than" do
168
+ if config.active_record.warn_on_records_fetched_greater_than
169
+ ActiveSupport.on_load(:active_record) do
170
+ require "active_record/relation/record_fetch_warning"
171
+ end
172
+ end
58
173
  end
59
174
 
60
175
  initializer "active_record.set_configs" do |app|
61
176
  ActiveSupport.on_load(:active_record) do
62
- if app.config.active_record.delete(:whitelist_attributes)
63
- attr_accessible(nil)
177
+ configs = app.config.active_record
178
+
179
+ represent_boolean_as_integer = configs.sqlite3.delete(:represent_boolean_as_integer)
180
+
181
+ unless represent_boolean_as_integer.nil?
182
+ ActiveSupport.on_load(:active_record_sqlite3adapter) do
183
+ ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer = represent_boolean_as_integer
184
+ end
64
185
  end
65
- app.config.active_record.each do |k,v|
186
+
187
+ configs.delete(:sqlite3)
188
+
189
+ configs.each do |k, v|
66
190
  send "#{k}=", v
67
191
  end
68
192
  end
@@ -70,56 +194,70 @@ module ActiveRecord
70
194
 
71
195
  # This sets the database configuration from Configuration#database_configuration
72
196
  # and then establishes the connection.
73
- initializer "active_record.initialize_database" do |app|
197
+ initializer "active_record.initialize_database" do
74
198
  ActiveSupport.on_load(:active_record) do
75
- db_connection_type = "DATABASE_URL"
76
- unless ENV['DATABASE_URL']
77
- db_connection_type = "database.yml"
78
- self.configurations = app.config.database_configuration
79
- end
80
- Rails.logger.info "Connecting to database specified by #{db_connection_type}"
81
-
199
+ self.connection_handlers = { writing_role => ActiveRecord::Base.default_connection_handler }
200
+ self.configurations = Rails.application.config.database_configuration
82
201
  establish_connection
83
202
  end
84
203
  end
85
204
 
86
205
  # Expose database runtime to controller for logging.
87
- initializer "active_record.log_runtime" do |app|
206
+ initializer "active_record.log_runtime" do
88
207
  require "active_record/railties/controller_runtime"
89
208
  ActiveSupport.on_load(:action_controller) do
90
209
  include ActiveRecord::Railties::ControllerRuntime
91
210
  end
92
211
  end
93
212
 
94
- initializer "active_record.set_reloader_hooks" do |app|
95
- hook = lambda do
96
- ActiveRecord::Base.clear_reloadable_connections!
97
- ActiveRecord::Base.clear_cache!
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)
98
217
  end
218
+ end
99
219
 
100
- if app.config.reload_classes_only_on_change
101
- ActiveSupport.on_load(:active_record) do
102
- ActionDispatch::Reloader.to_prepare(&hook)
103
- end
104
- else
105
- ActiveSupport.on_load(:active_record) do
106
- ActionDispatch::Reloader.to_cleanup(&hook)
220
+ initializer "active_record.set_reloader_hooks" do
221
+ ActiveSupport.on_load(:active_record) do
222
+ ActiveSupport::Reloader.before_class_unload do
223
+ if ActiveRecord::Base.connected?
224
+ ActiveRecord::Base.clear_cache!
225
+ ActiveRecord::Base.clear_reloadable_connections!
226
+ end
107
227
  end
108
228
  end
109
229
  end
110
230
 
231
+ initializer "active_record.set_executor_hooks" do
232
+ ActiveRecord::QueryCache.install_executor_hooks
233
+ end
234
+
111
235
  initializer "active_record.add_watchable_files" do |app|
112
- config.watchable_files.concat ["#{app.root}/db/schema.rb", "#{app.root}/db/structure.sql"]
236
+ path = app.paths["db"].first
237
+ config.watchable_files.concat ["#{path}/schema.rb", "#{path}/structure.sql"]
113
238
  end
114
239
 
115
- config.after_initialize do
116
- ActiveSupport.on_load(:active_record) do
117
- instantiate_observers
240
+ initializer "active_record.clear_active_connections" do
241
+ config.after_initialize do
242
+ ActiveSupport.on_load(:active_record) do
243
+ # Ideally the application doesn't connect to the database during boot,
244
+ # but sometimes it does. In case it did, we want to empty out the
245
+ # connection pools so that a non-database-using process (e.g. a master
246
+ # process in a forking server model) doesn't retain a needless
247
+ # connection. If it was needed, the incremental cost of reestablishing
248
+ # this connection is trivial: the rest of the pool would need to be
249
+ # populated anyway.
118
250
 
119
- ActionDispatch::Reloader.to_prepare do
120
- ActiveRecord::Base.instantiate_observers
251
+ clear_active_connections!
252
+ flush_idle_connections!
121
253
  end
122
254
  end
123
255
  end
256
+
257
+ initializer "active_record.set_filter_attributes" do
258
+ ActiveSupport.on_load(:active_record) do
259
+ self.filter_attributes += Rails.application.config.filter_parameters
260
+ end
261
+ end
124
262
  end
125
263
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module Railties # :nodoc:
5
+ module CollectionCacheAssociationLoading #:nodoc:
6
+ def setup(context, options, as, block)
7
+ @relation = relation_from_options(options)
8
+
9
+ super
10
+ end
11
+
12
+ def relation_from_options(cached: nil, partial: nil, collection: nil, **_)
13
+ return unless cached
14
+
15
+ relation = partial if partial.is_a?(ActiveRecord::Relation)
16
+ relation ||= collection if collection.is_a?(ActiveRecord::Relation)
17
+
18
+ if relation && !relation.loaded?
19
+ relation.skip_preloading!
20
+ end
21
+ end
22
+
23
+ def collection_without_template(*)
24
+ @relation.preload_associations(@collection) if @relation
25
+ super
26
+ end
27
+
28
+ def collection_with_template(*)
29
+ @relation.preload_associations(@collection) if @relation
30
+ super
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,6 +1,7 @@
1
- ActiveRecord::Base.connection.increment_open_transactions
2
- ActiveRecord::Base.connection.begin_db_transaction
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Base.connection.begin_transaction(joinable: false)
4
+
3
5
  at_exit do
4
- ActiveRecord::Base.connection.rollback_db_transaction
5
- ActiveRecord::Base.connection.decrement_open_transactions
6
+ ActiveRecord::Base.connection.rollback_transaction
6
7
  end
@@ -1,49 +1,51 @@
1
- require 'active_support/core_ext/module/attr_internal'
2
- require 'active_record/log_subscriber'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/module/attr_internal"
4
+ require "active_record/log_subscriber"
3
5
 
4
6
  module ActiveRecord
5
- module Railties
7
+ module Railties # :nodoc:
6
8
  module ControllerRuntime #:nodoc:
7
9
  extend ActiveSupport::Concern
8
10
 
9
- protected
10
-
11
- attr_internal :db_runtime
12
-
13
- def process_action(action, *args)
14
- # We also need to reset the runtime before each action
15
- # because of queries in middleware or in cases we are streaming
16
- # and it won't be cleaned up by the method below.
17
- ActiveRecord::LogSubscriber.reset_runtime
18
- super
11
+ module ClassMethods # :nodoc:
12
+ def log_process_action(payload)
13
+ messages, db_runtime = super, payload[:db_runtime]
14
+ messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
15
+ messages
16
+ end
19
17
  end
20
18
 
21
- def cleanup_view_runtime
22
- if ActiveRecord::Base.connected?
23
- db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
24
- runtime = super
25
- db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
26
- self.db_runtime = db_rt_before_render + db_rt_after_render
27
- runtime - db_rt_after_render
28
- else
19
+ private
20
+ attr_internal :db_runtime
21
+
22
+ def process_action(action, *args)
23
+ # We also need to reset the runtime before each action
24
+ # because of queries in middleware or in cases we are streaming
25
+ # and it won't be cleaned up by the method below.
26
+ ActiveRecord::LogSubscriber.reset_runtime
29
27
  super
30
28
  end
31
- end
32
29
 
33
- def append_info_to_payload(payload)
34
- super
35
- if ActiveRecord::Base.connected?
36
- payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::LogSubscriber.reset_runtime
30
+ def cleanup_view_runtime
31
+ if logger && logger.info? && ActiveRecord::Base.connected?
32
+ db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
33
+ self.db_runtime = (db_runtime || 0) + db_rt_before_render
34
+ runtime = super
35
+ db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
36
+ self.db_runtime += db_rt_after_render
37
+ runtime - db_rt_after_render
38
+ else
39
+ super
40
+ end
37
41
  end
38
- end
39
42
 
40
- module ClassMethods
41
- def log_process_action(payload)
42
- messages, db_runtime = super, payload[:db_runtime]
43
- messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
44
- messages
43
+ def append_info_to_payload(payload)
44
+ super
45
+ if ActiveRecord::Base.connected?
46
+ payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::LogSubscriber.reset_runtime
47
+ end
45
48
  end
46
- end
47
49
  end
48
50
  end
49
51
  end