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
  # See ActiveRecord::Transactions::ClassMethods for documentation.
3
5
  module Transactions
@@ -8,10 +10,6 @@ module ActiveRecord
8
10
  included do
9
11
  define_callbacks :commit, :rollback,
10
12
  :before_commit,
11
- :before_commit_without_transaction_enrollment,
12
- :commit_without_transaction_enrollment,
13
- :rollback_without_transaction_enrollment,
14
- terminator: deprecated_false_terminator,
15
13
  scope: [:kind, :name]
16
14
  end
17
15
 
@@ -163,13 +161,13 @@ module ActiveRecord
163
161
  # end
164
162
  # end
165
163
  #
166
- # only "Kotori" is created. This works on MySQL and PostgreSQL. SQLite3 version >= '3.6.8' also supports it.
164
+ # only "Kotori" is created.
167
165
  #
168
166
  # Most databases don't support true nested transactions. At the time of
169
167
  # writing, the only database that we're aware of that supports true nested
170
168
  # transactions, is MS-SQL. Because of this, Active Record emulates nested
171
- # transactions by using savepoints on MySQL and PostgreSQL. See
172
- # http://dev.mysql.com/doc/refman/5.7/en/savepoint.html
169
+ # transactions by using savepoints. See
170
+ # https://dev.mysql.com/doc/refman/en/savepoint.html
173
171
  # for more information about savepoints.
174
172
  #
175
173
  # === \Callbacks
@@ -189,8 +187,8 @@ module ActiveRecord
189
187
  #
190
188
  # === Caveats
191
189
  #
192
- # If you're on MySQL, then do not use DDL operations in nested transactions
193
- # blocks that are emulated with savepoints. That is, do not execute statements
190
+ # If you're on MySQL, then do not use Data Definition Language (DDL) operations in nested
191
+ # transactions blocks that are emulated with savepoints. That is, do not execute statements
194
192
  # like 'CREATE TABLE' inside such blocks. This is because MySQL automatically
195
193
  # releases all savepoints upon executing a DDL operation. When +transaction+
196
194
  # is finished and tries to release the savepoint it created earlier, a
@@ -207,8 +205,8 @@ module ActiveRecord
207
205
  # Note that "TRUNCATE" is also a MySQL DDL statement!
208
206
  module ClassMethods
209
207
  # See the ConnectionAdapters::DatabaseStatements#transaction API docs.
210
- def transaction(options = {}, &block)
211
- connection.transaction(options, &block)
208
+ def transaction(**options, &block)
209
+ connection.transaction(**options, &block)
212
210
  end
213
211
 
214
212
  def before_commit(*args, &block) # :nodoc:
@@ -233,6 +231,12 @@ module ActiveRecord
233
231
  set_callback(:commit, :after, *args, &block)
234
232
  end
235
233
 
234
+ # Shortcut for <tt>after_commit :hook, on: [ :create, :update ]</tt>.
235
+ def after_save_commit(*args, &block)
236
+ set_options_for_callbacks!(args, on: [ :create, :update ])
237
+ set_callback(:commit, :after, *args, &block)
238
+ end
239
+
236
240
  # Shortcut for <tt>after_commit :hook, on: :create</tt>.
237
241
  def after_create_commit(*args, &block)
238
242
  set_options_for_callbacks!(args, on: :create)
@@ -259,88 +263,50 @@ module ActiveRecord
259
263
  set_callback(:rollback, :after, *args, &block)
260
264
  end
261
265
 
262
- def before_commit_without_transaction_enrollment(*args, &block) # :nodoc:
263
- set_options_for_callbacks!(args)
264
- set_callback(:before_commit_without_transaction_enrollment, :before, *args, &block)
265
- end
266
-
267
- def after_commit_without_transaction_enrollment(*args, &block) # :nodoc:
268
- set_options_for_callbacks!(args)
269
- set_callback(:commit_without_transaction_enrollment, :after, *args, &block)
270
- end
271
-
272
- def after_rollback_without_transaction_enrollment(*args, &block) # :nodoc:
273
- set_options_for_callbacks!(args)
274
- set_callback(:rollback_without_transaction_enrollment, :after, *args, &block)
275
- end
276
-
277
- def raise_in_transactional_callbacks
278
- ActiveSupport::Deprecation.warn('ActiveRecord::Base.raise_in_transactional_callbacks is deprecated and will be removed without replacement.')
279
- true
280
- end
281
-
282
- def raise_in_transactional_callbacks=(value)
283
- ActiveSupport::Deprecation.warn('ActiveRecord::Base.raise_in_transactional_callbacks= is deprecated, has no effect and will be removed without replacement.')
284
- value
285
- end
286
-
287
266
  private
288
-
289
- def set_options_for_callbacks!(args, enforced_options = {})
290
- options = args.extract_options!.merge!(enforced_options)
291
- args << options
292
-
293
- if options[:on]
294
- fire_on = Array(options[:on])
295
- assert_valid_transaction_action(fire_on)
296
- options[:if] = Array(options[:if])
297
- options[:if] << "transaction_include_any_action?(#{fire_on})"
267
+ def set_options_for_callbacks!(args, enforced_options = {})
268
+ options = args.extract_options!.merge!(enforced_options)
269
+ args << options
270
+
271
+ if options[:on]
272
+ fire_on = Array(options[:on])
273
+ assert_valid_transaction_action(fire_on)
274
+ options[:if] = [
275
+ -> { transaction_include_any_action?(fire_on) },
276
+ *options[:if]
277
+ ]
278
+ end
298
279
  end
299
- end
300
280
 
301
- def assert_valid_transaction_action(actions)
302
- if (actions - ACTIONS).any?
303
- raise ArgumentError, ":on conditions for after_commit and after_rollback callbacks have to be one of #{ACTIONS}"
281
+ def assert_valid_transaction_action(actions)
282
+ if (actions - ACTIONS).any?
283
+ raise ArgumentError, ":on conditions for after_commit and after_rollback callbacks have to be one of #{ACTIONS}"
284
+ end
304
285
  end
305
- end
306
286
  end
307
287
 
308
288
  # See ActiveRecord::Transactions::ClassMethods for detailed documentation.
309
- def transaction(options = {}, &block)
310
- self.class.transaction(options, &block)
289
+ def transaction(**options, &block)
290
+ self.class.transaction(**options, &block)
311
291
  end
312
292
 
313
293
  def destroy #:nodoc:
314
294
  with_transaction_returning_status { super }
315
295
  end
316
296
 
317
- def save(*) #:nodoc:
318
- rollback_active_record_state! do
319
- with_transaction_returning_status { super }
320
- end
321
- end
322
-
323
- def save!(*) #:nodoc:
297
+ def save(**) #:nodoc:
324
298
  with_transaction_returning_status { super }
325
299
  end
326
300
 
327
- def touch(*) #:nodoc:
301
+ def save!(**) #:nodoc:
328
302
  with_transaction_returning_status { super }
329
303
  end
330
304
 
331
- # Reset id and @new_record if the transaction rolls back.
332
- def rollback_active_record_state!
333
- remember_transaction_record_state
334
- yield
335
- rescue Exception
336
- restore_transaction_record_state
337
- raise
338
- ensure
339
- clear_transaction_record_state
305
+ def touch(*, **) #:nodoc:
306
+ with_transaction_returning_status { super }
340
307
  end
341
308
 
342
309
  def before_committed! # :nodoc:
343
- _run_before_commit_without_transaction_enrollment_callbacks
344
310
  _run_before_commit_callbacks
345
311
  end
346
312
 
@@ -349,12 +315,13 @@ module ActiveRecord
349
315
  # Ensure that it is not called if the object was never persisted (failed create),
350
316
  # but call it after the commit of a destroyed object.
351
317
  def committed!(should_run_callbacks: true) #:nodoc:
352
- if should_run_callbacks && destroyed? || persisted?
353
- _run_commit_without_transaction_enrollment_callbacks
318
+ force_clear_transaction_record_state
319
+ if should_run_callbacks
320
+ @_committed_already_called = true
354
321
  _run_commit_callbacks
355
322
  end
356
323
  ensure
357
- force_clear_transaction_record_state
324
+ @_committed_already_called = @_trigger_update_callback = @_trigger_destroy_callback = false
358
325
  end
359
326
 
360
327
  # Call the #after_rollback callbacks. The +force_restore_state+ argument indicates if the record
@@ -362,23 +329,11 @@ module ActiveRecord
362
329
  def rolledback!(force_restore_state: false, should_run_callbacks: true) #:nodoc:
363
330
  if should_run_callbacks
364
331
  _run_rollback_callbacks
365
- _run_rollback_without_transaction_enrollment_callbacks
366
332
  end
367
333
  ensure
368
334
  restore_transaction_record_state(force_restore_state)
369
335
  clear_transaction_record_state
370
- end
371
-
372
- # Add the record to the current transaction so that the #after_rollback and #after_commit callbacks
373
- # can be called.
374
- def add_to_transaction
375
- if has_transactional_callbacks?
376
- self.class.connection.add_transaction_record(self)
377
- else
378
- sync_with_transaction_state
379
- set_transaction_state(self.class.connection.transaction_state)
380
- end
381
- remember_transaction_record_state
336
+ @_trigger_update_callback = @_trigger_destroy_callback = false if force_restore_state
382
337
  end
383
338
 
384
339
  # Executes +method+ within a transaction and captures its return value as a
@@ -389,121 +344,103 @@ module ActiveRecord
389
344
  # instance.
390
345
  def with_transaction_returning_status
391
346
  status = nil
392
- self.class.transaction do
393
- add_to_transaction
394
- begin
395
- status = yield
396
- rescue ActiveRecord::Rollback
397
- clear_transaction_record_state
398
- status = nil
399
- end
347
+ connection = self.class.connection
348
+ ensure_finalize = !connection.transaction_open?
349
+
350
+ connection.transaction do
351
+ add_to_transaction(ensure_finalize || has_transactional_callbacks?)
352
+ remember_transaction_record_state
400
353
 
354
+ status = yield
401
355
  raise ActiveRecord::Rollback unless status
402
356
  end
403
357
  status
404
- ensure
405
- if @transaction_state && @transaction_state.committed?
406
- clear_transaction_record_state
407
- end
408
358
  end
409
359
 
410
- protected
411
-
412
- # Save the new record state and id of a record so it can be restored later if a transaction fails.
413
- def remember_transaction_record_state #:nodoc:
414
- @_start_transaction_state[:id] = id
415
- @_start_transaction_state.reverse_merge!(
416
- new_record: @new_record,
417
- destroyed: @destroyed,
418
- frozen?: frozen?,
419
- )
420
- @_start_transaction_state[:level] = (@_start_transaction_state[:level] || 0) + 1
360
+ def trigger_transactional_callbacks? # :nodoc:
361
+ (@_new_record_before_last_commit || _trigger_update_callback) && persisted? ||
362
+ _trigger_destroy_callback && destroyed?
421
363
  end
422
364
 
423
- # Clear the new record state and id of a record.
424
- def clear_transaction_record_state #:nodoc:
425
- @_start_transaction_state[:level] = (@_start_transaction_state[:level] || 0) - 1
426
- force_clear_transaction_record_state if @_start_transaction_state[:level] < 1
427
- end
365
+ private
366
+ attr_reader :_committed_already_called, :_trigger_update_callback, :_trigger_destroy_callback
367
+
368
+ # Save the new record state and id of a record so it can be restored later if a transaction fails.
369
+ def remember_transaction_record_state
370
+ @_start_transaction_state ||= {
371
+ id: id,
372
+ new_record: @new_record,
373
+ previously_new_record: @previously_new_record,
374
+ destroyed: @destroyed,
375
+ attributes: @attributes,
376
+ frozen?: frozen?,
377
+ level: 0
378
+ }
379
+ @_start_transaction_state[:level] += 1
380
+
381
+ if _committed_already_called
382
+ @_new_record_before_last_commit = false
383
+ else
384
+ @_new_record_before_last_commit = @_start_transaction_state[:new_record]
385
+ end
386
+ end
428
387
 
429
- # Force to clear the transaction record state.
430
- def force_clear_transaction_record_state #:nodoc:
431
- @_start_transaction_state.clear
432
- end
388
+ # Clear the new record state and id of a record.
389
+ def clear_transaction_record_state
390
+ return unless @_start_transaction_state
391
+ @_start_transaction_state[:level] -= 1
392
+ force_clear_transaction_record_state if @_start_transaction_state[:level] < 1
393
+ end
394
+
395
+ # Force to clear the transaction record state.
396
+ def force_clear_transaction_record_state
397
+ @_start_transaction_state = nil
398
+ end
433
399
 
434
- # Restore the new record state and id of a record that was previously saved by a call to save_record_state.
435
- def restore_transaction_record_state(force = false) #:nodoc:
436
- unless @_start_transaction_state.empty?
437
- transaction_level = (@_start_transaction_state[:level] || 0) - 1
438
- if transaction_level < 1 || force
439
- restore_state = @_start_transaction_state
440
- thaw
441
- @new_record = restore_state[:new_record]
442
- @destroyed = restore_state[:destroyed]
443
- pk = self.class.primary_key
444
- if pk && read_attribute(pk) != restore_state[:id]
445
- write_attribute(pk, restore_state[:id])
400
+ # Restore the new record state and id of a record that was previously saved by a call to save_record_state.
401
+ def restore_transaction_record_state(force_restore_state = false)
402
+ if restore_state = @_start_transaction_state
403
+ if force_restore_state || restore_state[:level] <= 1
404
+ @new_record = restore_state[:new_record]
405
+ @previously_new_record = restore_state[:previously_new_record]
406
+ @destroyed = restore_state[:destroyed]
407
+ @attributes = restore_state[:attributes].map do |attr|
408
+ value = @attributes.fetch_value(attr.name)
409
+ attr = attr.with_value_from_user(value) if attr.value != value
410
+ attr
411
+ end
412
+ @mutations_from_database = nil
413
+ @mutations_before_last_save = nil
414
+ if @attributes.fetch_value(@primary_key) != restore_state[:id]
415
+ @attributes.write_from_user(@primary_key, restore_state[:id])
416
+ end
417
+ freeze if restore_state[:frozen?]
446
418
  end
447
- freeze if restore_state[:frozen?]
448
419
  end
449
420
  end
450
- end
451
-
452
- # Determine if a record was created or destroyed in a transaction. State should be one of :new_record or :destroyed.
453
- def transaction_record_state(state) #:nodoc:
454
- @_start_transaction_state[state]
455
- end
456
421
 
457
- # Determine if a transaction included an action for :create, :update, or :destroy. Used in filtering callbacks.
458
- def transaction_include_any_action?(actions) #:nodoc:
459
- actions.any? do |action|
460
- case action
461
- when :create
462
- transaction_record_state(:new_record)
463
- when :destroy
464
- destroyed?
465
- when :update
466
- !(transaction_record_state(:new_record) || destroyed?)
422
+ # Determine if a transaction included an action for :create, :update, or :destroy. Used in filtering callbacks.
423
+ def transaction_include_any_action?(actions)
424
+ actions.any? do |action|
425
+ case action
426
+ when :create
427
+ persisted? && @_new_record_before_last_commit
428
+ when :update
429
+ !(@_new_record_before_last_commit || destroyed?) && _trigger_update_callback
430
+ when :destroy
431
+ _trigger_destroy_callback
432
+ end
467
433
  end
468
434
  end
469
- end
470
-
471
- private
472
435
 
473
- def set_transaction_state(state) # :nodoc:
474
- @transaction_state = state
475
- end
476
-
477
- def has_transactional_callbacks? # :nodoc:
478
- !_rollback_callbacks.empty? || !_commit_callbacks.empty? || !_before_commit_callbacks.empty?
479
- end
480
-
481
- # Updates the attributes on this particular Active Record object so that
482
- # if it's associated with a transaction, then the state of the Active Record
483
- # object will be updated to reflect the current state of the transaction
484
- #
485
- # The +@transaction_state+ variable stores the states of the associated
486
- # transaction. This relies on the fact that a transaction can only be in
487
- # one rollback or commit (otherwise a list of states would be required)
488
- # Each Active Record object inside of a transaction carries that transaction's
489
- # TransactionState.
490
- #
491
- # This method checks to see if the ActiveRecord object's state reflects
492
- # the TransactionState, and rolls back or commits the Active Record object
493
- # as appropriate.
494
- #
495
- # Since Active Record objects can be inside multiple transactions, this
496
- # method recursively goes through the parent of the TransactionState and
497
- # checks if the Active Record object reflects the state of the object.
498
- def sync_with_transaction_state
499
- update_attributes_from_transaction_state(@transaction_state)
500
- end
436
+ # Add the record to the current transaction so that the #after_rollback and #after_commit
437
+ # callbacks can be called.
438
+ def add_to_transaction(ensure_finalize = true)
439
+ self.class.connection.add_transaction_record(self, ensure_finalize)
440
+ end
501
441
 
502
- def update_attributes_from_transaction_state(transaction_state)
503
- if transaction_state && transaction_state.finalized?
504
- restore_transaction_record_state if transaction_state.rolledback?
505
- clear_transaction_record_state
442
+ def has_transactional_callbacks?
443
+ !_rollback_callbacks.empty? || !_commit_callbacks.empty? || !_before_commit_callbacks.empty?
506
444
  end
507
- end
508
445
  end
509
446
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Translation
3
5
  include ActiveModel::Translation
@@ -8,7 +10,7 @@ module ActiveRecord
8
10
  classes = [klass]
9
11
  return classes if klass == ActiveRecord::Base
10
12
 
11
- while klass != klass.base_class
13
+ while !klass.base_class?
12
14
  classes << klass = klass.superclass
13
15
  end
14
16
  classes
@@ -1,17 +1,22 @@
1
- require 'active_model/type'
1
+ # frozen_string_literal: true
2
2
 
3
- require 'active_record/type/internal/abstract_json'
4
- require 'active_record/type/internal/timezone'
3
+ require "active_model/type"
5
4
 
6
- require 'active_record/type/date'
7
- require 'active_record/type/date_time'
8
- require 'active_record/type/time'
5
+ require "active_record/type/internal/timezone"
9
6
 
10
- require 'active_record/type/serialized'
11
- require 'active_record/type/adapter_specific_registry'
7
+ require "active_record/type/date"
8
+ require "active_record/type/date_time"
9
+ require "active_record/type/decimal_without_scale"
10
+ require "active_record/type/json"
11
+ require "active_record/type/time"
12
+ require "active_record/type/text"
13
+ require "active_record/type/unsigned_integer"
12
14
 
13
- require 'active_record/type/type_map'
14
- require 'active_record/type/hash_lookup_type_map'
15
+ require "active_record/type/serialized"
16
+ require "active_record/type/adapter_specific_registry"
17
+
18
+ require "active_record/type/type_map"
19
+ require "active_record/type/hash_lookup_type_map"
15
20
 
16
21
  module ActiveRecord
17
22
  module Type
@@ -37,24 +42,29 @@ module ActiveRecord
37
42
  registry.lookup(*args, adapter: adapter, **kwargs)
38
43
  end
39
44
 
40
- private
45
+ def default_value # :nodoc:
46
+ @default_value ||= Value.new
47
+ end
41
48
 
42
- def current_adapter_name
43
- ActiveRecord::Base.connection.adapter_name.downcase.to_sym
49
+ def adapter_name_from(model) # :nodoc:
50
+ # TODO: this shouldn't depend on a connection to the database
51
+ model.connection.adapter_name.downcase.to_sym
44
52
  end
53
+
54
+ private
55
+ def current_adapter_name
56
+ adapter_name_from(ActiveRecord::Base)
57
+ end
45
58
  end
46
59
 
47
- Helpers = ActiveModel::Type::Helpers
48
60
  BigInteger = ActiveModel::Type::BigInteger
49
61
  Binary = ActiveModel::Type::Binary
50
62
  Boolean = ActiveModel::Type::Boolean
51
63
  Decimal = ActiveModel::Type::Decimal
52
- DecimalWithoutScale = ActiveModel::Type::DecimalWithoutScale
53
64
  Float = ActiveModel::Type::Float
54
65
  Integer = ActiveModel::Type::Integer
66
+ ImmutableString = ActiveModel::Type::ImmutableString
55
67
  String = ActiveModel::Type::String
56
- Text = ActiveModel::Type::Text
57
- UnsignedInteger = ActiveModel::Type::UnsignedInteger
58
68
  Value = ActiveModel::Type::Value
59
69
 
60
70
  register(:big_integer, Type::BigInteger, override: false)
@@ -65,6 +75,8 @@ module ActiveRecord
65
75
  register(:decimal, Type::Decimal, override: false)
66
76
  register(:float, Type::Float, override: false)
67
77
  register(:integer, Type::Integer, override: false)
78
+ register(:immutable_string, Type::ImmutableString, override: false)
79
+ register(:json, Type::Json, override: false)
68
80
  register(:string, Type::String, override: false)
69
81
  register(:text, Type::Text, override: false)
70
82
  register(:time, Type::Time, override: false)