activerecord 4.2.11.1 → 6.0.3.5

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 (373) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +721 -1522
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +14 -13
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +266 -251
  9. data/lib/active_record/association_relation.rb +20 -13
  10. data/lib/active_record/associations/alias_tracker.rb +29 -36
  11. data/lib/active_record/associations/association.rb +128 -57
  12. data/lib/active_record/associations/association_scope.rb +103 -132
  13. data/lib/active_record/associations/belongs_to_association.rb +65 -60
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +27 -40
  16. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  17. data/lib/active_record/associations/builder/collection_association.rb +10 -33
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +50 -66
  19. data/lib/active_record/associations/builder/has_many.rb +8 -4
  20. data/lib/active_record/associations/builder/has_one.rb +46 -5
  21. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  22. data/lib/active_record/associations/collection_association.rb +136 -288
  23. data/lib/active_record/associations/collection_proxy.rb +241 -147
  24. data/lib/active_record/associations/foreign_association.rb +10 -1
  25. data/lib/active_record/associations/has_many_association.rb +34 -98
  26. data/lib/active_record/associations/has_many_through_association.rb +60 -87
  27. data/lib/active_record/associations/has_one_association.rb +61 -49
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +38 -86
  30. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  31. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  32. data/lib/active_record/associations/join_dependency.rb +149 -166
  33. data/lib/active_record/associations/preloader/association.rb +90 -123
  34. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  35. data/lib/active_record/associations/preloader.rb +90 -93
  36. data/lib/active_record/associations/singular_association.rb +18 -39
  37. data/lib/active_record/associations/through_association.rb +38 -18
  38. data/lib/active_record/associations.rb +1737 -1597
  39. data/lib/active_record/attribute_assignment.rb +57 -185
  40. data/lib/active_record/attribute_decorators.rb +39 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +174 -144
  43. data/lib/active_record/attribute_methods/primary_key.rb +90 -84
  44. data/lib/active_record/attribute_methods/query.rb +6 -5
  45. data/lib/active_record/attribute_methods/read.rb +20 -77
  46. data/lib/active_record/attribute_methods/serialization.rb +40 -21
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +57 -37
  48. data/lib/active_record/attribute_methods/write.rb +32 -55
  49. data/lib/active_record/attribute_methods.rb +120 -135
  50. data/lib/active_record/attributes.rb +213 -82
  51. data/lib/active_record/autosave_association.rb +97 -41
  52. data/lib/active_record/base.rb +57 -45
  53. data/lib/active_record/callbacks.rb +101 -76
  54. data/lib/active_record/coders/json.rb +3 -1
  55. data/lib/active_record/coders/yaml_column.rb +23 -12
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +804 -297
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +240 -115
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +371 -242
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +694 -256
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -83
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +473 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +507 -639
  69. data/lib/active_record/connection_adapters/column.rb +56 -43
  70. data/lib/active_record/connection_adapters/connection_specification.rb +174 -153
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +196 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +71 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +58 -181
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -114
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -58
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +4 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -22
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -20
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  99. data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +51 -34
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -5
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +462 -296
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +558 -356
  117. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +299 -349
  127. data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
  128. data/lib/active_record/connection_handling.rb +167 -41
  129. data/lib/active_record/core.rb +252 -230
  130. data/lib/active_record/counter_cache.rb +70 -49
  131. data/lib/active_record/database_configurations/database_config.rb +37 -0
  132. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  133. data/lib/active_record/database_configurations/url_config.rb +78 -0
  134. data/lib/active_record/database_configurations.rb +233 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -106
  137. data/lib/active_record/enum.rb +163 -86
  138. data/lib/active_record/errors.rb +188 -53
  139. data/lib/active_record/explain.rb +22 -11
  140. data/lib/active_record/explain_registry.rb +4 -2
  141. data/lib/active_record/explain_subscriber.rb +10 -5
  142. data/lib/active_record/fixture_set/file.rb +35 -9
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +152 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  147. data/lib/active_record/fixtures.rb +227 -501
  148. data/lib/active_record/gem_version.rb +6 -4
  149. data/lib/active_record/inheritance.rb +158 -115
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +123 -29
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +21 -3
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +86 -96
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +76 -33
  158. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  160. data/lib/active_record/middleware/database_selector.rb +74 -0
  161. data/lib/active_record/migration/command_recorder.rb +166 -91
  162. data/lib/active_record/migration/compatibility.rb +244 -0
  163. data/lib/active_record/migration/join_table.rb +8 -7
  164. data/lib/active_record/migration.rb +623 -305
  165. data/lib/active_record/model_schema.rb +313 -112
  166. data/lib/active_record/nested_attributes.rb +263 -223
  167. data/lib/active_record/no_touching.rb +15 -2
  168. data/lib/active_record/null_relation.rb +24 -38
  169. data/lib/active_record/persistence.rb +557 -126
  170. data/lib/active_record/query_cache.rb +19 -23
  171. data/lib/active_record/querying.rb +44 -30
  172. data/lib/active_record/railtie.rb +143 -44
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +2 -0
  175. data/lib/active_record/railties/controller_runtime.rb +34 -33
  176. data/lib/active_record/railties/databases.rake +331 -185
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +430 -281
  179. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  180. data/lib/active_record/relation/batches.rb +206 -55
  181. data/lib/active_record/relation/calculations.rb +268 -254
  182. data/lib/active_record/relation/delegation.rb +75 -84
  183. data/lib/active_record/relation/finder_methods.rb +285 -241
  184. data/lib/active_record/relation/from_clause.rb +30 -0
  185. data/lib/active_record/relation/merger.rb +78 -88
  186. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
  187. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  188. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  189. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  190. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  191. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  192. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  193. data/lib/active_record/relation/predicate_builder.rb +110 -119
  194. data/lib/active_record/relation/query_attribute.rb +50 -0
  195. data/lib/active_record/relation/query_methods.rb +603 -397
  196. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  197. data/lib/active_record/relation/spawn_methods.rb +11 -14
  198. data/lib/active_record/relation/where_clause.rb +189 -0
  199. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  200. data/lib/active_record/relation.rb +530 -341
  201. data/lib/active_record/result.rb +79 -43
  202. data/lib/active_record/runtime_registry.rb +6 -4
  203. data/lib/active_record/sanitization.rb +144 -121
  204. data/lib/active_record/schema.rb +21 -24
  205. data/lib/active_record/schema_dumper.rb +112 -93
  206. data/lib/active_record/schema_migration.rb +24 -17
  207. data/lib/active_record/scoping/default.rb +98 -83
  208. data/lib/active_record/scoping/named.rb +86 -33
  209. data/lib/active_record/scoping.rb +45 -27
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +5 -5
  212. data/lib/active_record/statement_cache.rb +73 -36
  213. data/lib/active_record/store.rb +127 -42
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +90 -0
  216. data/lib/active_record/tasks/database_tasks.rb +307 -100
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +55 -100
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +80 -41
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +37 -16
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +225 -0
  222. data/lib/active_record/timestamp.rb +86 -41
  223. data/lib/active_record/touch_later.rb +65 -0
  224. data/lib/active_record/transactions.rb +223 -157
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type/adapter_specific_registry.rb +126 -0
  227. data/lib/active_record/type/date.rb +4 -45
  228. data/lib/active_record/type/date_time.rb +4 -49
  229. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  230. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  231. data/lib/active_record/type/internal/timezone.rb +17 -0
  232. data/lib/active_record/type/json.rb +30 -0
  233. data/lib/active_record/type/serialized.rb +23 -15
  234. data/lib/active_record/type/text.rb +2 -2
  235. data/lib/active_record/type/time.rb +11 -16
  236. data/lib/active_record/type/type_map.rb +16 -19
  237. data/lib/active_record/type/unsigned_integer.rb +9 -8
  238. data/lib/active_record/type.rb +77 -23
  239. data/lib/active_record/type_caster/connection.rb +34 -0
  240. data/lib/active_record/type_caster/map.rb +20 -0
  241. data/lib/active_record/type_caster.rb +9 -0
  242. data/lib/active_record/validations/absence.rb +25 -0
  243. data/lib/active_record/validations/associated.rb +12 -4
  244. data/lib/active_record/validations/length.rb +26 -0
  245. data/lib/active_record/validations/presence.rb +14 -13
  246. data/lib/active_record/validations/uniqueness.rb +42 -55
  247. data/lib/active_record/validations.rb +38 -35
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/active_record.rb +42 -22
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes/attribute.rb +37 -0
  252. data/lib/arel/attributes.rb +22 -0
  253. data/lib/arel/collectors/bind.rb +24 -0
  254. data/lib/arel/collectors/composite.rb +31 -0
  255. data/lib/arel/collectors/plain_string.rb +20 -0
  256. data/lib/arel/collectors/sql_string.rb +20 -0
  257. data/lib/arel/collectors/substitute_binds.rb +28 -0
  258. data/lib/arel/crud.rb +42 -0
  259. data/lib/arel/delete_manager.rb +18 -0
  260. data/lib/arel/errors.rb +9 -0
  261. data/lib/arel/expressions.rb +29 -0
  262. data/lib/arel/factory_methods.rb +49 -0
  263. data/lib/arel/insert_manager.rb +49 -0
  264. data/lib/arel/math.rb +45 -0
  265. data/lib/arel/nodes/and.rb +32 -0
  266. data/lib/arel/nodes/ascending.rb +23 -0
  267. data/lib/arel/nodes/binary.rb +52 -0
  268. data/lib/arel/nodes/bind_param.rb +36 -0
  269. data/lib/arel/nodes/case.rb +55 -0
  270. data/lib/arel/nodes/casted.rb +50 -0
  271. data/lib/arel/nodes/comment.rb +29 -0
  272. data/lib/arel/nodes/count.rb +12 -0
  273. data/lib/arel/nodes/delete_statement.rb +45 -0
  274. data/lib/arel/nodes/descending.rb +23 -0
  275. data/lib/arel/nodes/equality.rb +18 -0
  276. data/lib/arel/nodes/extract.rb +24 -0
  277. data/lib/arel/nodes/false.rb +16 -0
  278. data/lib/arel/nodes/full_outer_join.rb +8 -0
  279. data/lib/arel/nodes/function.rb +44 -0
  280. data/lib/arel/nodes/grouping.rb +8 -0
  281. data/lib/arel/nodes/in.rb +8 -0
  282. data/lib/arel/nodes/infix_operation.rb +80 -0
  283. data/lib/arel/nodes/inner_join.rb +8 -0
  284. data/lib/arel/nodes/insert_statement.rb +37 -0
  285. data/lib/arel/nodes/join_source.rb +20 -0
  286. data/lib/arel/nodes/matches.rb +18 -0
  287. data/lib/arel/nodes/named_function.rb +23 -0
  288. data/lib/arel/nodes/node.rb +50 -0
  289. data/lib/arel/nodes/node_expression.rb +13 -0
  290. data/lib/arel/nodes/outer_join.rb +8 -0
  291. data/lib/arel/nodes/over.rb +15 -0
  292. data/lib/arel/nodes/regexp.rb +16 -0
  293. data/lib/arel/nodes/right_outer_join.rb +8 -0
  294. data/lib/arel/nodes/select_core.rb +67 -0
  295. data/lib/arel/nodes/select_statement.rb +41 -0
  296. data/lib/arel/nodes/sql_literal.rb +16 -0
  297. data/lib/arel/nodes/string_join.rb +11 -0
  298. data/lib/arel/nodes/table_alias.rb +27 -0
  299. data/lib/arel/nodes/terminal.rb +16 -0
  300. data/lib/arel/nodes/true.rb +16 -0
  301. data/lib/arel/nodes/unary.rb +45 -0
  302. data/lib/arel/nodes/unary_operation.rb +20 -0
  303. data/lib/arel/nodes/unqualified_column.rb +22 -0
  304. data/lib/arel/nodes/update_statement.rb +41 -0
  305. data/lib/arel/nodes/values_list.rb +9 -0
  306. data/lib/arel/nodes/window.rb +126 -0
  307. data/lib/arel/nodes/with.rb +11 -0
  308. data/lib/arel/nodes.rb +68 -0
  309. data/lib/arel/order_predications.rb +13 -0
  310. data/lib/arel/predications.rb +256 -0
  311. data/lib/arel/select_manager.rb +271 -0
  312. data/lib/arel/table.rb +110 -0
  313. data/lib/arel/tree_manager.rb +72 -0
  314. data/lib/arel/update_manager.rb +34 -0
  315. data/lib/arel/visitors/depth_first.rb +203 -0
  316. data/lib/arel/visitors/dot.rb +296 -0
  317. data/lib/arel/visitors/ibm_db.rb +34 -0
  318. data/lib/arel/visitors/informix.rb +62 -0
  319. data/lib/arel/visitors/mssql.rb +156 -0
  320. data/lib/arel/visitors/mysql.rb +83 -0
  321. data/lib/arel/visitors/oracle.rb +158 -0
  322. data/lib/arel/visitors/oracle12.rb +65 -0
  323. data/lib/arel/visitors/postgresql.rb +109 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +888 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/visitors/where_sql.rb +22 -0
  328. data/lib/arel/visitors.rb +20 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/arel.rb +62 -0
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
  334. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  335. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -2
  336. data/lib/rails/generators/active_record/migration.rb +30 -1
  337. data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  340. data/lib/rails/generators/active_record.rb +7 -5
  341. metadata +168 -59
  342. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  343. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  344. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  345. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  346. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  347. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  348. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  349. data/lib/active_record/attribute.rb +0 -163
  350. data/lib/active_record/attribute_set/builder.rb +0 -106
  351. data/lib/active_record/attribute_set.rb +0 -81
  352. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
  353. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  354. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  355. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  356. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  357. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  358. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  359. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  360. data/lib/active_record/type/big_integer.rb +0 -13
  361. data/lib/active_record/type/binary.rb +0 -50
  362. data/lib/active_record/type/boolean.rb +0 -31
  363. data/lib/active_record/type/decimal.rb +0 -64
  364. data/lib/active_record/type/decorator.rb +0 -14
  365. data/lib/active_record/type/float.rb +0 -19
  366. data/lib/active_record/type/integer.rb +0 -59
  367. data/lib/active_record/type/mutable.rb +0 -16
  368. data/lib/active_record/type/numeric.rb +0 -36
  369. data/lib/active_record/type/string.rb +0 -40
  370. data/lib/active_record/type/time_value.rb +0 -38
  371. data/lib/active_record/type/value.rb +0 -110
  372. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  373. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  # = Active Record Query Cache
3
5
  class QueryCache
@@ -5,7 +7,7 @@ module ActiveRecord
5
7
  # Enable the query cache within the block if Active Record is configured.
6
8
  # If it's not, it will execute the given block.
7
9
  def cache(&block)
8
- if ActiveRecord::Base.connected?
10
+ if connected? || !configurations.empty?
9
11
  connection.cache(&block)
10
12
  else
11
13
  yield
@@ -15,7 +17,7 @@ module ActiveRecord
15
17
  # Disable the query cache within the block if Active Record is configured.
16
18
  # If it's not, it will execute the given block.
17
19
  def uncached(&block)
18
- if ActiveRecord::Base.connected?
20
+ if connected? || !configurations.empty?
19
21
  connection.uncached(&block)
20
22
  else
21
23
  yield
@@ -23,34 +25,28 @@ module ActiveRecord
23
25
  end
24
26
  end
25
27
 
26
- def initialize(app)
27
- @app = app
28
- end
29
-
30
- def call(env)
31
- connection = ActiveRecord::Base.connection
32
- enabled = connection.query_cache_enabled
33
- connection_id = ActiveRecord::Base.connection_id
34
- connection.enable_query_cache!
28
+ def self.run
29
+ pools = []
35
30
 
36
- response = @app.call(env)
37
- response[2] = Rack::BodyProxy.new(response[2]) do
38
- restore_query_cache_settings(connection_id, enabled)
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
- response
42
- rescue Exception => e
43
- restore_query_cache_settings(connection_id, enabled)
44
- raise e
35
+ pools.flatten
45
36
  end
46
37
 
47
- private
38
+ def self.complete(pools)
39
+ pools.each { |pool| pool.disable_query_cache! }
48
40
 
49
- def restore_query_cache_settings(connection_id, enabled)
50
- ActiveRecord::Base.connection_id = connection_id
51
- ActiveRecord::Base.connection.clear_query_cache
52
- ActiveRecord::Base.connection.disable_query_cache! unless enabled
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?
44
+ end
45
+ end
53
46
  end
54
47
 
48
+ def self.install_executor_hooks(executor = ActiveSupport::Executor)
49
+ executor.register_hook(self)
50
+ end
55
51
  end
56
52
  end
@@ -1,44 +1,51 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Querying
3
- delegate :find, :take, :take!, :first, :first!, :last, :last!, :exists?, :any?, :many?, to: :all
4
- delegate :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!, :forty_two, :forty_two!, to: :all
5
- delegate :first_or_create, :first_or_create!, :first_or_initialize, to: :all
6
- delegate :find_or_create_by, :find_or_create_by!, :find_or_initialize_by, to: :all
7
- delegate :find_by, :find_by!, to: :all
8
- delegate :destroy, :destroy_all, :delete, :delete_all, :update, :update_all, to: :all
9
- delegate :find_each, :find_in_batches, to: :all
10
- delegate :select, :group, :order, :except, :reorder, :limit, :offset, :joins,
11
- :where, :rewhere, :preload, :eager_load, :includes, :from, :lock, :readonly,
12
- :having, :create_with, :uniq, :distinct, :references, :none, :unscope, to: :all
13
- delegate :count, :average, :minimum, :maximum, :sum, :calculate, to: :all
14
- delegate :pluck, :ids, to: :all
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)
15
22
 
16
23
  # Executes a custom SQL query against your database and returns all the results. The results will
17
- # be returned as an array with columns requested encapsulated as attributes of the model you call
18
- # this method from. If you call <tt>Product.find_by_sql</tt> then the results will be returned in
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
19
26
  # a +Product+ object with the attributes you specified in the SQL query.
20
27
  #
21
- # 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
22
29
  # SELECT will be attributes of the model, whether or not they are columns of the corresponding
23
30
  # table.
24
31
  #
25
- # The +sql+ parameter is a full SQL query as a string. It will be called as is, there will be
26
- # no database agnostic conversions performed. This should be a last resort because using, for example,
27
- # 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
28
35
  # change your call if you switch engines.
29
36
  #
30
37
  # # A simple SQL query spanning multiple tables
31
38
  # Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id"
32
- # # => [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]
39
+ # # => [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "author"=>"Quentin"}>, ...]
33
40
  #
34
41
  # You can use the same string replacement techniques as you can with <tt>ActiveRecord::QueryMethods#where</tt>:
35
42
  #
36
43
  # Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
37
44
  # Post.find_by_sql ["SELECT body FROM comments WHERE author = :user_id OR approved_by = :user_id", { :user_id => user_id }]
38
- def find_by_sql(sql, binds = [])
39
- result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds)
45
+ def find_by_sql(sql, binds = [], preparable: nil, &block)
46
+ result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds, preparable: preparable)
40
47
  column_types = result_set.column_types.dup
41
- columns_hash.each_key { |k| column_types.delete k }
48
+ attribute_types.each_key { |k| column_types.delete k }
42
49
  message_bus = ActiveSupport::Notifications.instrumenter
43
50
 
44
51
  payload = {
@@ -46,23 +53,30 @@ module ActiveRecord
46
53
  class_name: name
47
54
  }
48
55
 
49
- message_bus.instrument('instantiation.active_record', payload) do
50
- result_set.map { |record| instantiate(record, column_types) }
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
51
63
  end
52
64
  end
53
65
 
54
66
  # Returns the result of an SQL statement that should only include a COUNT(*) in the SELECT part.
55
67
  # The use of this method should be restricted to complicated SQL queries that can't be executed
56
- # using the ActiveRecord::Calculations class methods. Look into those before using this.
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.
57
71
  #
58
- # ==== Parameters
72
+ # Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
73
+ # # => 12
59
74
  #
60
- # * +sql+ - An SQL statement which should return a count query from the database, see the example below.
75
+ # ==== Parameters
61
76
  #
62
- # 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.
63
78
  def count_by_sql(sql)
64
- sql = sanitize_conditions(sql)
65
- connection.select_value(sql, "#{name} Count").to_i
79
+ connection.select_value(sanitize_sql(sql), "#{name} Count").to_i
66
80
  end
67
81
  end
68
82
  end
@@ -1,9 +1,11 @@
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"
@@ -13,26 +15,22 @@ module ActiveRecord
13
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
 
32
-
33
28
  config.active_record.use_schema_cache_dump = true
34
29
  config.active_record.maintain_test_schema = true
35
30
 
31
+ config.active_record.sqlite3 = ActiveSupport::OrderedOptions.new
32
+ config.active_record.sqlite3.represent_boolean_as_integer = nil
33
+
36
34
  config.eager_load_namespaces << ActiveRecord
37
35
 
38
36
  rake_tasks do
@@ -40,9 +38,9 @@ module ActiveRecord
40
38
  task :load_config do
41
39
  ActiveRecord::Tasks::DatabaseTasks.database_configuration = Rails.application.config.database_configuration
42
40
 
43
- if defined?(ENGINE_PATH) && engine = Rails::Engine.find(ENGINE_PATH)
44
- if engine.paths['db/migrate'].existent
45
- ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths['db/migrate'].to_a
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
46
44
  end
47
45
  end
48
46
  end
@@ -61,6 +59,7 @@ module ActiveRecord
61
59
  console = ActiveSupport::Logger.new(STDERR)
62
60
  Rails.logger.extend ActiveSupport::Logger.broadcast console
63
61
  end
62
+ ActiveRecord::Base.verbose_query_logs = false
64
63
  end
65
64
 
66
65
  runner do
@@ -78,10 +77,47 @@ module ActiveRecord
78
77
  ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger }
79
78
  end
80
79
 
80
+ initializer "active_record.backtrace_cleaner" do
81
+ ActiveSupport.on_load(:active_record) { LogSubscriber.backtrace_cleaner = ::Rails.backtrace_cleaner }
82
+ end
83
+
81
84
  initializer "active_record.migration_error" do
82
85
  if config.active_record.delete(:migration_error) == :page_load
83
- config.app_middleware.insert_after "::ActionDispatch::Callbacks",
84
- "ActiveRecord::Migration::CheckPending"
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
85
121
  end
86
122
  end
87
123
 
@@ -89,14 +125,18 @@ module ActiveRecord
89
125
  if config.active_record.delete(:use_schema_cache_dump)
90
126
  config.after_initialize do |app|
91
127
  ActiveSupport.on_load(:active_record) do
92
- filename = File.join(app.config.paths["db"].first, "schema_cache.dump")
128
+ filename = File.join(app.config.paths["db"].first, "schema_cache.yml")
93
129
 
94
130
  if File.file?(filename)
95
- cache = Marshal.load File.binread filename
96
- if cache.version == ActiveRecord::Migrator.current_version
97
- self.connection.schema_cache = cache
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
98
138
  else
99
- warn "Ignoring db/schema_cache.dump because it has expired. The current schema version is #{ActiveRecord::Migrator.current_version}, but the one in the cache is #{cache.version}."
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}."
100
140
  end
101
141
  end
102
142
  end
@@ -104,9 +144,49 @@ module ActiveRecord
104
144
  end
105
145
  end
106
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
173
+ end
174
+
107
175
  initializer "active_record.set_configs" do |app|
108
176
  ActiveSupport.on_load(:active_record) do
109
- app.config.active_record.each do |k,v|
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
185
+ end
186
+
187
+ configs.delete(:sqlite3)
188
+
189
+ configs.each do |k, v|
110
190
  send "#{k}=", v
111
191
  end
112
192
  end
@@ -114,24 +194,11 @@ module ActiveRecord
114
194
 
115
195
  # This sets the database configuration from Configuration#database_configuration
116
196
  # and then establishes the connection.
117
- initializer "active_record.initialize_database" do |app|
197
+ initializer "active_record.initialize_database" do
118
198
  ActiveSupport.on_load(:active_record) do
199
+ self.connection_handlers = { writing_role => ActiveRecord::Base.default_connection_handler }
119
200
  self.configurations = Rails.application.config.database_configuration
120
-
121
- begin
122
- establish_connection
123
- rescue ActiveRecord::NoDatabaseError
124
- warn <<-end_warning
125
- Oops - You have a database configured, but it doesn't exist yet!
126
-
127
- Here's how to get started:
128
-
129
- 1. Configure your database in config/database.yml.
130
- 2. Run `bin/rake db:create` to create the database.
131
- 3. Run `bin/rake db:setup` to load your database schema.
132
- end_warning
133
- raise
134
- end
201
+ establish_connection
135
202
  end
136
203
  end
137
204
 
@@ -143,11 +210,16 @@ end_warning
143
210
  end
144
211
  end
145
212
 
146
- initializer "active_record.set_reloader_hooks" do |app|
147
- hook = app.config.reload_classes_only_on_change ? :to_prepare : :to_cleanup
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)
217
+ end
218
+ end
148
219
 
220
+ initializer "active_record.set_reloader_hooks" do
149
221
  ActiveSupport.on_load(:active_record) do
150
- ActionDispatch::Reloader.send(hook) do
222
+ ActiveSupport::Reloader.before_class_unload do
151
223
  if ActiveRecord::Base.connected?
152
224
  ActiveRecord::Base.clear_cache!
153
225
  ActiveRecord::Base.clear_reloadable_connections!
@@ -156,9 +228,36 @@ end_warning
156
228
  end
157
229
  end
158
230
 
231
+ initializer "active_record.set_executor_hooks" do
232
+ ActiveRecord::QueryCache.install_executor_hooks
233
+ end
234
+
159
235
  initializer "active_record.add_watchable_files" do |app|
160
236
  path = app.paths["db"].first
161
237
  config.watchable_files.concat ["#{path}/schema.rb", "#{path}/structure.sql"]
162
238
  end
239
+
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.
250
+
251
+ clear_active_connections!
252
+ flush_idle_connections!
253
+ end
254
+ end
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
163
262
  end
164
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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Base.connection.begin_transaction(joinable: false)
2
4
 
3
5
  at_exit do
@@ -1,50 +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
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
- self.db_runtime = (db_runtime || 0) + db_rt_before_render
25
- runtime = super
26
- db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
27
- self.db_runtime += db_rt_after_render
28
- runtime - db_rt_after_render
29
- 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
30
27
  super
31
28
  end
32
- end
33
29
 
34
- def append_info_to_payload(payload)
35
- super
36
- if ActiveRecord::Base.connected?
37
- 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
38
41
  end
39
- end
40
42
 
41
- module ClassMethods # :nodoc:
42
- def log_process_action(payload)
43
- messages, db_runtime = super, payload[:db_runtime]
44
- messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
45
- 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
46
48
  end
47
- end
48
49
  end
49
50
  end
50
51
  end