activerecord 5.0.7.2 → 6.1.1

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 (363) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +829 -2015
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +11 -9
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record.rb +37 -29
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +30 -18
  10. data/lib/active_record/associations.rb +1714 -1596
  11. data/lib/active_record/associations/alias_tracker.rb +36 -42
  12. data/lib/active_record/associations/association.rb +143 -68
  13. data/lib/active_record/associations/association_scope.rb +98 -94
  14. data/lib/active_record/associations/belongs_to_association.rb +76 -46
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
  16. data/lib/active_record/associations/builder/association.rb +27 -28
  17. data/lib/active_record/associations/builder/belongs_to.rb +52 -60
  18. data/lib/active_record/associations/builder/collection_association.rb +12 -22
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +40 -62
  20. data/lib/active_record/associations/builder/has_many.rb +10 -2
  21. data/lib/active_record/associations/builder/has_one.rb +35 -2
  22. data/lib/active_record/associations/builder/singular_association.rb +5 -1
  23. data/lib/active_record/associations/collection_association.rb +104 -259
  24. data/lib/active_record/associations/collection_proxy.rb +169 -125
  25. data/lib/active_record/associations/foreign_association.rb +22 -0
  26. data/lib/active_record/associations/has_many_association.rb +46 -31
  27. data/lib/active_record/associations/has_many_through_association.rb +66 -46
  28. data/lib/active_record/associations/has_one_association.rb +71 -52
  29. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  30. data/lib/active_record/associations/join_dependency.rb +169 -180
  31. data/lib/active_record/associations/join_dependency/join_association.rb +53 -79
  32. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  33. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  34. data/lib/active_record/associations/preloader.rb +97 -104
  35. data/lib/active_record/associations/preloader/association.rb +109 -97
  36. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  37. data/lib/active_record/associations/singular_association.rb +12 -45
  38. data/lib/active_record/associations/through_association.rb +27 -15
  39. data/lib/active_record/attribute_assignment.rb +55 -60
  40. data/lib/active_record/attribute_methods.rb +111 -141
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +17 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +172 -112
  43. data/lib/active_record/attribute_methods/primary_key.rb +88 -91
  44. data/lib/active_record/attribute_methods/query.rb +6 -8
  45. data/lib/active_record/attribute_methods/read.rb +18 -50
  46. data/lib/active_record/attribute_methods/serialization.rb +38 -10
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +38 -66
  48. data/lib/active_record/attribute_methods/write.rb +25 -32
  49. data/lib/active_record/attributes.rb +69 -31
  50. data/lib/active_record/autosave_association.rb +102 -66
  51. data/lib/active_record/base.rb +16 -25
  52. data/lib/active_record/callbacks.rb +202 -43
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +11 -12
  55. data/lib/active_record/connection_adapters.rb +50 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +661 -375
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +14 -38
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +269 -105
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +54 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +137 -93
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +155 -113
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +328 -162
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +591 -259
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +229 -91
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +392 -244
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +457 -582
  69. data/lib/active_record/connection_adapters/column.rb +55 -13
  70. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  71. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +135 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +79 -49
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +66 -56
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +20 -12
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +74 -37
  82. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  83. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  84. data/lib/active_record/connection_adapters/postgresql/column.rb +39 -28
  85. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -101
  86. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  87. data/lib/active_record/connection_adapters/postgresql/oid.rb +26 -21
  88. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  90. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -6
  93. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -4
  95. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  96. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  97. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
  98. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  104. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  106. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  107. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  108. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  109. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
  110. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  111. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  112. data/lib/active_record/connection_adapters/postgresql/quoting.rb +98 -38
  113. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +21 -27
  114. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
  115. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  116. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  117. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +426 -324
  118. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +32 -23
  119. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  120. data/lib/active_record/connection_adapters/postgresql_adapter.rb +418 -293
  121. data/lib/active_record/connection_adapters/schema_cache.rb +135 -18
  122. data/lib/active_record/connection_adapters/sql_type_metadata.rb +22 -7
  123. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
  124. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  125. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  126. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -6
  127. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  128. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  129. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +170 -0
  130. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +282 -290
  131. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  132. data/lib/active_record/connection_handling.rb +287 -45
  133. data/lib/active_record/core.rb +385 -181
  134. data/lib/active_record/counter_cache.rb +60 -28
  135. data/lib/active_record/database_configurations.rb +272 -0
  136. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  137. data/lib/active_record/database_configurations/database_config.rb +80 -0
  138. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  139. data/lib/active_record/database_configurations/url_config.rb +53 -0
  140. data/lib/active_record/delegated_type.rb +209 -0
  141. data/lib/active_record/destroy_association_async_job.rb +36 -0
  142. data/lib/active_record/dynamic_matchers.rb +87 -87
  143. data/lib/active_record/enum.rb +122 -47
  144. data/lib/active_record/errors.rb +153 -22
  145. data/lib/active_record/explain.rb +13 -8
  146. data/lib/active_record/explain_registry.rb +3 -1
  147. data/lib/active_record/explain_subscriber.rb +9 -4
  148. data/lib/active_record/fixture_set/file.rb +20 -22
  149. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  150. data/lib/active_record/fixture_set/render_context.rb +17 -0
  151. data/lib/active_record/fixture_set/table_row.rb +152 -0
  152. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  153. data/lib/active_record/fixtures.rb +246 -507
  154. data/lib/active_record/gem_version.rb +6 -4
  155. data/lib/active_record/inheritance.rb +168 -95
  156. data/lib/active_record/insert_all.rb +208 -0
  157. data/lib/active_record/integration.rb +114 -25
  158. data/lib/active_record/internal_metadata.rb +30 -24
  159. data/lib/active_record/legacy_yaml_adapter.rb +11 -5
  160. data/lib/active_record/locking/optimistic.rb +81 -85
  161. data/lib/active_record/locking/pessimistic.rb +22 -6
  162. data/lib/active_record/log_subscriber.rb +68 -31
  163. data/lib/active_record/middleware/database_selector.rb +77 -0
  164. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  165. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  166. data/lib/active_record/migration.rb +439 -342
  167. data/lib/active_record/migration/command_recorder.rb +152 -98
  168. data/lib/active_record/migration/compatibility.rb +229 -60
  169. data/lib/active_record/migration/join_table.rb +8 -7
  170. data/lib/active_record/model_schema.rb +230 -122
  171. data/lib/active_record/nested_attributes.rb +213 -203
  172. data/lib/active_record/no_touching.rb +11 -2
  173. data/lib/active_record/null_relation.rb +12 -34
  174. data/lib/active_record/persistence.rb +471 -97
  175. data/lib/active_record/query_cache.rb +23 -12
  176. data/lib/active_record/querying.rb +43 -25
  177. data/lib/active_record/railtie.rb +155 -43
  178. data/lib/active_record/railties/console_sandbox.rb +2 -0
  179. data/lib/active_record/railties/controller_runtime.rb +34 -33
  180. data/lib/active_record/railties/databases.rake +507 -195
  181. data/lib/active_record/readonly_attributes.rb +9 -4
  182. data/lib/active_record/reflection.rb +245 -269
  183. data/lib/active_record/relation.rb +475 -324
  184. data/lib/active_record/relation/batches.rb +125 -72
  185. data/lib/active_record/relation/batches/batch_enumerator.rb +28 -10
  186. data/lib/active_record/relation/calculations.rb +267 -171
  187. data/lib/active_record/relation/delegation.rb +73 -69
  188. data/lib/active_record/relation/finder_methods.rb +238 -248
  189. data/lib/active_record/relation/from_clause.rb +7 -9
  190. data/lib/active_record/relation/merger.rb +95 -77
  191. data/lib/active_record/relation/predicate_builder.rb +109 -110
  192. data/lib/active_record/relation/predicate_builder/array_handler.rb +22 -17
  193. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
  194. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  195. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +55 -0
  196. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  197. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  198. data/lib/active_record/relation/query_attribute.rb +33 -2
  199. data/lib/active_record/relation/query_methods.rb +654 -374
  200. data/lib/active_record/relation/record_fetch_warning.rb +8 -6
  201. data/lib/active_record/relation/spawn_methods.rb +15 -14
  202. data/lib/active_record/relation/where_clause.rb +171 -109
  203. data/lib/active_record/result.rb +88 -51
  204. data/lib/active_record/runtime_registry.rb +5 -3
  205. data/lib/active_record/sanitization.rb +73 -100
  206. data/lib/active_record/schema.rb +7 -14
  207. data/lib/active_record/schema_dumper.rb +101 -69
  208. data/lib/active_record/schema_migration.rb +16 -12
  209. data/lib/active_record/scoping.rb +20 -20
  210. data/lib/active_record/scoping/default.rb +92 -95
  211. data/lib/active_record/scoping/named.rb +39 -30
  212. data/lib/active_record/secure_token.rb +19 -9
  213. data/lib/active_record/serialization.rb +7 -3
  214. data/lib/active_record/signed_id.rb +116 -0
  215. data/lib/active_record/statement_cache.rb +80 -29
  216. data/lib/active_record/store.rb +122 -42
  217. data/lib/active_record/suppressor.rb +6 -3
  218. data/lib/active_record/table_metadata.rb +51 -39
  219. data/lib/active_record/tasks/database_tasks.rb +332 -115
  220. data/lib/active_record/tasks/mysql_database_tasks.rb +66 -104
  221. data/lib/active_record/tasks/postgresql_database_tasks.rb +84 -56
  222. data/lib/active_record/tasks/sqlite_database_tasks.rb +40 -19
  223. data/lib/active_record/test_databases.rb +24 -0
  224. data/lib/active_record/test_fixtures.rb +246 -0
  225. data/lib/active_record/timestamp.rb +70 -38
  226. data/lib/active_record/touch_later.rb +26 -24
  227. data/lib/active_record/transactions.rb +121 -184
  228. data/lib/active_record/translation.rb +3 -1
  229. data/lib/active_record/type.rb +29 -17
  230. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  231. data/lib/active_record/type/date.rb +2 -0
  232. data/lib/active_record/type/date_time.rb +2 -0
  233. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  234. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  235. data/lib/active_record/type/internal/timezone.rb +2 -0
  236. data/lib/active_record/type/json.rb +30 -0
  237. data/lib/active_record/type/serialized.rb +20 -9
  238. data/lib/active_record/type/text.rb +11 -0
  239. data/lib/active_record/type/time.rb +12 -1
  240. data/lib/active_record/type/type_map.rb +14 -17
  241. data/lib/active_record/type/unsigned_integer.rb +16 -0
  242. data/lib/active_record/type_caster.rb +4 -2
  243. data/lib/active_record/type_caster/connection.rb +17 -13
  244. data/lib/active_record/type_caster/map.rb +10 -6
  245. data/lib/active_record/validations.rb +8 -5
  246. data/lib/active_record/validations/absence.rb +2 -0
  247. data/lib/active_record/validations/associated.rb +4 -3
  248. data/lib/active_record/validations/length.rb +2 -0
  249. data/lib/active_record/validations/numericality.rb +35 -0
  250. data/lib/active_record/validations/presence.rb +4 -2
  251. data/lib/active_record/validations/uniqueness.rb +52 -45
  252. data/lib/active_record/version.rb +3 -1
  253. data/lib/arel.rb +54 -0
  254. data/lib/arel/alias_predication.rb +9 -0
  255. data/lib/arel/attributes/attribute.rb +41 -0
  256. data/lib/arel/collectors/bind.rb +29 -0
  257. data/lib/arel/collectors/composite.rb +39 -0
  258. data/lib/arel/collectors/plain_string.rb +20 -0
  259. data/lib/arel/collectors/sql_string.rb +27 -0
  260. data/lib/arel/collectors/substitute_binds.rb +35 -0
  261. data/lib/arel/crud.rb +42 -0
  262. data/lib/arel/delete_manager.rb +18 -0
  263. data/lib/arel/errors.rb +9 -0
  264. data/lib/arel/expressions.rb +29 -0
  265. data/lib/arel/factory_methods.rb +49 -0
  266. data/lib/arel/insert_manager.rb +49 -0
  267. data/lib/arel/math.rb +45 -0
  268. data/lib/arel/nodes.rb +70 -0
  269. data/lib/arel/nodes/and.rb +32 -0
  270. data/lib/arel/nodes/ascending.rb +23 -0
  271. data/lib/arel/nodes/binary.rb +126 -0
  272. data/lib/arel/nodes/bind_param.rb +44 -0
  273. data/lib/arel/nodes/case.rb +55 -0
  274. data/lib/arel/nodes/casted.rb +62 -0
  275. data/lib/arel/nodes/comment.rb +29 -0
  276. data/lib/arel/nodes/count.rb +12 -0
  277. data/lib/arel/nodes/delete_statement.rb +45 -0
  278. data/lib/arel/nodes/descending.rb +23 -0
  279. data/lib/arel/nodes/equality.rb +15 -0
  280. data/lib/arel/nodes/extract.rb +24 -0
  281. data/lib/arel/nodes/false.rb +16 -0
  282. data/lib/arel/nodes/full_outer_join.rb +8 -0
  283. data/lib/arel/nodes/function.rb +44 -0
  284. data/lib/arel/nodes/grouping.rb +11 -0
  285. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  286. data/lib/arel/nodes/in.rb +15 -0
  287. data/lib/arel/nodes/infix_operation.rb +92 -0
  288. data/lib/arel/nodes/inner_join.rb +8 -0
  289. data/lib/arel/nodes/insert_statement.rb +37 -0
  290. data/lib/arel/nodes/join_source.rb +20 -0
  291. data/lib/arel/nodes/matches.rb +18 -0
  292. data/lib/arel/nodes/named_function.rb +23 -0
  293. data/lib/arel/nodes/node.rb +51 -0
  294. data/lib/arel/nodes/node_expression.rb +13 -0
  295. data/lib/arel/nodes/ordering.rb +27 -0
  296. data/lib/arel/nodes/outer_join.rb +8 -0
  297. data/lib/arel/nodes/over.rb +15 -0
  298. data/lib/arel/nodes/regexp.rb +16 -0
  299. data/lib/arel/nodes/right_outer_join.rb +8 -0
  300. data/lib/arel/nodes/select_core.rb +67 -0
  301. data/lib/arel/nodes/select_statement.rb +41 -0
  302. data/lib/arel/nodes/sql_literal.rb +19 -0
  303. data/lib/arel/nodes/string_join.rb +11 -0
  304. data/lib/arel/nodes/table_alias.rb +31 -0
  305. data/lib/arel/nodes/terminal.rb +16 -0
  306. data/lib/arel/nodes/true.rb +16 -0
  307. data/lib/arel/nodes/unary.rb +44 -0
  308. data/lib/arel/nodes/unary_operation.rb +20 -0
  309. data/lib/arel/nodes/unqualified_column.rb +22 -0
  310. data/lib/arel/nodes/update_statement.rb +41 -0
  311. data/lib/arel/nodes/values_list.rb +9 -0
  312. data/lib/arel/nodes/window.rb +126 -0
  313. data/lib/arel/nodes/with.rb +11 -0
  314. data/lib/arel/order_predications.rb +13 -0
  315. data/lib/arel/predications.rb +250 -0
  316. data/lib/arel/select_manager.rb +270 -0
  317. data/lib/arel/table.rb +118 -0
  318. data/lib/arel/tree_manager.rb +72 -0
  319. data/lib/arel/update_manager.rb +34 -0
  320. data/lib/arel/visitors.rb +13 -0
  321. data/lib/arel/visitors/dot.rb +308 -0
  322. data/lib/arel/visitors/mysql.rb +93 -0
  323. data/lib/arel/visitors/postgresql.rb +120 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +899 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/rails/generators/active_record.rb +7 -5
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  330. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  331. data/lib/rails/generators/active_record/migration.rb +22 -3
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +38 -35
  333. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +3 -1
  334. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +7 -5
  335. data/lib/rails/generators/active_record/model/model_generator.rb +41 -25
  336. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  337. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  339. metadata +141 -57
  340. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  341. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  343. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  344. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  345. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  346. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  347. data/lib/active_record/attribute.rb +0 -213
  348. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  349. data/lib/active_record/attribute_decorators.rb +0 -67
  350. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  351. data/lib/active_record/attribute_set.rb +0 -110
  352. data/lib/active_record/attribute_set/builder.rb +0 -132
  353. data/lib/active_record/collection_cache_key.rb +0 -50
  354. data/lib/active_record/connection_adapters/connection_specification.rb +0 -263
  355. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -22
  356. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  359. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -17
  360. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  361. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  362. data/lib/active_record/relation/where_clause_factory.rb +0 -38
  363. data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  # = Active Record Query Cache
3
5
  class QueryCache
@@ -24,23 +26,32 @@ module ActiveRecord
24
26
  end
25
27
 
26
28
  def self.run
27
- connection_id = ActiveRecord::Base.connection_id
28
-
29
- caching_pool = ActiveRecord::Base.connection_pool
30
- caching_was_enabled = caching_pool.query_cache_enabled
29
+ pools = []
31
30
 
32
- caching_pool.enable_query_cache!
31
+ if ActiveRecord::Base.legacy_connection_handling
32
+ ActiveRecord::Base.connection_handlers.each do |key, handler|
33
+ pools.concat(handler.connection_pool_list.reject { |p| p.query_cache_enabled }.each { |p| p.enable_query_cache! })
34
+ end
35
+ else
36
+ pools.concat(ActiveRecord::Base.connection_handler.all_connection_pools.reject { |p| p.query_cache_enabled }.each { |p| p.enable_query_cache! })
37
+ end
33
38
 
34
- [caching_pool, caching_was_enabled, connection_id]
39
+ pools
35
40
  end
36
41
 
37
- def self.complete((caching_pool, caching_was_enabled, connection_id))
38
- ActiveRecord::Base.connection_id = connection_id
42
+ def self.complete(pools)
43
+ pools.each { |pool| pool.disable_query_cache! }
39
44
 
40
- caching_pool.disable_query_cache! unless caching_was_enabled
41
-
42
- ActiveRecord::Base.connection_handler.connection_pool_list.each do |pool|
43
- pool.release_connection if pool.active_connection? && !pool.connection.transaction_open?
45
+ if ActiveRecord::Base.legacy_connection_handling
46
+ ActiveRecord::Base.connection_handlers.each do |_, handler|
47
+ handler.connection_pool_list.each do |pool|
48
+ pool.release_connection if pool.active_connection? && !pool.connection.transaction_open?
49
+ end
50
+ end
51
+ else
52
+ ActiveRecord::Base.connection_handler.all_connection_pools.each do |pool|
53
+ pool.release_connection if pool.active_connection? && !pool.connection.transaction_open?
54
+ end
44
55
  end
45
56
  end
46
57
 
@@ -1,35 +1,43 @@
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?, :none?, :one?, to: :all
4
- delegate :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!, :forty_two, :forty_two!, :third_to_last, :third_to_last!, :second_to_last, :second_to_last!, 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, :in_batches, to: :all
10
- delegate :select, :group, :order, :except, :reorder, :limit, :offset, :joins, :left_joins, :left_outer_joins, :or,
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,
17
+ :and, :or, :annotate, :optimizer_hints, :extending,
18
+ :having, :create_with, :distinct, :references, :none, :unscope, :merge, :except, :only,
19
+ :count, :average, :minimum, :maximum, :sum, :calculate,
20
+ :pluck, :pick, :ids, :strict_loading
21
+ ].freeze # :nodoc:
22
+ delegate(*QUERYING_METHODS, to: :all)
15
23
 
16
24
  # 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
25
+ # be returned as an array, with the requested columns encapsulated as attributes of the model you call
26
+ # this method from. For example, if you call <tt>Product.find_by_sql</tt>, then the results will be returned in
19
27
  # a +Product+ object with the attributes you specified in the SQL query.
20
28
  #
21
- # If you call a complicated SQL query which spans multiple tables the columns specified by the
29
+ # If you call a complicated SQL query which spans multiple tables, the columns specified by the
22
30
  # SELECT will be attributes of the model, whether or not they are columns of the corresponding
23
31
  # table.
24
32
  #
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
33
+ # The +sql+ parameter is a full SQL query as a string. It will be called as is; there will be
34
+ # no database agnostic conversions performed. This should be a last resort because using
35
+ # database-specific terms will lock you into using that particular database engine, or require you to
28
36
  # change your call if you switch engines.
29
37
  #
30
38
  # # A simple SQL query spanning multiple tables
31
39
  # 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"}>, ...]
40
+ # # => [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "author"=>"Quentin"}>, ...]
33
41
  #
34
42
  # You can use the same string replacement techniques as you can with <tt>ActiveRecord::QueryMethods#where</tt>:
35
43
  #
@@ -37,8 +45,12 @@ module ActiveRecord
37
45
  # Post.find_by_sql ["SELECT body FROM comments WHERE author = :user_id OR approved_by = :user_id", { :user_id => user_id }]
38
46
  def find_by_sql(sql, binds = [], preparable: nil, &block)
39
47
  result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds, preparable: preparable)
40
- column_types = result_set.column_types.dup
41
- columns_hash.each_key { |k| column_types.delete k }
48
+ column_types = result_set.column_types
49
+
50
+ unless column_types.empty?
51
+ column_types = column_types.reject { |k, _| attribute_types.key?(k) }
52
+ end
53
+
42
54
  message_bus = ActiveSupport::Notifications.instrumenter
43
55
 
44
56
  payload = {
@@ -47,13 +59,20 @@ module ActiveRecord
47
59
  }
48
60
 
49
61
  message_bus.instrument("instantiation.active_record", payload) do
50
- result_set.map { |record| instantiate(record, column_types, &block) }
62
+ if result_set.includes_column?(inheritance_column)
63
+ result_set.map { |record| instantiate(record, column_types, &block) }
64
+ else
65
+ # Instantiate a homogeneous set
66
+ result_set.map { |record| instantiate_instance_of(self, record, column_types, &block) }
67
+ end
51
68
  end
52
69
  end
53
70
 
54
71
  # Returns the result of an SQL statement that should only include a COUNT(*) in the SELECT part.
55
72
  # 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.
73
+ # using the ActiveRecord::Calculations class methods. Look into those before using this method,
74
+ # as it could lock you into a specific database engine or require a code change to switch
75
+ # database engines.
57
76
  #
58
77
  # Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
59
78
  # # => 12
@@ -62,8 +81,7 @@ module ActiveRecord
62
81
  #
63
82
  # * +sql+ - An SQL statement which should return a count query from the database, see the example above.
64
83
  def count_by_sql(sql)
65
- sql = sanitize_conditions(sql)
66
- connection.select_value(sql, "#{name} Count").to_i
84
+ connection.select_value(sanitize_sql(sql), "#{name} Count").to_i
67
85
  end
68
86
  end
69
87
  end
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_record"
2
4
  require "rails"
5
+ require "active_support/core_ext/object/try"
3
6
  require "active_model/railtie"
4
7
 
5
8
  # For now, action_controller must always be present with
6
- # rails, so let's make sure that it gets required before
9
+ # Rails, so let's make sure that it gets required before
7
10
  # here. This is needed for correctly setting up the middleware.
8
11
  # In the future, this might become an optional require.
9
12
  require "action_controller/railtie"
@@ -13,30 +16,31 @@ module ActiveRecord
13
16
  class Railtie < Rails::Railtie # :nodoc:
14
17
  config.active_record = ActiveSupport::OrderedOptions.new
15
18
 
16
- config.app_generators.orm :active_record, :migration => true,
17
- :timestamps => true
19
+ config.app_generators.orm :active_record, migration: true,
20
+ timestamps: true
18
21
 
19
22
  config.action_dispatch.rescue_responses.merge!(
20
- 'ActiveRecord::RecordNotFound' => :not_found,
21
- 'ActiveRecord::StaleObjectError' => :conflict,
22
- 'ActiveRecord::RecordInvalid' => :unprocessable_entity,
23
- 'ActiveRecord::RecordNotSaved' => :unprocessable_entity
23
+ "ActiveRecord::RecordNotFound" => :not_found,
24
+ "ActiveRecord::StaleObjectError" => :conflict,
25
+ "ActiveRecord::RecordInvalid" => :unprocessable_entity,
26
+ "ActiveRecord::RecordNotSaved" => :unprocessable_entity
24
27
  )
25
28
 
26
-
27
29
  config.active_record.use_schema_cache_dump = true
30
+ config.active_record.check_schema_cache_dump_version = true
28
31
  config.active_record.maintain_test_schema = true
32
+ config.active_record.has_many_inversing = false
33
+
34
+ config.active_record.queues = ActiveSupport::InheritableOptions.new
29
35
 
30
36
  config.eager_load_namespaces << ActiveRecord
31
37
 
32
38
  rake_tasks do
33
39
  namespace :db do
34
40
  task :load_config do
35
- ActiveRecord::Tasks::DatabaseTasks.database_configuration = Rails.application.config.database_configuration
36
-
37
41
  if defined?(ENGINE_ROOT) && engine = Rails::Engine.find(ENGINE_ROOT)
38
- if engine.paths['db/migrate'].existent
39
- ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths['db/migrate'].to_a
42
+ if engine.paths["db/migrate"].existent
43
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths["db/migrate"].to_a
40
44
  end
41
45
  end
42
46
  end
@@ -53,8 +57,10 @@ module ActiveRecord
53
57
  require "active_record/base"
54
58
  unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDERR, STDOUT)
55
59
  console = ActiveSupport::Logger.new(STDERR)
60
+ console.level = Rails.logger.level
56
61
  Rails.logger.extend ActiveSupport::Logger.broadcast console
57
62
  end
63
+ ActiveRecord::Base.verbose_query_logs = false
58
64
  end
59
65
 
60
66
  runner do
@@ -72,28 +78,116 @@ module ActiveRecord
72
78
  ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger }
73
79
  end
74
80
 
75
- initializer "active_record.migration_error" do
81
+ initializer "active_record.backtrace_cleaner" do
82
+ ActiveSupport.on_load(:active_record) { LogSubscriber.backtrace_cleaner = ::Rails.backtrace_cleaner }
83
+ end
84
+
85
+ initializer "active_record.migration_error" do |app|
76
86
  if config.active_record.delete(:migration_error) == :page_load
77
87
  config.app_middleware.insert_after ::ActionDispatch::Callbacks,
78
- ActiveRecord::Migration::CheckPending
88
+ ActiveRecord::Migration::CheckPending,
89
+ file_watcher: app.config.file_watcher
90
+ end
91
+ end
92
+
93
+ initializer "active_record.database_selector" do
94
+ if options = config.active_record.delete(:database_selector)
95
+ resolver = config.active_record.delete(:database_resolver)
96
+ operations = config.active_record.delete(:database_resolver_context)
97
+ config.app_middleware.use ActiveRecord::Middleware::DatabaseSelector, resolver, operations, options
98
+ end
99
+ end
100
+
101
+ initializer "Check for cache versioning support" do
102
+ config.after_initialize do |app|
103
+ ActiveSupport.on_load(:active_record) do
104
+ if app.config.active_record.cache_versioning && Rails.cache
105
+ unless Rails.cache.class.try(:supports_cache_versioning?)
106
+ raise <<-end_error
107
+
108
+ You're using a cache store that doesn't support native cache versioning.
109
+ Your best option is to upgrade to a newer version of #{Rails.cache.class}
110
+ that supports cache versioning (#{Rails.cache.class}.supports_cache_versioning? #=> true).
111
+
112
+ Next best, switch to a different cache store that does support cache versioning:
113
+ https://guides.rubyonrails.org/caching_with_rails.html#cache-stores.
114
+
115
+ To keep using the current cache store, you can turn off cache versioning entirely:
116
+
117
+ config.active_record.cache_versioning = false
118
+
119
+ end_error
120
+ end
121
+ end
122
+ end
79
123
  end
80
124
  end
81
125
 
82
126
  initializer "active_record.check_schema_cache_dump" do
127
+ check_schema_cache_dump_version = config.active_record.delete(:check_schema_cache_dump_version)
128
+
83
129
  if config.active_record.delete(:use_schema_cache_dump)
84
130
  config.after_initialize do |app|
85
131
  ActiveSupport.on_load(:active_record) do
86
- filename = File.join(app.config.paths["db"].first, "schema_cache.dump")
87
-
88
- if File.file?(filename)
89
- cache = Marshal.load File.binread filename
90
- if cache.version == ActiveRecord::Migrator.current_version
91
- self.connection.schema_cache = cache
92
- self.connection_pool.schema_cache = cache.dup
93
- else
94
- 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}."
132
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).first
133
+
134
+ filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(
135
+ db_config.name,
136
+ schema_cache_path: db_config&.schema_cache_path
137
+ )
138
+
139
+ cache = ActiveRecord::ConnectionAdapters::SchemaCache.load_from(filename)
140
+ next if cache.nil?
141
+
142
+ if check_schema_cache_dump_version
143
+ current_version = begin
144
+ ActiveRecord::Migrator.current_version
145
+ rescue ActiveRecordError => error
146
+ warn "Failed to validate the schema cache because of #{error.class}: #{error.message}"
147
+ nil
148
+ end
149
+ next if current_version.nil?
150
+
151
+ if cache.version != current_version
152
+ warn "Ignoring #{filename} because it has expired. The current schema version is #{current_version}, but the one in the cache is #{cache.version}."
153
+ next
95
154
  end
96
155
  end
156
+
157
+ connection_pool.set_schema_cache(cache)
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ initializer "active_record.define_attribute_methods" do |app|
164
+ config.after_initialize do
165
+ ActiveSupport.on_load(:active_record) do
166
+ if app.config.eager_load
167
+ begin
168
+ descendants.each do |model|
169
+ # SchemaMigration and InternalMetadata both override `table_exists?`
170
+ # to bypass the schema cache, so skip them to avoid the extra queries.
171
+ next if model._internal?
172
+
173
+ # If the schema cache was loaded from a dump, we can use it without connecting
174
+ schema_cache = model.connection_pool.schema_cache
175
+
176
+ # If there's no connection yet, we avoid connecting.
177
+ schema_cache ||= model.connected? && model.connection.schema_cache
178
+
179
+ # If the schema cache doesn't have the columns
180
+ # hash for the model cached, `define_attribute_methods` would trigger a query.
181
+ if schema_cache && schema_cache.columns_hash?(model.table_name)
182
+ model.define_attribute_methods
183
+ end
184
+ end
185
+ rescue ActiveRecordError => error
186
+ # Regardless of whether there was already a connection or not, we rescue any database
187
+ # error because it is critical that the application can boot even if the database
188
+ # is unhealthy.
189
+ warn "Failed to define attribute methods because of #{error.class}: #{error.message}"
190
+ end
97
191
  end
98
192
  end
99
193
  end
@@ -102,14 +196,16 @@ module ActiveRecord
102
196
  initializer "active_record.warn_on_records_fetched_greater_than" do
103
197
  if config.active_record.warn_on_records_fetched_greater_than
104
198
  ActiveSupport.on_load(:active_record) do
105
- require 'active_record/relation/record_fetch_warning'
199
+ require "active_record/relation/record_fetch_warning"
106
200
  end
107
201
  end
108
202
  end
109
203
 
110
204
  initializer "active_record.set_configs" do |app|
111
205
  ActiveSupport.on_load(:active_record) do
112
- app.config.active_record.each do |k,v|
206
+ configs = app.config.active_record
207
+
208
+ configs.each do |k, v|
113
209
  send "#{k}=", v
114
210
  end
115
211
  end
@@ -119,22 +215,11 @@ module ActiveRecord
119
215
  # and then establishes the connection.
120
216
  initializer "active_record.initialize_database" do
121
217
  ActiveSupport.on_load(:active_record) do
122
- self.configurations = Rails.application.config.database_configuration
123
-
124
- begin
125
- establish_connection
126
- rescue ActiveRecord::NoDatabaseError
127
- warn <<-end_warning
128
- Oops - You have a database configured, but it doesn't exist yet!
129
-
130
- Here's how to get started:
131
-
132
- 1. Configure your database in config/database.yml.
133
- 2. Run `bin/rails db:create` to create the database.
134
- 3. Run `bin/rails db:setup` to load your database schema.
135
- end_warning
136
- raise
218
+ if ActiveRecord::Base.legacy_connection_handling
219
+ self.connection_handlers = { writing_role => ActiveRecord::Base.default_connection_handler }
137
220
  end
221
+ self.configurations = Rails.application.config.database_configuration
222
+ establish_connection
138
223
  end
139
224
  end
140
225
 
@@ -158,14 +243,41 @@ end_warning
158
243
  end
159
244
 
160
245
  initializer "active_record.set_executor_hooks" do
161
- ActiveSupport.on_load(:active_record) do
162
- ActiveRecord::QueryCache.install_executor_hooks
163
- end
246
+ ActiveRecord::QueryCache.install_executor_hooks
164
247
  end
165
248
 
166
249
  initializer "active_record.add_watchable_files" do |app|
167
250
  path = app.paths["db"].first
168
251
  config.watchable_files.concat ["#{path}/schema.rb", "#{path}/structure.sql"]
169
252
  end
253
+
254
+ initializer "active_record.clear_active_connections" do
255
+ config.after_initialize do
256
+ ActiveSupport.on_load(:active_record) do
257
+ # Ideally the application doesn't connect to the database during boot,
258
+ # but sometimes it does. In case it did, we want to empty out the
259
+ # connection pools so that a non-database-using process (e.g. a master
260
+ # process in a forking server model) doesn't retain a needless
261
+ # connection. If it was needed, the incremental cost of reestablishing
262
+ # this connection is trivial: the rest of the pool would need to be
263
+ # populated anyway.
264
+
265
+ clear_active_connections!
266
+ flush_idle_connections!
267
+ end
268
+ end
269
+ end
270
+
271
+ initializer "active_record.set_filter_attributes" do
272
+ ActiveSupport.on_load(:active_record) do
273
+ self.filter_attributes += Rails.application.config.filter_parameters
274
+ end
275
+ end
276
+
277
+ initializer "active_record.set_signed_id_verifier_secret" do
278
+ ActiveSupport.on_load(:active_record) do
279
+ self.signed_id_verifier_secret ||= -> { Rails.application.key_generator.generate_key("active_record/signed_id") }
280
+ end
281
+ end
170
282
  end
171
283
  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