activerecord 4.2.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (372) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +612 -971
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +13 -12
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/aggregations.rb +267 -248
  8. data/lib/active_record/association_relation.rb +24 -6
  9. data/lib/active_record/associations/alias_tracker.rb +29 -35
  10. data/lib/active_record/associations/association.rb +135 -56
  11. data/lib/active_record/associations/association_scope.rb +103 -131
  12. data/lib/active_record/associations/belongs_to_association.rb +67 -54
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  14. data/lib/active_record/associations/builder/association.rb +27 -40
  15. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  16. data/lib/active_record/associations/builder/collection_association.rb +10 -29
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +60 -70
  18. data/lib/active_record/associations/builder/has_many.rb +8 -4
  19. data/lib/active_record/associations/builder/has_one.rb +46 -5
  20. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  21. data/lib/active_record/associations/collection_association.rb +138 -274
  22. data/lib/active_record/associations/collection_proxy.rb +252 -151
  23. data/lib/active_record/associations/foreign_association.rb +20 -0
  24. data/lib/active_record/associations/has_many_association.rb +35 -83
  25. data/lib/active_record/associations/has_many_through_association.rb +62 -80
  26. data/lib/active_record/associations/has_one_association.rb +62 -49
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +38 -80
  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 +138 -162
  32. data/lib/active_record/associations/preloader/association.rb +90 -119
  33. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  34. data/lib/active_record/associations/preloader.rb +92 -94
  35. data/lib/active_record/associations/singular_association.rb +18 -45
  36. data/lib/active_record/associations/through_association.rb +48 -23
  37. data/lib/active_record/associations.rb +1737 -1596
  38. data/lib/active_record/attribute_assignment.rb +56 -183
  39. data/lib/active_record/attribute_decorators.rb +39 -15
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +15 -5
  41. data/lib/active_record/attribute_methods/dirty.rb +174 -134
  42. data/lib/active_record/attribute_methods/primary_key.rb +91 -83
  43. data/lib/active_record/attribute_methods/query.rb +6 -5
  44. data/lib/active_record/attribute_methods/read.rb +20 -76
  45. data/lib/active_record/attribute_methods/serialization.rb +40 -20
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +62 -36
  47. data/lib/active_record/attribute_methods/write.rb +33 -55
  48. data/lib/active_record/attribute_methods.rb +124 -143
  49. data/lib/active_record/attributes.rb +214 -74
  50. data/lib/active_record/autosave_association.rb +115 -46
  51. data/lib/active_record/base.rb +60 -49
  52. data/lib/active_record/callbacks.rb +100 -74
  53. data/lib/active_record/coders/json.rb +3 -1
  54. data/lib/active_record/coders/yaml_column.rb +24 -12
  55. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +796 -290
  56. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  57. data/lib/active_record/connection_adapters/abstract/database_statements.rb +247 -108
  58. data/lib/active_record/connection_adapters/abstract/query_cache.rb +82 -23
  59. data/lib/active_record/connection_adapters/abstract/quoting.rb +171 -53
  60. data/lib/active_record/connection_adapters/abstract/savepoints.rb +6 -4
  61. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -46
  62. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +366 -227
  63. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  64. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +706 -222
  65. data/lib/active_record/connection_adapters/abstract/transaction.rb +191 -87
  66. data/lib/active_record/connection_adapters/abstract_adapter.rb +468 -194
  67. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +535 -597
  68. data/lib/active_record/connection_adapters/column.rb +56 -43
  69. data/lib/active_record/connection_adapters/connection_specification.rb +174 -152
  70. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  71. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
  73. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  74. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  79. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  80. data/lib/active_record/connection_adapters/mysql2_adapter.rb +59 -195
  81. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +65 -115
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +50 -57
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +5 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  89. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -13
  91. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +7 -3
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -19
  94. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  96. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  98. data/lib/active_record/connection_adapters/postgresql/oid/{integer.rb → oid.rb} +6 -2
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +33 -11
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -34
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  102. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +67 -51
  103. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +10 -5
  104. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  106. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  107. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  108. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  109. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  111. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +474 -286
  113. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  114. data/lib/active_record/connection_adapters/postgresql/utils.rb +12 -8
  115. data/lib/active_record/connection_adapters/postgresql_adapter.rb +558 -363
  116. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  117. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  118. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +288 -359
  126. data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
  127. data/lib/active_record/connection_handling.rb +176 -41
  128. data/lib/active_record/core.rb +266 -233
  129. data/lib/active_record/counter_cache.rb +68 -50
  130. data/lib/active_record/database_configurations/database_config.rb +37 -0
  131. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  132. data/lib/active_record/database_configurations/url_config.rb +79 -0
  133. data/lib/active_record/database_configurations.rb +233 -0
  134. data/lib/active_record/define_callbacks.rb +22 -0
  135. data/lib/active_record/dynamic_matchers.rb +87 -105
  136. data/lib/active_record/enum.rb +164 -88
  137. data/lib/active_record/errors.rb +189 -53
  138. data/lib/active_record/explain.rb +23 -11
  139. data/lib/active_record/explain_registry.rb +4 -2
  140. data/lib/active_record/explain_subscriber.rb +11 -6
  141. data/lib/active_record/fixture_set/file.rb +35 -9
  142. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  143. data/lib/active_record/fixture_set/render_context.rb +17 -0
  144. data/lib/active_record/fixture_set/table_row.rb +153 -0
  145. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  146. data/lib/active_record/fixtures.rb +226 -495
  147. data/lib/active_record/gem_version.rb +4 -2
  148. data/lib/active_record/inheritance.rb +158 -112
  149. data/lib/active_record/insert_all.rb +179 -0
  150. data/lib/active_record/integration.rb +123 -29
  151. data/lib/active_record/internal_metadata.rb +53 -0
  152. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  153. data/lib/active_record/locale/en.yml +3 -2
  154. data/lib/active_record/locking/optimistic.rb +91 -98
  155. data/lib/active_record/locking/pessimistic.rb +18 -6
  156. data/lib/active_record/log_subscriber.rb +76 -33
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  159. data/lib/active_record/middleware/database_selector.rb +75 -0
  160. data/lib/active_record/migration/command_recorder.rb +177 -90
  161. data/lib/active_record/migration/compatibility.rb +244 -0
  162. data/lib/active_record/migration/join_table.rb +8 -6
  163. data/lib/active_record/migration.rb +634 -288
  164. data/lib/active_record/model_schema.rb +314 -112
  165. data/lib/active_record/nested_attributes.rb +266 -214
  166. data/lib/active_record/no_touching.rb +15 -2
  167. data/lib/active_record/null_relation.rb +24 -37
  168. data/lib/active_record/persistence.rb +559 -124
  169. data/lib/active_record/query_cache.rb +19 -23
  170. data/lib/active_record/querying.rb +43 -29
  171. data/lib/active_record/railtie.rb +148 -47
  172. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  173. data/lib/active_record/railties/console_sandbox.rb +2 -0
  174. data/lib/active_record/railties/controller_runtime.rb +34 -33
  175. data/lib/active_record/railties/databases.rake +338 -202
  176. data/lib/active_record/readonly_attributes.rb +5 -4
  177. data/lib/active_record/reflection.rb +460 -299
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  179. data/lib/active_record/relation/batches.rb +207 -55
  180. data/lib/active_record/relation/calculations.rb +269 -248
  181. data/lib/active_record/relation/delegation.rb +70 -80
  182. data/lib/active_record/relation/finder_methods.rb +279 -255
  183. data/lib/active_record/relation/from_clause.rb +26 -0
  184. data/lib/active_record/relation/merger.rb +83 -69
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -25
  186. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  187. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  189. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  190. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  192. data/lib/active_record/relation/predicate_builder.rb +116 -92
  193. data/lib/active_record/relation/query_attribute.rb +50 -0
  194. data/lib/active_record/relation/query_methods.rb +574 -391
  195. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  196. data/lib/active_record/relation/spawn_methods.rb +18 -16
  197. data/lib/active_record/relation/where_clause.rb +190 -0
  198. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  199. data/lib/active_record/relation.rb +518 -340
  200. data/lib/active_record/result.rb +79 -42
  201. data/lib/active_record/runtime_registry.rb +6 -4
  202. data/lib/active_record/sanitization.rb +144 -121
  203. data/lib/active_record/schema.rb +21 -24
  204. data/lib/active_record/schema_dumper.rb +112 -93
  205. data/lib/active_record/schema_migration.rb +24 -20
  206. data/lib/active_record/scoping/default.rb +101 -84
  207. data/lib/active_record/scoping/named.rb +86 -33
  208. data/lib/active_record/scoping.rb +45 -26
  209. data/lib/active_record/secure_token.rb +40 -0
  210. data/lib/active_record/serialization.rb +5 -5
  211. data/lib/active_record/statement_cache.rb +73 -36
  212. data/lib/active_record/store.rb +127 -42
  213. data/lib/active_record/suppressor.rb +61 -0
  214. data/lib/active_record/table_metadata.rb +75 -0
  215. data/lib/active_record/tasks/database_tasks.rb +309 -99
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +58 -88
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +82 -31
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +38 -16
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +224 -0
  221. data/lib/active_record/timestamp.rb +86 -40
  222. data/lib/active_record/touch_later.rb +66 -0
  223. data/lib/active_record/transactions.rb +215 -139
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  226. data/lib/active_record/type/date.rb +4 -41
  227. data/lib/active_record/type/date_time.rb +4 -38
  228. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  229. data/lib/active_record/type/hash_lookup_type_map.rb +13 -5
  230. data/lib/active_record/type/internal/timezone.rb +17 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +30 -15
  233. data/lib/active_record/type/text.rb +2 -2
  234. data/lib/active_record/type/time.rb +11 -16
  235. data/lib/active_record/type/type_map.rb +15 -17
  236. data/lib/active_record/type/unsigned_integer.rb +9 -7
  237. data/lib/active_record/type.rb +78 -23
  238. data/lib/active_record/type_caster/connection.rb +34 -0
  239. data/lib/active_record/type_caster/map.rb +20 -0
  240. data/lib/active_record/type_caster.rb +9 -0
  241. data/lib/active_record/validations/absence.rb +25 -0
  242. data/lib/active_record/validations/associated.rb +13 -4
  243. data/lib/active_record/validations/length.rb +26 -0
  244. data/lib/active_record/validations/presence.rb +14 -13
  245. data/lib/active_record/validations/uniqueness.rb +43 -46
  246. data/lib/active_record/validations.rb +39 -35
  247. data/lib/active_record/version.rb +3 -1
  248. data/lib/active_record.rb +43 -21
  249. data/lib/arel/alias_predication.rb +9 -0
  250. data/lib/arel/attributes/attribute.rb +37 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/collectors/bind.rb +24 -0
  253. data/lib/arel/collectors/composite.rb +31 -0
  254. data/lib/arel/collectors/plain_string.rb +20 -0
  255. data/lib/arel/collectors/sql_string.rb +20 -0
  256. data/lib/arel/collectors/substitute_binds.rb +28 -0
  257. data/lib/arel/crud.rb +42 -0
  258. data/lib/arel/delete_manager.rb +18 -0
  259. data/lib/arel/errors.rb +9 -0
  260. data/lib/arel/expressions.rb +29 -0
  261. data/lib/arel/factory_methods.rb +49 -0
  262. data/lib/arel/insert_manager.rb +49 -0
  263. data/lib/arel/math.rb +45 -0
  264. data/lib/arel/nodes/and.rb +32 -0
  265. data/lib/arel/nodes/ascending.rb +23 -0
  266. data/lib/arel/nodes/binary.rb +52 -0
  267. data/lib/arel/nodes/bind_param.rb +36 -0
  268. data/lib/arel/nodes/case.rb +55 -0
  269. data/lib/arel/nodes/casted.rb +50 -0
  270. data/lib/arel/nodes/comment.rb +29 -0
  271. data/lib/arel/nodes/count.rb +12 -0
  272. data/lib/arel/nodes/delete_statement.rb +45 -0
  273. data/lib/arel/nodes/descending.rb +23 -0
  274. data/lib/arel/nodes/equality.rb +18 -0
  275. data/lib/arel/nodes/extract.rb +24 -0
  276. data/lib/arel/nodes/false.rb +16 -0
  277. data/lib/arel/nodes/full_outer_join.rb +8 -0
  278. data/lib/arel/nodes/function.rb +44 -0
  279. data/lib/arel/nodes/grouping.rb +8 -0
  280. data/lib/arel/nodes/in.rb +8 -0
  281. data/lib/arel/nodes/infix_operation.rb +80 -0
  282. data/lib/arel/nodes/inner_join.rb +8 -0
  283. data/lib/arel/nodes/insert_statement.rb +37 -0
  284. data/lib/arel/nodes/join_source.rb +20 -0
  285. data/lib/arel/nodes/matches.rb +18 -0
  286. data/lib/arel/nodes/named_function.rb +23 -0
  287. data/lib/arel/nodes/node.rb +50 -0
  288. data/lib/arel/nodes/node_expression.rb +13 -0
  289. data/lib/arel/nodes/outer_join.rb +8 -0
  290. data/lib/arel/nodes/over.rb +15 -0
  291. data/lib/arel/nodes/regexp.rb +16 -0
  292. data/lib/arel/nodes/right_outer_join.rb +8 -0
  293. data/lib/arel/nodes/select_core.rb +67 -0
  294. data/lib/arel/nodes/select_statement.rb +41 -0
  295. data/lib/arel/nodes/sql_literal.rb +16 -0
  296. data/lib/arel/nodes/string_join.rb +11 -0
  297. data/lib/arel/nodes/table_alias.rb +27 -0
  298. data/lib/arel/nodes/terminal.rb +16 -0
  299. data/lib/arel/nodes/true.rb +16 -0
  300. data/lib/arel/nodes/unary.rb +45 -0
  301. data/lib/arel/nodes/unary_operation.rb +20 -0
  302. data/lib/arel/nodes/unqualified_column.rb +22 -0
  303. data/lib/arel/nodes/update_statement.rb +41 -0
  304. data/lib/arel/nodes/values_list.rb +9 -0
  305. data/lib/arel/nodes/window.rb +126 -0
  306. data/lib/arel/nodes/with.rb +11 -0
  307. data/lib/arel/nodes.rb +68 -0
  308. data/lib/arel/order_predications.rb +13 -0
  309. data/lib/arel/predications.rb +257 -0
  310. data/lib/arel/select_manager.rb +271 -0
  311. data/lib/arel/table.rb +110 -0
  312. data/lib/arel/tree_manager.rb +72 -0
  313. data/lib/arel/update_manager.rb +34 -0
  314. data/lib/arel/visitors/depth_first.rb +204 -0
  315. data/lib/arel/visitors/dot.rb +297 -0
  316. data/lib/arel/visitors/ibm_db.rb +34 -0
  317. data/lib/arel/visitors/informix.rb +62 -0
  318. data/lib/arel/visitors/mssql.rb +157 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +159 -0
  321. data/lib/arel/visitors/oracle12.rb +66 -0
  322. data/lib/arel/visitors/postgresql.rb +110 -0
  323. data/lib/arel/visitors/sqlite.rb +39 -0
  324. data/lib/arel/visitors/to_sql.rb +889 -0
  325. data/lib/arel/visitors/visitor.rb +46 -0
  326. data/lib/arel/visitors/where_sql.rb +23 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +51 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  331. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
  333. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  334. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -8
  335. data/lib/rails/generators/active_record/migration.rb +31 -1
  336. data/lib/rails/generators/active_record/model/model_generator.rb +19 -22
  337. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  338. data/lib/rails/generators/active_record.rb +7 -5
  339. metadata +166 -60
  340. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  341. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  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 -23
  345. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  346. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  347. data/lib/active_record/attribute.rb +0 -149
  348. data/lib/active_record/attribute_set/builder.rb +0 -86
  349. data/lib/active_record/attribute_set.rb +0 -77
  350. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
  351. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  352. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  353. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
  354. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  355. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  356. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  357. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  358. data/lib/active_record/type/big_integer.rb +0 -13
  359. data/lib/active_record/type/binary.rb +0 -50
  360. data/lib/active_record/type/boolean.rb +0 -30
  361. data/lib/active_record/type/decimal.rb +0 -40
  362. data/lib/active_record/type/decorator.rb +0 -14
  363. data/lib/active_record/type/float.rb +0 -19
  364. data/lib/active_record/type/integer.rb +0 -55
  365. data/lib/active_record/type/mutable.rb +0 -16
  366. data/lib/active_record/type/numeric.rb +0 -36
  367. data/lib/active_record/type/string.rb +0 -36
  368. data/lib/active_record/type/time_value.rb +0 -38
  369. data/lib/active_record/type/value.rb +0 -101
  370. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -22
  371. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
  372. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module TypeCaster
5
+ class Map # :nodoc:
6
+ def initialize(types)
7
+ @types = types
8
+ end
9
+
10
+ def type_cast_for_database(attr_name, value)
11
+ return value if value.is_a?(Arel::Nodes::BindParam)
12
+ type = types.type_for_attribute(attr_name)
13
+ type.serialize(value)
14
+ end
15
+
16
+ private
17
+ attr_reader :types
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/type_caster/map"
4
+ require "active_record/type_caster/connection"
5
+
6
+ module ActiveRecord
7
+ module TypeCaster # :nodoc:
8
+ end
9
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module Validations
5
+ class AbsenceValidator < ActiveModel::Validations::AbsenceValidator # :nodoc:
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?)
9
+ end
10
+ super
11
+ end
12
+ end
13
+
14
+ module ClassMethods
15
+ # Validates that the specified attributes are not present (as defined by
16
+ # Object#present?). If the attribute is an association, the associated object
17
+ # is considered absent if it was marked for destruction.
18
+ #
19
+ # See ActiveModel::Validations::HelperMethods.validates_absence_of for more information.
20
+ def validates_absence_of(*attr_names)
21
+ validates_with AbsenceValidator, _merge_attributes(attr_names)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,11 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Validations
3
5
  class AssociatedValidator < ActiveModel::EachValidator #:nodoc:
4
6
  def validate_each(record, attribute, value)
5
- if Array.wrap(value).reject {|r| r.marked_for_destruction? || r.valid?}.any?
6
- record.errors.add(attribute, :invalid, options.merge(:value => value))
7
+ if Array(value).reject { |r| valid_object?(r) }.any?
8
+ record.errors.add(attribute, :invalid, options.merge(value: value))
7
9
  end
8
10
  end
11
+
12
+ private
13
+
14
+ def valid_object?(record)
15
+ (record.respond_to?(:marked_for_destruction?) && record.marked_for_destruction?) || record.valid?
16
+ end
9
17
  end
10
18
 
11
19
  module ClassMethods
@@ -24,13 +32,14 @@ module ActiveRecord
24
32
  #
25
33
  # NOTE: This validation will not fail if the association hasn't been
26
34
  # assigned. If you want to ensure that the association is both present and
27
- # guaranteed to be valid, you also need to use +validates_presence_of+.
35
+ # guaranteed to be valid, you also need to use
36
+ # {validates_presence_of}[rdoc-ref:Validations::ClassMethods#validates_presence_of].
28
37
  #
29
38
  # Configuration options:
30
39
  #
31
40
  # * <tt>:message</tt> - A custom error message (default is: "is invalid").
32
41
  # * <tt>:on</tt> - Specifies the contexts where this validation is active.
33
- # Runs in all validation contexts by default (nil). You can pass a symbol
42
+ # Runs in all validation contexts by default +nil+. You can pass a symbol
34
43
  # or an array of symbols. (e.g. <tt>on: :create</tt> or
35
44
  # <tt>on: :custom_validation_context</tt> or
36
45
  # <tt>on: [:create, :custom_validation_context]</tt>)
@@ -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
@@ -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,19 +8,27 @@ 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
- relation = build_relation(finder_class, table, attribute, value)
19
- relation = relation.and(table[finder_class.primary_key.to_sym].not_eq(record.id)) if record.persisted?
20
- relation = scope_relation(record, table, relation)
21
- relation = finder_class.unscoped.where(relation)
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)
22
32
  relation = relation.merge(options[:conditions]) if options[:conditions]
23
33
 
24
34
  if relation.exists?
@@ -29,13 +39,13 @@ module ActiveRecord
29
39
  end
30
40
  end
31
41
 
32
- protected
42
+ private
33
43
  # The check for an existing value should be run from a class that
34
44
  # isn't abstract. This means working down from the current class
35
45
  # (self), to the first non-abstract class. Since classes don't know
36
46
  # their subclasses, we have to build the hierarchy between self and
37
47
  # the record's class.
38
- def find_finder_class_for(record) #:nodoc:
48
+ def find_finder_class_for(record)
39
49
  class_hierarchy = [record.class]
40
50
 
41
51
  while class_hierarchy.first != @klass
@@ -45,43 +55,32 @@ module ActiveRecord
45
55
  class_hierarchy.detect { |klass| !klass.abstract_class? }
46
56
  end
47
57
 
48
- def build_relation(klass, table, attribute, value) #:nodoc:
49
- if reflection = klass._reflect_on_association(attribute)
50
- attribute = reflection.foreign_key
51
- value = value.attributes[reflection.klass.primary_key] unless value.nil?
52
- end
53
-
54
- attribute_name = attribute.to_s
55
-
56
- # the attribute may be an aliased attribute
57
- if klass.attribute_aliases[attribute_name]
58
- attribute = klass.attribute_aliases[attribute_name]
59
- attribute_name = attribute.to_s
60
- end
58
+ def build_relation(klass, attribute, value)
59
+ relation = klass.unscoped
60
+ comparison = relation.bind_attribute(attribute, value) do |attr, bind|
61
+ return relation.none! if bind.unboundable?
61
62
 
62
- column = klass.columns_hash[attribute_name]
63
- value = klass.connection.type_cast(value, column)
64
- if value.is_a?(String) && column.limit
65
- value = value.to_s[0, column.limit]
63
+ if !options.key?(:case_sensitive) || bind.nil?
64
+ klass.connection.default_uniqueness_comparison(attr, bind, klass)
65
+ elsif options[:case_sensitive]
66
+ klass.connection.case_sensitive_comparison(attr, bind)
67
+ else
68
+ # will use SQL LOWER function before comparison, unless it detects a case insensitive collation
69
+ klass.connection.case_insensitive_comparison(attr, bind)
70
+ end
66
71
  end
67
72
 
68
- if !options[:case_sensitive] && value.is_a?(String)
69
- # will use SQL LOWER function before comparison, unless it detects a case insensitive collation
70
- klass.connection.case_insensitive_comparison(table, attribute, column, value)
71
- else
72
- klass.connection.case_sensitive_comparison(table, attribute, column, value)
73
- end
73
+ relation.where!(comparison)
74
74
  end
75
75
 
76
- def scope_relation(record, table, relation)
76
+ def scope_relation(record, relation)
77
77
  Array(options[:scope]).each do |scope_item|
78
- if reflection = record.class._reflect_on_association(scope_item)
79
- scope_value = record.send(reflection.foreign_key)
80
- scope_item = reflection.foreign_key
78
+ scope_value = if record.class._reflect_on_association(scope_item)
79
+ record.association(scope_item).reader
81
80
  else
82
- scope_value = record._read_attribute(scope_item)
81
+ record._read_attribute(scope_item)
83
82
  end
84
- relation = relation.and(table[scope_item].eq(scope_value))
83
+ relation = relation.where(scope_item => scope_value)
85
84
  end
86
85
 
87
86
  relation
@@ -159,7 +158,8 @@ module ActiveRecord
159
158
  #
160
159
  # === Concurrency and integrity
161
160
  #
162
- # Using this validation method in conjunction with ActiveRecord::Base#save
161
+ # Using this validation method in conjunction with
162
+ # {ActiveRecord::Base#save}[rdoc-ref:Persistence#save]
163
163
  # does not guarantee the absence of duplicate record insertions, because
164
164
  # uniqueness checks on the application level are inherently prone to race
165
165
  # conditions. For example, suppose that two users try to post a Comment at
@@ -193,21 +193,19 @@ module ActiveRecord
193
193
  # | # Boom! We now have a duplicate
194
194
  # | # title!
195
195
  #
196
- # This could even happen if you use transactions with the 'serializable'
197
- # isolation level. The best way to work around this problem is to add a unique
198
- # index to the database table using
199
- # ActiveRecord::ConnectionAdapters::SchemaStatements#add_index. In the
200
- # rare case that a race condition occurs, the database will guarantee
196
+ # The best way to work around this problem is to add a unique index to the database table using
197
+ # {connection.add_index}[rdoc-ref:ConnectionAdapters::SchemaStatements#add_index].
198
+ # In the rare case that a race condition occurs, the database will guarantee
201
199
  # the field's uniqueness.
202
200
  #
203
201
  # When the database catches such a duplicate insertion,
204
- # ActiveRecord::Base#save will raise an ActiveRecord::StatementInvalid
202
+ # {ActiveRecord::Base#save}[rdoc-ref:Persistence#save] will raise an ActiveRecord::StatementInvalid
205
203
  # exception. You can either choose to let this error propagate (which
206
204
  # will result in the default Rails exception page being shown), or you
207
205
  # can catch it and restart the transaction (e.g. by telling the user
208
206
  # that the title already exists, and asking them to re-enter the title).
209
207
  # This technique is also known as
210
- # {optimistic concurrency control}[http://en.wikipedia.org/wiki/Optimistic_concurrency_control].
208
+ # {optimistic concurrency control}[https://en.wikipedia.org/wiki/Optimistic_concurrency_control].
211
209
  #
212
210
  # The bundled ActiveRecord::ConnectionAdapters distinguish unique index
213
211
  # constraint errors from other types of database errors by throwing an
@@ -217,7 +215,6 @@ module ActiveRecord
217
215
  #
218
216
  # The following bundled adapters throw the ActiveRecord::RecordNotUnique exception:
219
217
  #
220
- # * ActiveRecord::ConnectionAdapters::MysqlAdapter.
221
218
  # * ActiveRecord::ConnectionAdapters::Mysql2Adapter.
222
219
  # * ActiveRecord::ConnectionAdapters::SQLite3Adapter.
223
220
  # * 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,73 @@ 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
- end
74
+ private
75
75
 
76
- protected
76
+ def default_validation_context
77
+ new_record? ? :create : :update
78
+ end
77
79
 
78
- def raise_record_invalid
80
+ def raise_validation_error
79
81
  raise(RecordInvalid.new(self))
80
82
  end
81
83
 
82
- def perform_validations(options={}) # :nodoc:
84
+ def perform_validations(options = {})
83
85
  options[:validate] == false || valid?(options[:context])
84
86
  end
85
87
  end
@@ -88,3 +90,5 @@ end
88
90
  require "active_record/validations/associated"
89
91
  require "active_record/validations/uniqueness"
90
92
  require "active_record/validations/presence"
93
+ require "active_record/validations/absence"
94
+ require "active_record/validations/length"
@@ -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-2019 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,18 +23,18 @@
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"
31
34
 
32
35
  module ActiveRecord
33
36
  extend ActiveSupport::Autoload
34
37
 
35
- autoload :Attribute
36
38
  autoload :Base
37
39
  autoload :Callbacks
38
40
  autoload :Core
@@ -40,18 +42,21 @@ module ActiveRecord
40
42
  autoload :CounterCache
41
43
  autoload :DynamicMatchers
42
44
  autoload :Enum
45
+ autoload :InternalMetadata
43
46
  autoload :Explain
44
47
  autoload :Inheritance
45
48
  autoload :Integration
46
49
  autoload :Migration
47
- autoload :Migrator, 'active_record/migration'
50
+ autoload :Migrator, "active_record/migration"
48
51
  autoload :ModelSchema
49
52
  autoload :NestedAttributes
50
53
  autoload :NoTouching
54
+ autoload :TouchLater
51
55
  autoload :Persistence
52
56
  autoload :QueryCache
53
57
  autoload :Querying
54
58
  autoload :ReadonlyAttributes
59
+ autoload :RecordInvalid, "active_record/validations"
55
60
  autoload :Reflection
56
61
  autoload :RuntimeRegistry
57
62
  autoload :Sanitization
@@ -62,15 +67,18 @@ module ActiveRecord
62
67
  autoload :Serialization
63
68
  autoload :StatementCache
64
69
  autoload :Store
70
+ autoload :Suppressor
65
71
  autoload :Timestamp
66
72
  autoload :Transactions
67
73
  autoload :Translation
68
74
  autoload :Validations
75
+ autoload :SecureToken
76
+ autoload :DatabaseSelector, "active_record/middleware/database_selector"
69
77
 
70
78
  eager_autoload do
71
- autoload :ActiveRecordError, 'active_record/errors'
72
- autoload :ConnectionNotEstablished, 'active_record/errors'
73
- autoload :ConnectionAdapters, 'active_record/connection_adapters/abstract_adapter'
79
+ autoload :ActiveRecordError, "active_record/errors"
80
+ autoload :ConnectionNotEstablished, "active_record/errors"
81
+ autoload :ConnectionAdapters, "active_record/connection_adapters/abstract_adapter"
74
82
 
75
83
  autoload :Aggregations
76
84
  autoload :Associations
@@ -78,11 +86,13 @@ module ActiveRecord
78
86
  autoload :AttributeMethods
79
87
  autoload :AutosaveAssociation
80
88
 
89
+ autoload :LegacyYamlAdapter
90
+
81
91
  autoload :Relation
82
92
  autoload :AssociationRelation
83
93
  autoload :NullRelation
84
94
 
85
- autoload_under 'relation' do
95
+ autoload_under "relation" do
86
96
  autoload :QueryMethods
87
97
  autoload :FinderMethods
88
98
  autoload :Calculations
@@ -93,11 +103,13 @@ module ActiveRecord
93
103
  end
94
104
 
95
105
  autoload :Result
106
+ autoload :TableMetadata
107
+ autoload :Type
96
108
  end
97
109
 
98
110
  module Coders
99
- autoload :YAMLColumn, 'active_record/coders/yaml_column'
100
- autoload :JSON, 'active_record/coders/json'
111
+ autoload :YAMLColumn, "active_record/coders/yaml_column"
112
+ autoload :JSON, "active_record/coders/json"
101
113
  end
102
114
 
103
115
  module AttributeMethods
@@ -129,7 +141,6 @@ module ActiveRecord
129
141
 
130
142
  eager_autoload do
131
143
  autoload :AbstractAdapter
132
- autoload :ConnectionManagement, "active_record/connection_adapters/abstract/connection_pool"
133
144
  end
134
145
  end
135
146
 
@@ -142,17 +153,24 @@ module ActiveRecord
142
153
  end
143
154
  end
144
155
 
156
+ module Middleware
157
+ extend ActiveSupport::Autoload
158
+
159
+ autoload :DatabaseSelector, "active_record/middleware/database_selector"
160
+ end
161
+
145
162
  module Tasks
146
163
  extend ActiveSupport::Autoload
147
164
 
148
165
  autoload :DatabaseTasks
149
- autoload :SQLiteDatabaseTasks, 'active_record/tasks/sqlite_database_tasks'
150
- autoload :MySQLDatabaseTasks, 'active_record/tasks/mysql_database_tasks'
166
+ autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
167
+ autoload :MySQLDatabaseTasks, "active_record/tasks/mysql_database_tasks"
151
168
  autoload :PostgreSQLDatabaseTasks,
152
- 'active_record/tasks/postgresql_database_tasks'
169
+ "active_record/tasks/postgresql_database_tasks"
153
170
  end
154
171
 
155
- autoload :TestFixtures, 'active_record/fixtures'
172
+ autoload :TestDatabases, "active_record/test_databases"
173
+ autoload :TestFixtures, "active_record/fixtures"
156
174
 
157
175
  def self.eager_load!
158
176
  super
@@ -169,5 +187,9 @@ ActiveSupport.on_load(:active_record) do
169
187
  end
170
188
 
171
189
  ActiveSupport.on_load(:i18n) do
172
- I18n.load_path << File.dirname(__FILE__) + '/active_record/locale/en.yml'
190
+ I18n.load_path << File.expand_path("active_record/locale/en.yml", __dir__)
173
191
  end
192
+
193
+ YAML.load_tags["!ruby/object:ActiveRecord::AttributeSet"] = "ActiveModel::AttributeSet"
194
+ YAML.load_tags["!ruby/object:ActiveRecord::Attribute::FromDatabase"] = "ActiveModel::Attribute::FromDatabase"
195
+ YAML.load_tags["!ruby/object:ActiveRecord::LazyAttributeHash"] = "ActiveModel::LazyAttributeHash"
@@ -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