activerecord 4.2.9 → 6.1.4.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 (374) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +964 -1382
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +15 -14
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/aggregations.rb +266 -251
  8. data/lib/active_record/association_relation.rb +40 -15
  9. data/lib/active_record/associations/alias_tracker.rb +40 -43
  10. data/lib/active_record/associations/association.rb +162 -69
  11. data/lib/active_record/associations/association_scope.rb +105 -130
  12. data/lib/active_record/associations/belongs_to_association.rb +83 -65
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
  14. data/lib/active_record/associations/builder/association.rb +57 -43
  15. data/lib/active_record/associations/builder/belongs_to.rb +74 -57
  16. data/lib/active_record/associations/builder/collection_association.rb +15 -37
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +49 -66
  18. data/lib/active_record/associations/builder/has_many.rb +13 -5
  19. data/lib/active_record/associations/builder/has_one.rb +44 -6
  20. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  21. data/lib/active_record/associations/collection_association.rb +148 -287
  22. data/lib/active_record/associations/collection_proxy.rb +252 -150
  23. data/lib/active_record/associations/foreign_association.rb +23 -1
  24. data/lib/active_record/associations/has_many_association.rb +56 -98
  25. data/lib/active_record/associations/has_many_through_association.rb +68 -89
  26. data/lib/active_record/associations/has_one_association.rb +73 -47
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +54 -81
  29. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  30. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  31. data/lib/active_record/associations/join_dependency.rb +174 -169
  32. data/lib/active_record/associations/preloader/association.rb +108 -115
  33. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  34. data/lib/active_record/associations/preloader.rb +97 -94
  35. data/lib/active_record/associations/singular_association.rb +18 -39
  36. data/lib/active_record/associations/through_association.rb +39 -19
  37. data/lib/active_record/associations.rb +1845 -1598
  38. data/lib/active_record/attribute_assignment.rb +59 -185
  39. data/lib/active_record/attribute_methods/before_type_cast.rb +18 -10
  40. data/lib/active_record/attribute_methods/dirty.rb +168 -148
  41. data/lib/active_record/attribute_methods/primary_key.rb +93 -83
  42. data/lib/active_record/attribute_methods/query.rb +8 -10
  43. data/lib/active_record/attribute_methods/read.rb +19 -79
  44. data/lib/active_record/attribute_methods/serialization.rb +49 -24
  45. data/lib/active_record/attribute_methods/time_zone_conversion.rb +55 -36
  46. data/lib/active_record/attribute_methods/write.rb +24 -55
  47. data/lib/active_record/attribute_methods.rb +149 -154
  48. data/lib/active_record/attributes.rb +234 -78
  49. data/lib/active_record/autosave_association.rb +133 -60
  50. data/lib/active_record/base.rb +46 -46
  51. data/lib/active_record/callbacks.rb +234 -79
  52. data/lib/active_record/coders/json.rb +3 -1
  53. data/lib/active_record/coders/yaml_column.rb +34 -13
  54. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +887 -323
  55. data/lib/active_record/connection_adapters/abstract/database_limits.rb +17 -41
  56. data/lib/active_record/connection_adapters/abstract/database_statements.rb +292 -124
  57. data/lib/active_record/connection_adapters/abstract/query_cache.rb +78 -24
  58. data/lib/active_record/connection_adapters/abstract/quoting.rb +177 -60
  59. data/lib/active_record/connection_adapters/abstract/savepoints.rb +8 -6
  60. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +157 -93
  61. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +473 -255
  62. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  63. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +869 -286
  64. data/lib/active_record/connection_adapters/abstract/transaction.rb +257 -91
  65. data/lib/active_record/connection_adapters/abstract_adapter.rb +483 -230
  66. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +557 -640
  67. data/lib/active_record/connection_adapters/column.rb +67 -40
  68. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  69. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
  70. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  71. data/lib/active_record/connection_adapters/mysql/database_statements.rb +194 -0
  72. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  73. data/lib/active_record/connection_adapters/mysql/quoting.rb +96 -0
  74. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +97 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +103 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +91 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  78. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
  79. data/lib/active_record/connection_adapters/mysql2_adapter.rb +80 -192
  80. data/lib/active_record/connection_adapters/pool_config.rb +73 -0
  81. data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +44 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +75 -160
  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 +8 -6
  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 +14 -19
  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/interval.rb +49 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  98. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  101. data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
  102. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
  103. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +70 -34
  104. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  105. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  106. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
  107. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  108. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  109. data/lib/active_record/connection_adapters/postgresql/oid.rb +25 -25
  110. data/lib/active_record/connection_adapters/postgresql/quoting.rb +145 -48
  111. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  112. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  114. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
  115. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +496 -298
  116. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
  117. data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
  118. data/lib/active_record/connection_adapters/postgresql_adapter.rb +588 -375
  119. data/lib/active_record/connection_adapters/schema_cache.rb +167 -29
  120. data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
  121. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
  122. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  123. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +21 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  126. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  127. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +170 -0
  128. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +322 -373
  129. data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
  130. data/lib/active_record/connection_adapters.rb +52 -0
  131. data/lib/active_record/connection_handling.rb +314 -41
  132. data/lib/active_record/core.rb +458 -241
  133. data/lib/active_record/counter_cache.rb +70 -49
  134. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  135. data/lib/active_record/database_configurations/database_config.rb +80 -0
  136. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  137. data/lib/active_record/database_configurations/url_config.rb +53 -0
  138. data/lib/active_record/database_configurations.rb +272 -0
  139. data/lib/active_record/delegated_type.rb +209 -0
  140. data/lib/active_record/destroy_association_async_job.rb +36 -0
  141. data/lib/active_record/dynamic_matchers.rb +87 -106
  142. data/lib/active_record/enum.rb +211 -92
  143. data/lib/active_record/errors.rb +224 -54
  144. data/lib/active_record/explain.rb +27 -11
  145. data/lib/active_record/explain_registry.rb +4 -2
  146. data/lib/active_record/explain_subscriber.rb +10 -5
  147. data/lib/active_record/fixture_set/file.rb +33 -14
  148. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  149. data/lib/active_record/fixture_set/render_context.rb +17 -0
  150. data/lib/active_record/fixture_set/table_row.rb +152 -0
  151. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  152. data/lib/active_record/fixtures.rb +275 -500
  153. data/lib/active_record/gem_version.rb +6 -4
  154. data/lib/active_record/inheritance.rb +175 -110
  155. data/lib/active_record/insert_all.rb +212 -0
  156. data/lib/active_record/integration.rb +121 -29
  157. data/lib/active_record/internal_metadata.rb +62 -0
  158. data/lib/active_record/legacy_yaml_adapter.rb +27 -5
  159. data/lib/active_record/locale/en.yml +3 -2
  160. data/lib/active_record/locking/optimistic.rb +98 -92
  161. data/lib/active_record/locking/pessimistic.rb +22 -6
  162. data/lib/active_record/log_subscriber.rb +93 -31
  163. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  164. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  165. data/lib/active_record/middleware/database_selector.rb +77 -0
  166. data/lib/active_record/migration/command_recorder.rb +185 -90
  167. data/lib/active_record/migration/compatibility.rb +295 -0
  168. data/lib/active_record/migration/join_table.rb +8 -7
  169. data/lib/active_record/migration.rb +673 -325
  170. data/lib/active_record/model_schema.rb +418 -113
  171. data/lib/active_record/nested_attributes.rb +263 -224
  172. data/lib/active_record/no_touching.rb +15 -2
  173. data/lib/active_record/null_relation.rb +24 -38
  174. data/lib/active_record/persistence.rb +572 -136
  175. data/lib/active_record/query_cache.rb +29 -23
  176. data/lib/active_record/querying.rb +50 -31
  177. data/lib/active_record/railtie.rb +170 -51
  178. data/lib/active_record/railties/console_sandbox.rb +3 -3
  179. data/lib/active_record/railties/controller_runtime.rb +34 -33
  180. data/lib/active_record/railties/databases.rake +523 -199
  181. data/lib/active_record/readonly_attributes.rb +9 -4
  182. data/lib/active_record/reflection.rb +454 -291
  183. data/lib/active_record/relation/batches/batch_enumerator.rb +85 -0
  184. data/lib/active_record/relation/batches.rb +217 -59
  185. data/lib/active_record/relation/calculations.rb +324 -249
  186. data/lib/active_record/relation/delegation.rb +76 -84
  187. data/lib/active_record/relation/finder_methods.rb +316 -242
  188. data/lib/active_record/relation/from_clause.rb +30 -0
  189. data/lib/active_record/relation/merger.rb +95 -103
  190. data/lib/active_record/relation/predicate_builder/array_handler.rb +26 -26
  191. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
  192. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  193. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +57 -0
  194. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  195. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  196. data/lib/active_record/relation/predicate_builder.rb +136 -122
  197. data/lib/active_record/relation/query_attribute.rb +50 -0
  198. data/lib/active_record/relation/query_methods.rb +757 -413
  199. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  200. data/lib/active_record/relation/spawn_methods.rb +18 -20
  201. data/lib/active_record/relation/where_clause.rb +239 -0
  202. data/lib/active_record/relation.rb +554 -343
  203. data/lib/active_record/result.rb +91 -47
  204. data/lib/active_record/runtime_registry.rb +6 -4
  205. data/lib/active_record/sanitization.rb +134 -122
  206. data/lib/active_record/schema.rb +21 -24
  207. data/lib/active_record/schema_dumper.rb +141 -92
  208. data/lib/active_record/schema_migration.rb +24 -23
  209. data/lib/active_record/scoping/default.rb +96 -83
  210. data/lib/active_record/scoping/named.rb +78 -36
  211. data/lib/active_record/scoping.rb +45 -27
  212. data/lib/active_record/secure_token.rb +48 -0
  213. data/lib/active_record/serialization.rb +8 -6
  214. data/lib/active_record/signed_id.rb +116 -0
  215. data/lib/active_record/statement_cache.rb +89 -36
  216. data/lib/active_record/store.rb +128 -43
  217. data/lib/active_record/suppressor.rb +61 -0
  218. data/lib/active_record/table_metadata.rb +81 -0
  219. data/lib/active_record/tasks/database_tasks.rb +364 -130
  220. data/lib/active_record/tasks/mysql_database_tasks.rb +67 -113
  221. data/lib/active_record/tasks/postgresql_database_tasks.rb +86 -49
  222. data/lib/active_record/tasks/sqlite_database_tasks.rb +44 -19
  223. data/lib/active_record/test_databases.rb +24 -0
  224. data/lib/active_record/test_fixtures.rb +287 -0
  225. data/lib/active_record/timestamp.rb +86 -43
  226. data/lib/active_record/touch_later.rb +65 -0
  227. data/lib/active_record/transactions.rb +182 -163
  228. data/lib/active_record/translation.rb +3 -1
  229. data/lib/active_record/type/adapter_specific_registry.rb +126 -0
  230. data/lib/active_record/type/date.rb +4 -45
  231. data/lib/active_record/type/date_time.rb +4 -49
  232. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  233. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  234. data/lib/active_record/type/internal/timezone.rb +17 -0
  235. data/lib/active_record/type/json.rb +30 -0
  236. data/lib/active_record/type/serialized.rb +27 -15
  237. data/lib/active_record/type/text.rb +2 -2
  238. data/lib/active_record/type/time.rb +21 -16
  239. data/lib/active_record/type/type_map.rb +16 -19
  240. data/lib/active_record/type/unsigned_integer.rb +9 -8
  241. data/lib/active_record/type.rb +84 -23
  242. data/lib/active_record/type_caster/connection.rb +33 -0
  243. data/lib/active_record/type_caster/map.rb +23 -0
  244. data/lib/active_record/type_caster.rb +9 -0
  245. data/lib/active_record/validations/absence.rb +25 -0
  246. data/lib/active_record/validations/associated.rb +12 -4
  247. data/lib/active_record/validations/length.rb +26 -0
  248. data/lib/active_record/validations/numericality.rb +35 -0
  249. data/lib/active_record/validations/presence.rb +14 -13
  250. data/lib/active_record/validations/uniqueness.rb +63 -56
  251. data/lib/active_record/validations.rb +39 -35
  252. data/lib/active_record/version.rb +3 -1
  253. data/lib/active_record.rb +42 -29
  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/and.rb +32 -0
  269. data/lib/arel/nodes/ascending.rb +23 -0
  270. data/lib/arel/nodes/binary.rb +126 -0
  271. data/lib/arel/nodes/bind_param.rb +44 -0
  272. data/lib/arel/nodes/case.rb +55 -0
  273. data/lib/arel/nodes/casted.rb +62 -0
  274. data/lib/arel/nodes/comment.rb +29 -0
  275. data/lib/arel/nodes/count.rb +12 -0
  276. data/lib/arel/nodes/delete_statement.rb +45 -0
  277. data/lib/arel/nodes/descending.rb +23 -0
  278. data/lib/arel/nodes/equality.rb +15 -0
  279. data/lib/arel/nodes/extract.rb +24 -0
  280. data/lib/arel/nodes/false.rb +16 -0
  281. data/lib/arel/nodes/full_outer_join.rb +8 -0
  282. data/lib/arel/nodes/function.rb +44 -0
  283. data/lib/arel/nodes/grouping.rb +11 -0
  284. data/lib/arel/nodes/homogeneous_in.rb +76 -0
  285. data/lib/arel/nodes/in.rb +15 -0
  286. data/lib/arel/nodes/infix_operation.rb +92 -0
  287. data/lib/arel/nodes/inner_join.rb +8 -0
  288. data/lib/arel/nodes/insert_statement.rb +37 -0
  289. data/lib/arel/nodes/join_source.rb +20 -0
  290. data/lib/arel/nodes/matches.rb +18 -0
  291. data/lib/arel/nodes/named_function.rb +23 -0
  292. data/lib/arel/nodes/node.rb +51 -0
  293. data/lib/arel/nodes/node_expression.rb +13 -0
  294. data/lib/arel/nodes/ordering.rb +27 -0
  295. data/lib/arel/nodes/outer_join.rb +8 -0
  296. data/lib/arel/nodes/over.rb +15 -0
  297. data/lib/arel/nodes/regexp.rb +16 -0
  298. data/lib/arel/nodes/right_outer_join.rb +8 -0
  299. data/lib/arel/nodes/select_core.rb +67 -0
  300. data/lib/arel/nodes/select_statement.rb +41 -0
  301. data/lib/arel/nodes/sql_literal.rb +19 -0
  302. data/lib/arel/nodes/string_join.rb +11 -0
  303. data/lib/arel/nodes/table_alias.rb +31 -0
  304. data/lib/arel/nodes/terminal.rb +16 -0
  305. data/lib/arel/nodes/true.rb +16 -0
  306. data/lib/arel/nodes/unary.rb +44 -0
  307. data/lib/arel/nodes/unary_operation.rb +20 -0
  308. data/lib/arel/nodes/unqualified_column.rb +22 -0
  309. data/lib/arel/nodes/update_statement.rb +41 -0
  310. data/lib/arel/nodes/values_list.rb +9 -0
  311. data/lib/arel/nodes/window.rb +126 -0
  312. data/lib/arel/nodes/with.rb +11 -0
  313. data/lib/arel/nodes.rb +70 -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/dot.rb +308 -0
  321. data/lib/arel/visitors/mysql.rb +93 -0
  322. data/lib/arel/visitors/postgresql.rb +120 -0
  323. data/lib/arel/visitors/sqlite.rb +38 -0
  324. data/lib/arel/visitors/to_sql.rb +899 -0
  325. data/lib/arel/visitors/visitor.rb +45 -0
  326. data/lib/arel/visitors.rb +13 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/arel.rb +54 -0
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  330. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  331. data/lib/rails/generators/active_record/migration/migration_generator.rb +43 -37
  332. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +26 -0
  333. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +13 -4
  334. data/lib/rails/generators/active_record/migration.rb +35 -1
  335. data/lib/rails/generators/active_record/model/model_generator.rb +55 -22
  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.tt +22 -0
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  339. data/lib/rails/generators/active_record.rb +7 -5
  340. metadata +172 -65
  341. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  342. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  343. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  344. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  345. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  346. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  347. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  348. data/lib/active_record/attribute.rb +0 -163
  349. data/lib/active_record/attribute_decorators.rb +0 -66
  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/connection_specification.rb +0 -275
  353. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
  354. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  355. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  356. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  357. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  358. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  359. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  360. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  361. data/lib/active_record/type/big_integer.rb +0 -13
  362. data/lib/active_record/type/binary.rb +0 -50
  363. data/lib/active_record/type/boolean.rb +0 -31
  364. data/lib/active_record/type/decimal.rb +0 -64
  365. data/lib/active_record/type/decorator.rb +0 -14
  366. data/lib/active_record/type/float.rb +0 -19
  367. data/lib/active_record/type/integer.rb +0 -59
  368. data/lib/active_record/type/mutable.rb +0 -16
  369. data/lib/active_record/type/numeric.rb +0 -36
  370. data/lib/active_record/type/string.rb +0 -40
  371. data/lib/active_record/type/time_value.rb +0 -38
  372. data/lib/active_record/type/value.rb +0 -110
  373. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  374. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module Validations
5
+ class LengthValidator < ActiveModel::Validations::LengthValidator # :nodoc:
6
+ def validate_each(record, attribute, association_or_value)
7
+ if association_or_value.respond_to?(:loaded?) && association_or_value.loaded?
8
+ association_or_value = association_or_value.target.reject(&:marked_for_destruction?)
9
+ end
10
+ super
11
+ end
12
+ end
13
+
14
+ module ClassMethods
15
+ # Validates that the specified attributes match the length restrictions supplied.
16
+ # If the attribute is an association, records that are marked for destruction are not counted.
17
+ #
18
+ # See ActiveModel::Validations::HelperMethods.validates_length_of for more information.
19
+ def validates_length_of(*attr_names)
20
+ validates_with LengthValidator, _merge_attributes(attr_names)
21
+ end
22
+
23
+ alias_method :validates_size_of, :validates_length_of
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module Validations
5
+ class NumericalityValidator < ActiveModel::Validations::NumericalityValidator # :nodoc:
6
+ def validate_each(record, attribute, value, precision: nil, scale: nil)
7
+ precision = [column_precision_for(record, attribute) || Float::DIG, Float::DIG].min
8
+ scale = column_scale_for(record, attribute)
9
+ super(record, attribute, value, precision: precision, scale: scale)
10
+ end
11
+
12
+ private
13
+ def column_precision_for(record, attribute)
14
+ record.class.type_for_attribute(attribute.to_s)&.precision
15
+ end
16
+
17
+ def column_scale_for(record, attribute)
18
+ record.class.type_for_attribute(attribute.to_s)&.scale
19
+ end
20
+ end
21
+
22
+ module ClassMethods
23
+ # Validates whether the value of the specified attribute is numeric by
24
+ # trying to convert it to a float with Kernel.Float (if <tt>only_integer</tt>
25
+ # is +false+) or applying it to the regular expression <tt>/\A[\+\-]?\d+\z/</tt>
26
+ # (if <tt>only_integer</tt> is set to +true+). Kernel.Float precision
27
+ # defaults to the column's precision value or 15.
28
+ #
29
+ # See ActiveModel::Validations::HelperMethods.validates_numericality_of for more information.
30
+ def validates_numericality_of(*attr_names)
31
+ validates_with NumericalityValidator, _merge_attributes(attr_names)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,17 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Validations
3
5
  class PresenceValidator < ActiveModel::Validations::PresenceValidator # :nodoc:
4
- def validate(record)
5
- super
6
- attributes.each do |attribute|
7
- next unless record.class._reflect_on_association(attribute)
8
- associated_records = Array.wrap(record.send(attribute))
9
-
10
- # Superclass validates presence. Ensure present records aren't about to be destroyed.
11
- if associated_records.present? && associated_records.all? { |r| r.marked_for_destruction? }
12
- record.errors.add(attribute, :blank, options)
13
- end
6
+ def validate_each(record, attribute, association_or_value)
7
+ if record.class._reflect_on_association(attribute)
8
+ association_or_value = Array.wrap(association_or_value).reject(&:marked_for_destruction?)
14
9
  end
10
+ super
15
11
  end
16
12
  end
17
13
 
@@ -36,16 +32,21 @@ module ActiveRecord
36
32
  # This is due to the way Object#blank? handles boolean values:
37
33
  # <tt>false.blank? # => true</tt>.
38
34
  #
39
- # This validator defers to the ActiveModel validation for presence, adding the
35
+ # This validator defers to the Active Model validation for presence, adding the
40
36
  # check to see that an associated object is not marked for destruction. This
41
37
  # prevents the parent object from validating successfully and saving, which then
42
38
  # deletes the associated object, thus putting the parent object into an invalid
43
39
  # state.
44
40
  #
41
+ # NOTE: This validation will not fail while using it with an association
42
+ # if the latter was assigned but not valid. If you want to ensure that
43
+ # it is both present and valid, you also need to use
44
+ # {validates_associated}[rdoc-ref:Validations::ClassMethods#validates_associated].
45
+ #
45
46
  # Configuration options:
46
47
  # * <tt>:message</tt> - A custom error message (default is: "can't be blank").
47
48
  # * <tt>:on</tt> - Specifies the contexts where this validation is active.
48
- # Runs in all validation contexts by default (nil). You can pass a symbol
49
+ # Runs in all validation contexts by default +nil+. You can pass a symbol
49
50
  # or an array of symbols. (e.g. <tt>on: :create</tt> or
50
51
  # <tt>on: :custom_validation_context</tt> or
51
52
  # <tt>on: [:create, :custom_validation_context]</tt>)
@@ -58,7 +59,7 @@ module ActiveRecord
58
59
  # or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The method,
59
60
  # proc or string should return or evaluate to a +true+ or +false+ value.
60
61
  # * <tt>:strict</tt> - Specifies whether validation should be strict.
61
- # See <tt>ActiveModel::Validation#validates!</tt> for more information.
62
+ # See ActiveModel::Validations#validates! for more information.
62
63
  def validates_presence_of(*attr_names)
63
64
  validates_with PresenceValidator, _merge_attributes(attr_names)
64
65
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Validations
3
5
  class UniquenessValidator < ActiveModel::EachValidator # :nodoc:
@@ -6,46 +8,53 @@ module ActiveRecord
6
8
  raise ArgumentError, "#{options[:conditions]} was passed as :conditions but is not callable. " \
7
9
  "Pass a callable instead: `conditions: -> { where(approved: true) }`"
8
10
  end
9
- super({ case_sensitive: true }.merge!(options))
11
+ unless Array(options[:scope]).all? { |scope| scope.respond_to?(:to_sym) }
12
+ raise ArgumentError, "#{options[:scope]} is not supported format for :scope option. " \
13
+ "Pass a symbol or an array of symbols instead: `scope: :user_id`"
14
+ end
15
+ super
10
16
  @klass = options[:class]
11
17
  end
12
18
 
13
19
  def validate_each(record, attribute, value)
14
20
  finder_class = find_finder_class_for(record)
15
- table = finder_class.arel_table
16
21
  value = map_enum_attribute(finder_class, attribute, value)
17
22
 
18
- begin
19
- relation = build_relation(finder_class, table, attribute, value)
20
- if record.persisted?
21
- if finder_class.primary_key
22
- relation = relation.and(table[finder_class.primary_key.to_sym].not_eq(record.id))
23
- else
24
- raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.")
25
- end
23
+ relation = build_relation(finder_class, attribute, value)
24
+ if record.persisted?
25
+ if finder_class.primary_key
26
+ relation = relation.where.not(finder_class.primary_key => record.id_in_database)
27
+ else
28
+ raise UnknownPrimaryKey.new(finder_class, "Cannot validate uniqueness for persisted record without primary key.")
29
+ end
30
+ end
31
+ relation = scope_relation(record, relation)
32
+
33
+ if options[:conditions]
34
+ conditions = options[:conditions]
35
+
36
+ relation = if conditions.arity.zero?
37
+ relation.instance_exec(&conditions)
38
+ else
39
+ relation.instance_exec(record, &conditions)
26
40
  end
27
- relation = scope_relation(record, table, relation)
28
- relation = finder_class.unscoped.where(relation)
29
- relation = relation.merge(options[:conditions]) if options[:conditions]
30
- rescue RangeError
31
- relation = finder_class.none
32
41
  end
33
42
 
34
43
  if relation.exists?
35
44
  error_options = options.except(:case_sensitive, :scope, :conditions)
36
45
  error_options[:value] = value
37
46
 
38
- record.errors.add(attribute, :taken, error_options)
47
+ record.errors.add(attribute, :taken, **error_options)
39
48
  end
40
49
  end
41
50
 
42
- protected
51
+ private
43
52
  # The check for an existing value should be run from a class that
44
53
  # isn't abstract. This means working down from the current class
45
54
  # (self), to the first non-abstract class. Since classes don't know
46
55
  # their subclasses, we have to build the hierarchy between self and
47
56
  # the record's class.
48
- def find_finder_class_for(record) #:nodoc:
57
+ def find_finder_class_for(record)
49
58
  class_hierarchy = [record.class]
50
59
 
51
60
  while class_hierarchy.first != @klass
@@ -55,43 +64,32 @@ module ActiveRecord
55
64
  class_hierarchy.detect { |klass| !klass.abstract_class? }
56
65
  end
57
66
 
58
- def build_relation(klass, table, attribute, value) #:nodoc:
59
- if reflection = klass._reflect_on_association(attribute)
60
- attribute = reflection.foreign_key
61
- value = value.attributes[reflection.klass.primary_key] unless value.nil?
62
- end
63
-
64
- attribute_name = attribute.to_s
67
+ def build_relation(klass, attribute, value)
68
+ relation = klass.unscoped
69
+ comparison = relation.bind_attribute(attribute, value) do |attr, bind|
70
+ return relation.none! if bind.unboundable?
65
71
 
66
- # the attribute may be an aliased attribute
67
- if klass.attribute_aliases[attribute_name]
68
- attribute = klass.attribute_aliases[attribute_name]
69
- attribute_name = attribute.to_s
70
- end
71
-
72
- column = klass.columns_hash[attribute_name]
73
- value = klass.connection.type_cast(value, column)
74
- if value.is_a?(String) && column.limit
75
- value = value.to_s[0, column.limit]
72
+ if !options.key?(:case_sensitive) || bind.nil?
73
+ klass.connection.default_uniqueness_comparison(attr, bind)
74
+ elsif options[:case_sensitive]
75
+ klass.connection.case_sensitive_comparison(attr, bind)
76
+ else
77
+ # will use SQL LOWER function before comparison, unless it detects a case insensitive collation
78
+ klass.connection.case_insensitive_comparison(attr, bind)
79
+ end
76
80
  end
77
81
 
78
- if !options[:case_sensitive] && value && column.text?
79
- # will use SQL LOWER function before comparison, unless it detects a case insensitive collation
80
- klass.connection.case_insensitive_comparison(table, attribute, column, value)
81
- else
82
- klass.connection.case_sensitive_comparison(table, attribute, column, value)
83
- end
82
+ relation.where!(comparison)
84
83
  end
85
84
 
86
- def scope_relation(record, table, relation)
85
+ def scope_relation(record, relation)
87
86
  Array(options[:scope]).each do |scope_item|
88
- if reflection = record.class._reflect_on_association(scope_item)
89
- scope_value = record.send(reflection.foreign_key)
90
- scope_item = reflection.foreign_key
87
+ scope_value = if record.class._reflect_on_association(scope_item)
88
+ record.association(scope_item).reader
91
89
  else
92
- scope_value = record._read_attribute(scope_item)
90
+ record.read_attribute(scope_item)
93
91
  end
94
- relation = relation.and(table[scope_item].eq(scope_value))
92
+ relation = relation.where(scope_item => scope_value)
95
93
  end
96
94
 
97
95
  relation
@@ -137,6 +135,17 @@ module ActiveRecord
137
135
  # validates_uniqueness_of :title, conditions: -> { where.not(status: 'archived') }
138
136
  # end
139
137
  #
138
+ # To build conditions based on the record's state, define the conditions
139
+ # callable with a parameter, which will be the record itself. This
140
+ # example validates the title is unique for the year of publication:
141
+ #
142
+ # class Article < ActiveRecord::Base
143
+ # validates_uniqueness_of :title, conditions: ->(article) {
144
+ # published_at = article.published_at
145
+ # where(published_at: published_at.beginning_of_year..published_at.end_of_year)
146
+ # }
147
+ # end
148
+ #
140
149
  # When the record is created, a check is performed to make sure that no
141
150
  # record exists in the database with the given value for the specified
142
151
  # attribute (that maps to a column). When the record is updated,
@@ -169,7 +178,8 @@ module ActiveRecord
169
178
  #
170
179
  # === Concurrency and integrity
171
180
  #
172
- # Using this validation method in conjunction with ActiveRecord::Base#save
181
+ # Using this validation method in conjunction with
182
+ # {ActiveRecord::Base#save}[rdoc-ref:Persistence#save]
173
183
  # does not guarantee the absence of duplicate record insertions, because
174
184
  # uniqueness checks on the application level are inherently prone to race
175
185
  # conditions. For example, suppose that two users try to post a Comment at
@@ -203,21 +213,19 @@ module ActiveRecord
203
213
  # | # Boom! We now have a duplicate
204
214
  # | # title!
205
215
  #
206
- # This could even happen if you use transactions with the 'serializable'
207
- # isolation level. The best way to work around this problem is to add a unique
208
- # index to the database table using
209
- # ActiveRecord::ConnectionAdapters::SchemaStatements#add_index. In the
210
- # rare case that a race condition occurs, the database will guarantee
216
+ # The best way to work around this problem is to add a unique index to the database table using
217
+ # {connection.add_index}[rdoc-ref:ConnectionAdapters::SchemaStatements#add_index].
218
+ # In the rare case that a race condition occurs, the database will guarantee
211
219
  # the field's uniqueness.
212
220
  #
213
221
  # When the database catches such a duplicate insertion,
214
- # ActiveRecord::Base#save will raise an ActiveRecord::StatementInvalid
222
+ # {ActiveRecord::Base#save}[rdoc-ref:Persistence#save] will raise an ActiveRecord::StatementInvalid
215
223
  # exception. You can either choose to let this error propagate (which
216
224
  # will result in the default Rails exception page being shown), or you
217
225
  # can catch it and restart the transaction (e.g. by telling the user
218
226
  # that the title already exists, and asking them to re-enter the title).
219
227
  # This technique is also known as
220
- # {optimistic concurrency control}[http://en.wikipedia.org/wiki/Optimistic_concurrency_control].
228
+ # {optimistic concurrency control}[https://en.wikipedia.org/wiki/Optimistic_concurrency_control].
221
229
  #
222
230
  # The bundled ActiveRecord::ConnectionAdapters distinguish unique index
223
231
  # constraint errors from other types of database errors by throwing an
@@ -227,7 +235,6 @@ module ActiveRecord
227
235
  #
228
236
  # The following bundled adapters throw the ActiveRecord::RecordNotUnique exception:
229
237
  #
230
- # * ActiveRecord::ConnectionAdapters::MysqlAdapter.
231
238
  # * ActiveRecord::ConnectionAdapters::Mysql2Adapter.
232
239
  # * ActiveRecord::ConnectionAdapters::SQLite3Adapter.
233
240
  # * ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
- # = Active Record RecordInvalid
4
+ # = Active Record \RecordInvalid
3
5
  #
4
- # Raised by <tt>save!</tt> and <tt>create!</tt> when the record is invalid. Use the
5
- # +record+ method to retrieve the record which did not validate.
6
+ # Raised by {ActiveRecord::Base#save!}[rdoc-ref:Persistence#save!] and
7
+ # {ActiveRecord::Base#create!}[rdoc-ref:Persistence::ClassMethods#create!] when the record is invalid.
8
+ # Use the #record method to retrieve the record which did not validate.
6
9
  #
7
10
  # begin
8
11
  # complex_operation_that_internally_calls_save!
@@ -12,74 +15,72 @@ module ActiveRecord
12
15
  class RecordInvalid < ActiveRecordError
13
16
  attr_reader :record
14
17
 
15
- def initialize(record)
16
- @record = record
17
- errors = @record.errors.full_messages.join(", ")
18
- super(I18n.t(:"#{@record.class.i18n_scope}.errors.messages.record_invalid", :errors => errors, :default => :"errors.messages.record_invalid"))
18
+ def initialize(record = nil)
19
+ if record
20
+ @record = record
21
+ errors = @record.errors.full_messages.join(", ")
22
+ message = I18n.t(:"#{@record.class.i18n_scope}.errors.messages.record_invalid", errors: errors, default: :"errors.messages.record_invalid")
23
+ else
24
+ message = "Record invalid"
25
+ end
26
+
27
+ super(message)
19
28
  end
20
29
  end
21
30
 
22
- # = Active Record Validations
31
+ # = Active Record \Validations
23
32
  #
24
- # Active Record includes the majority of its validations from <tt>ActiveModel::Validations</tt>
33
+ # Active Record includes the majority of its validations from ActiveModel::Validations
25
34
  # all of which accept the <tt>:on</tt> argument to define the context where the
26
35
  # validations are active. Active Record will always supply either the context of
27
36
  # <tt>:create</tt> or <tt>:update</tt> dependent on whether the model is a
28
- # <tt>new_record?</tt>.
37
+ # {new_record?}[rdoc-ref:Persistence#new_record?].
29
38
  module Validations
30
39
  extend ActiveSupport::Concern
31
40
  include ActiveModel::Validations
32
41
 
33
42
  # The validation process on save can be skipped by passing <tt>validate: false</tt>.
34
- # The regular Base#save method is replaced with this when the validations
35
- # module is mixed in, which it is by default.
36
- def save(options={})
43
+ # The validation context can be changed by passing <tt>context: context</tt>.
44
+ # The regular {ActiveRecord::Base#save}[rdoc-ref:Persistence#save] method is replaced
45
+ # with this when the validations module is mixed in, which it is by default.
46
+ def save(**options)
37
47
  perform_validations(options) ? super : false
38
48
  end
39
49
 
40
- # Attempts to save the record just like Base#save but will raise a +RecordInvalid+
41
- # exception instead of returning +false+ if the record is not valid.
42
- def save!(options={})
43
- perform_validations(options) ? super : raise_record_invalid
50
+ # Attempts to save the record just like {ActiveRecord::Base#save}[rdoc-ref:Base#save] but
51
+ # will raise an ActiveRecord::RecordInvalid exception instead of returning +false+ if the record is not valid.
52
+ def save!(**options)
53
+ perform_validations(options) ? super : raise_validation_error
44
54
  end
45
55
 
46
56
  # Runs all the validations within the specified context. Returns +true+ if
47
57
  # no errors are found, +false+ otherwise.
48
58
  #
49
- # Aliased as validate.
59
+ # Aliased as #validate.
50
60
  #
51
61
  # If the argument is +false+ (default is +nil+), the context is set to <tt>:create</tt> if
52
- # <tt>new_record?</tt> is +true+, and to <tt>:update</tt> if it is not.
62
+ # {new_record?}[rdoc-ref:Persistence#new_record?] is +true+, and to <tt>:update</tt> if it is not.
53
63
  #
54
- # Validations with no <tt>:on</tt> option will run no matter the context. Validations with
64
+ # \Validations with no <tt>:on</tt> option will run no matter the context. \Validations with
55
65
  # some <tt>:on</tt> option will only run in the specified context.
56
66
  def valid?(context = nil)
57
- context ||= (new_record? ? :create : :update)
67
+ context ||= default_validation_context
58
68
  output = super(context)
59
69
  errors.empty? && output
60
70
  end
61
71
 
62
72
  alias_method :validate, :valid?
63
73
 
64
- # Runs all the validations within the specified context. Returns +true+ if
65
- # no errors are found, raises +RecordInvalid+ otherwise.
66
- #
67
- # If the argument is +false+ (default is +nil+), the context is set to <tt>:create</tt> if
68
- # <tt>new_record?</tt> is +true+, and to <tt>:update</tt> if it is not.
69
- #
70
- # Validations with no <tt>:on</tt> option will run no matter the context. Validations with
71
- # some <tt>:on</tt> option will only run in the specified context.
72
- def validate!(context = nil)
73
- valid?(context) || raise_record_invalid
74
+ private
75
+ def default_validation_context
76
+ new_record? ? :create : :update
74
77
  end
75
78
 
76
- protected
77
-
78
- def raise_record_invalid
79
+ def raise_validation_error
79
80
  raise(RecordInvalid.new(self))
80
81
  end
81
82
 
82
- def perform_validations(options={}) # :nodoc:
83
+ def perform_validations(options = {})
83
84
  options[:validate] == false || valid?(options[:context])
84
85
  end
85
86
  end
@@ -88,3 +89,6 @@ end
88
89
  require "active_record/validations/associated"
89
90
  require "active_record/validations/uniqueness"
90
91
  require "active_record/validations/presence"
92
+ require "active_record/validations/absence"
93
+ require "active_record/validations/length"
94
+ require "active_record/validations/numericality"
@@ -1,4 +1,6 @@
1
- require_relative 'gem_version'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "gem_version"
2
4
 
3
5
  module ActiveRecord
4
6
  # Returns the version of the currently loaded ActiveRecord as a <tt>Gem::Version</tt>
data/lib/active_record.rb CHANGED
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
- # Copyright (c) 2004-2014 David Heinemeier Hansson
4
+ # Copyright (c) 2004-2020 David Heinemeier Hansson
3
5
  #
4
6
  # Permission is hereby granted, free of charge, to any person obtaining
5
7
  # a copy of this software and associated documentation files (the
@@ -21,38 +23,42 @@
21
23
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
24
  #++
23
25
 
24
- require 'active_support'
25
- require 'active_support/rails'
26
- require 'active_model'
27
- require 'arel'
26
+ require "active_support"
27
+ require "active_support/rails"
28
+ require "active_model"
29
+ require "arel"
30
+ require "yaml"
28
31
 
29
- require 'active_record/version'
30
- require 'active_record/attribute_set'
32
+ require "active_record/version"
33
+ require "active_model/attribute_set"
34
+ require "active_record/errors"
31
35
 
32
36
  module ActiveRecord
33
37
  extend ActiveSupport::Autoload
34
38
 
35
- autoload :Attribute
36
39
  autoload :Base
37
40
  autoload :Callbacks
38
41
  autoload :Core
39
42
  autoload :ConnectionHandling
40
43
  autoload :CounterCache
41
44
  autoload :DynamicMatchers
45
+ autoload :DelegatedType
42
46
  autoload :Enum
47
+ autoload :InternalMetadata
43
48
  autoload :Explain
44
49
  autoload :Inheritance
45
50
  autoload :Integration
46
51
  autoload :Migration
47
- autoload :Migrator, 'active_record/migration'
52
+ autoload :Migrator, "active_record/migration"
48
53
  autoload :ModelSchema
49
54
  autoload :NestedAttributes
50
55
  autoload :NoTouching
56
+ autoload :TouchLater
51
57
  autoload :Persistence
52
58
  autoload :QueryCache
53
59
  autoload :Querying
54
60
  autoload :ReadonlyAttributes
55
- autoload :RecordInvalid, 'active_record/validations'
61
+ autoload :RecordInvalid, "active_record/validations"
56
62
  autoload :Reflection
57
63
  autoload :RuntimeRegistry
58
64
  autoload :Sanitization
@@ -63,15 +69,17 @@ module ActiveRecord
63
69
  autoload :Serialization
64
70
  autoload :StatementCache
65
71
  autoload :Store
72
+ autoload :SignedId
73
+ autoload :Suppressor
66
74
  autoload :Timestamp
67
75
  autoload :Transactions
68
76
  autoload :Translation
69
77
  autoload :Validations
78
+ autoload :SecureToken
79
+ autoload :DestroyAssociationAsyncJob
70
80
 
71
81
  eager_autoload do
72
- autoload :ActiveRecordError, 'active_record/errors'
73
- autoload :ConnectionNotEstablished, 'active_record/errors'
74
- autoload :ConnectionAdapters, 'active_record/connection_adapters/abstract_adapter'
82
+ autoload :ConnectionAdapters
75
83
 
76
84
  autoload :Aggregations
77
85
  autoload :Associations
@@ -85,7 +93,7 @@ module ActiveRecord
85
93
  autoload :AssociationRelation
86
94
  autoload :NullRelation
87
95
 
88
- autoload_under 'relation' do
96
+ autoload_under "relation" do
89
97
  autoload :QueryMethods
90
98
  autoload :FinderMethods
91
99
  autoload :Calculations
@@ -96,11 +104,13 @@ module ActiveRecord
96
104
  end
97
105
 
98
106
  autoload :Result
107
+ autoload :TableMetadata
108
+ autoload :Type
99
109
  end
100
110
 
101
111
  module Coders
102
- autoload :YAMLColumn, 'active_record/coders/yaml_column'
103
- autoload :JSON, 'active_record/coders/json'
112
+ autoload :YAMLColumn, "active_record/coders/yaml_column"
113
+ autoload :JSON, "active_record/coders/json"
104
114
  end
105
115
 
106
116
  module AttributeMethods
@@ -127,35 +137,33 @@ module ActiveRecord
127
137
  end
128
138
  end
129
139
 
130
- module ConnectionAdapters
140
+ module Scoping
131
141
  extend ActiveSupport::Autoload
132
142
 
133
143
  eager_autoload do
134
- autoload :AbstractAdapter
135
- autoload :ConnectionManagement, "active_record/connection_adapters/abstract/connection_pool"
144
+ autoload :Named
145
+ autoload :Default
136
146
  end
137
147
  end
138
148
 
139
- module Scoping
149
+ module Middleware
140
150
  extend ActiveSupport::Autoload
141
151
 
142
- eager_autoload do
143
- autoload :Named
144
- autoload :Default
145
- end
152
+ autoload :DatabaseSelector, "active_record/middleware/database_selector"
146
153
  end
147
154
 
148
155
  module Tasks
149
156
  extend ActiveSupport::Autoload
150
157
 
151
158
  autoload :DatabaseTasks
152
- autoload :SQLiteDatabaseTasks, 'active_record/tasks/sqlite_database_tasks'
153
- autoload :MySQLDatabaseTasks, 'active_record/tasks/mysql_database_tasks'
159
+ autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
160
+ autoload :MySQLDatabaseTasks, "active_record/tasks/mysql_database_tasks"
154
161
  autoload :PostgreSQLDatabaseTasks,
155
- 'active_record/tasks/postgresql_database_tasks'
162
+ "active_record/tasks/postgresql_database_tasks"
156
163
  end
157
164
 
158
- autoload :TestFixtures, 'active_record/fixtures'
165
+ autoload :TestDatabases, "active_record/test_databases"
166
+ autoload :TestFixtures, "active_record/fixtures"
159
167
 
160
168
  def self.eager_load!
161
169
  super
@@ -172,5 +180,10 @@ ActiveSupport.on_load(:active_record) do
172
180
  end
173
181
 
174
182
  ActiveSupport.on_load(:i18n) do
175
- I18n.load_path << File.dirname(__FILE__) + '/active_record/locale/en.yml'
183
+ I18n.load_path << File.expand_path("active_record/locale/en.yml", __dir__)
176
184
  end
185
+
186
+ YAML.load_tags["!ruby/object:ActiveRecord::AttributeSet"] = "ActiveModel::AttributeSet"
187
+ YAML.load_tags["!ruby/object:ActiveRecord::Attribute::FromDatabase"] = "ActiveModel::Attribute::FromDatabase"
188
+ YAML.load_tags["!ruby/object:ActiveRecord::LazyAttributeHash"] = "ActiveModel::LazyAttributeHash"
189
+ YAML.load_tags["!ruby/object:ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString"] = "ActiveRecord::Type::String"
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module AliasPredication
5
+ def as(other)
6
+ Nodes::As.new self, Nodes::SqlLiteral.new(other)
7
+ end
8
+ end
9
+ end