activerecord 5.0.7.2 → 6.0.6.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 (359) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +844 -1944
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +9 -7
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +18 -14
  10. data/lib/active_record/associations/alias_tracker.rb +24 -34
  11. data/lib/active_record/associations/association.rb +113 -55
  12. data/lib/active_record/associations/association_scope.rb +102 -96
  13. data/lib/active_record/associations/belongs_to_association.rb +58 -42
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +18 -25
  16. data/lib/active_record/associations/builder/belongs_to.rb +43 -54
  17. data/lib/active_record/associations/builder/collection_association.rb +7 -18
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
  19. data/lib/active_record/associations/builder/has_many.rb +4 -0
  20. data/lib/active_record/associations/builder/has_one.rb +37 -1
  21. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  22. data/lib/active_record/associations/collection_association.rb +93 -254
  23. data/lib/active_record/associations/collection_proxy.rb +159 -122
  24. data/lib/active_record/associations/foreign_association.rb +9 -0
  25. data/lib/active_record/associations/has_many_association.rb +23 -30
  26. data/lib/active_record/associations/has_many_through_association.rb +58 -44
  27. data/lib/active_record/associations/has_one_association.rb +59 -54
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +43 -85
  30. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  31. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  32. data/lib/active_record/associations/join_dependency.rb +152 -177
  33. data/lib/active_record/associations/preloader/association.rb +101 -97
  34. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  35. data/lib/active_record/associations/preloader.rb +94 -103
  36. data/lib/active_record/associations/singular_association.rb +12 -45
  37. data/lib/active_record/associations/through_association.rb +27 -15
  38. data/lib/active_record/associations.rb +1603 -1592
  39. data/lib/active_record/attribute_assignment.rb +54 -61
  40. data/lib/active_record/attribute_decorators.rb +38 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
  42. data/lib/active_record/attribute_methods/dirty.rb +179 -109
  43. data/lib/active_record/attribute_methods/primary_key.rb +85 -92
  44. data/lib/active_record/attribute_methods/query.rb +4 -3
  45. data/lib/active_record/attribute_methods/read.rb +20 -49
  46. data/lib/active_record/attribute_methods/serialization.rb +29 -7
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
  48. data/lib/active_record/attribute_methods/write.rb +34 -33
  49. data/lib/active_record/attribute_methods.rb +66 -106
  50. data/lib/active_record/attributes.rb +38 -25
  51. data/lib/active_record/autosave_association.rb +58 -39
  52. data/lib/active_record/base.rb +27 -24
  53. data/lib/active_record/callbacks.rb +64 -35
  54. data/lib/active_record/coders/json.rb +2 -0
  55. data/lib/active_record/coders/yaml_column.rb +34 -13
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -323
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +128 -75
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +233 -147
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +373 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -562
  69. data/lib/active_record/connection_adapters/column.rb +41 -13
  70. data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  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 +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +12 -2
  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 +19 -18
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  99. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
  117. data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +261 -267
  127. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  128. data/lib/active_record/connection_handling.rb +143 -40
  129. data/lib/active_record/core.rb +207 -160
  130. data/lib/active_record/counter_cache.rb +60 -28
  131. data/lib/active_record/database_configurations/database_config.rb +37 -0
  132. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  133. data/lib/active_record/database_configurations/url_config.rb +78 -0
  134. data/lib/active_record/database_configurations.rb +233 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -87
  137. data/lib/active_record/enum.rb +67 -23
  138. data/lib/active_record/errors.rb +114 -18
  139. data/lib/active_record/explain.rb +4 -4
  140. data/lib/active_record/explain_registry.rb +3 -1
  141. data/lib/active_record/explain_subscriber.rb +9 -4
  142. data/lib/active_record/fixture_set/file.rb +13 -8
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +152 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  147. data/lib/active_record/fixtures.rb +194 -504
  148. data/lib/active_record/gem_version.rb +5 -3
  149. data/lib/active_record/inheritance.rb +150 -99
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +116 -25
  152. data/lib/active_record/internal_metadata.rb +16 -19
  153. data/lib/active_record/legacy_yaml_adapter.rb +4 -2
  154. data/lib/active_record/locking/optimistic.rb +85 -86
  155. data/lib/active_record/locking/pessimistic.rb +18 -6
  156. data/lib/active_record/log_subscriber.rb +48 -29
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  159. data/lib/active_record/middleware/database_selector.rb +74 -0
  160. data/lib/active_record/migration/command_recorder.rb +134 -100
  161. data/lib/active_record/migration/compatibility.rb +174 -56
  162. data/lib/active_record/migration/join_table.rb +8 -7
  163. data/lib/active_record/migration.rb +369 -302
  164. data/lib/active_record/model_schema.rb +160 -127
  165. data/lib/active_record/nested_attributes.rb +213 -202
  166. data/lib/active_record/no_touching.rb +12 -3
  167. data/lib/active_record/null_relation.rb +12 -34
  168. data/lib/active_record/persistence.rb +446 -77
  169. data/lib/active_record/query_cache.rb +13 -12
  170. data/lib/active_record/querying.rb +37 -24
  171. data/lib/active_record/railtie.rb +128 -36
  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 +312 -177
  176. data/lib/active_record/readonly_attributes.rb +5 -4
  177. data/lib/active_record/reflection.rb +214 -254
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
  179. data/lib/active_record/relation/batches.rb +98 -52
  180. data/lib/active_record/relation/calculations.rb +212 -173
  181. data/lib/active_record/relation/delegation.rb +73 -69
  182. data/lib/active_record/relation/finder_methods.rb +207 -247
  183. data/lib/active_record/relation/from_clause.rb +6 -8
  184. data/lib/active_record/relation/merger.rb +82 -61
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
  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 +4 -3
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  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 +7 -18
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  192. data/lib/active_record/relation/predicate_builder.rb +83 -105
  193. data/lib/active_record/relation/query_attribute.rb +33 -2
  194. data/lib/active_record/relation/query_methods.rb +488 -332
  195. data/lib/active_record/relation/record_fetch_warning.rb +5 -3
  196. data/lib/active_record/relation/spawn_methods.rb +8 -8
  197. data/lib/active_record/relation/where_clause.rb +111 -96
  198. data/lib/active_record/relation/where_clause_factory.rb +6 -11
  199. data/lib/active_record/relation.rb +443 -318
  200. data/lib/active_record/result.rb +69 -40
  201. data/lib/active_record/runtime_registry.rb +5 -3
  202. data/lib/active_record/sanitization.rb +83 -99
  203. data/lib/active_record/schema.rb +7 -14
  204. data/lib/active_record/schema_dumper.rb +71 -69
  205. data/lib/active_record/schema_migration.rb +16 -6
  206. data/lib/active_record/scoping/default.rb +92 -95
  207. data/lib/active_record/scoping/named.rb +51 -26
  208. data/lib/active_record/scoping.rb +20 -20
  209. data/lib/active_record/secure_token.rb +4 -2
  210. data/lib/active_record/serialization.rb +2 -0
  211. data/lib/active_record/statement_cache.rb +63 -28
  212. data/lib/active_record/store.rb +121 -41
  213. data/lib/active_record/suppressor.rb +6 -3
  214. data/lib/active_record/table_metadata.rb +39 -18
  215. data/lib/active_record/tasks/database_tasks.rb +271 -81
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +243 -0
  221. data/lib/active_record/timestamp.rb +70 -36
  222. data/lib/active_record/touch_later.rb +8 -6
  223. data/lib/active_record/transactions.rb +141 -157
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  226. data/lib/active_record/type/date.rb +2 -0
  227. data/lib/active_record/type/date_time.rb +2 -0
  228. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  229. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  230. data/lib/active_record/type/internal/timezone.rb +2 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +16 -9
  233. data/lib/active_record/type/text.rb +11 -0
  234. data/lib/active_record/type/time.rb +12 -1
  235. data/lib/active_record/type/type_map.rb +14 -17
  236. data/lib/active_record/type/unsigned_integer.rb +16 -0
  237. data/lib/active_record/type.rb +23 -18
  238. data/lib/active_record/type_caster/connection.rb +17 -12
  239. data/lib/active_record/type_caster/map.rb +5 -4
  240. data/lib/active_record/type_caster.rb +4 -2
  241. data/lib/active_record/validations/absence.rb +2 -0
  242. data/lib/active_record/validations/associated.rb +3 -2
  243. data/lib/active_record/validations/length.rb +2 -0
  244. data/lib/active_record/validations/presence.rb +4 -2
  245. data/lib/active_record/validations/uniqueness.rb +29 -42
  246. data/lib/active_record/validations.rb +7 -5
  247. data/lib/active_record/version.rb +3 -1
  248. data/lib/active_record.rb +37 -22
  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 +256 -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 +203 -0
  315. data/lib/arel/visitors/dot.rb +296 -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 +156 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +158 -0
  321. data/lib/arel/visitors/oracle12.rb +65 -0
  322. data/lib/arel/visitors/postgresql.rb +109 -0
  323. data/lib/arel/visitors/sqlite.rb +38 -0
  324. data/lib/arel/visitors/to_sql.rb +888 -0
  325. data/lib/arel/visitors/visitor.rb +45 -0
  326. data/lib/arel/visitors/where_sql.rb +22 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +62 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  331. data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
  332. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
  333. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
  334. data/lib/rails/generators/active_record/migration.rb +17 -3
  335. data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
  336. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  337. data/lib/rails/generators/active_record.rb +7 -5
  338. metadata +138 -52
  339. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  340. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  341. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  343. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  344. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  345. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  346. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  347. data/lib/active_record/attribute.rb +0 -213
  348. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  349. data/lib/active_record/attribute_set/builder.rb +0 -132
  350. data/lib/active_record/attribute_set.rb +0 -110
  351. data/lib/active_record/collection_cache_key.rb +0 -50
  352. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  353. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  354. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  355. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  356. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  357. data/lib/active_record/type/internal/abstract_json.rb +0 -33
  358. /data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  359. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Type
3
5
  class Serialized < DelegateClass(ActiveModel::Type::Value) # :nodoc:
6
+ undef to_yaml if method_defined?(:to_yaml)
7
+
4
8
  include ActiveModel::Type::Helpers::Mutable
5
9
 
6
10
  attr_reader :subtype, :coder
@@ -43,21 +47,24 @@ module ActiveRecord
43
47
 
44
48
  def assert_valid_value(value)
45
49
  if coder.respond_to?(:assert_valid_value)
46
- coder.assert_valid_value(value)
50
+ coder.assert_valid_value(value, action: "serialize")
47
51
  end
48
52
  end
49
53
 
50
- private
51
-
52
- def default_value?(value)
53
- value == coder.load(nil)
54
+ def force_equality?(value)
55
+ coder.respond_to?(:object_class) && value.is_a?(coder.object_class)
54
56
  end
55
57
 
56
- def encoded(value)
57
- unless default_value?(value)
58
- coder.dump(value)
58
+ private
59
+ def default_value?(value)
60
+ value == coder.load(nil)
61
+ end
62
+
63
+ def encoded(value)
64
+ unless default_value?(value)
65
+ coder.dump(value)
66
+ end
59
67
  end
60
- end
61
68
  end
62
69
  end
63
70
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module Type
5
+ class Text < ActiveModel::Type::String # :nodoc:
6
+ def type
7
+ :text
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Type
3
5
  class Time < ActiveModel::Type::Time
@@ -14,7 +16,16 @@ module ActiveRecord
14
16
  value
15
17
  end
16
18
  end
19
+
20
+ private
21
+ def cast_value(value)
22
+ case value = super
23
+ when Value
24
+ value.__getobj__
25
+ else
26
+ value
27
+ end
28
+ end
17
29
  end
18
30
  end
19
31
  end
20
-
@@ -1,4 +1,6 @@
1
- require 'concurrent/map'
1
+ # frozen_string_literal: true
2
+
3
+ require "concurrent/map"
2
4
 
3
5
  module ActiveRecord
4
6
  module Type
@@ -11,7 +13,7 @@ module ActiveRecord
11
13
  end
12
14
 
13
15
  def lookup(lookup_key, *args)
14
- fetch(lookup_key, *args) { default_value }
16
+ fetch(lookup_key, *args) { Type.default_value }
15
17
  end
16
18
 
17
19
  def fetch(lookup_key, *args, &block)
@@ -43,22 +45,17 @@ module ActiveRecord
43
45
  end
44
46
 
45
47
  private
46
-
47
- def perform_fetch(lookup_key, *args)
48
- matching_pair = @mapping.reverse_each.detect do |key, _|
49
- key === lookup_key
50
- end
51
-
52
- if matching_pair
53
- matching_pair.last.call(lookup_key, *args)
54
- else
55
- yield lookup_key, *args
48
+ def perform_fetch(lookup_key, *args)
49
+ matching_pair = @mapping.reverse_each.detect do |key, _|
50
+ key === lookup_key
51
+ end
52
+
53
+ if matching_pair
54
+ matching_pair.last.call(lookup_key, *args)
55
+ else
56
+ yield lookup_key, *args
57
+ end
56
58
  end
57
- end
58
-
59
- def default_value
60
- @default_value ||= ActiveModel::Type::Value.new
61
- end
62
59
  end
63
60
  end
64
61
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module Type
5
+ class UnsignedInteger < ActiveModel::Type::Integer # :nodoc:
6
+ private
7
+ def max_value
8
+ super * 2
9
+ end
10
+
11
+ def min_value
12
+ 0
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,17 +1,22 @@
1
- require 'active_model/type'
1
+ # frozen_string_literal: true
2
2
 
3
- require 'active_record/type/internal/abstract_json'
4
- require 'active_record/type/internal/timezone'
3
+ require "active_model/type"
5
4
 
6
- require 'active_record/type/date'
7
- require 'active_record/type/date_time'
8
- require 'active_record/type/time'
5
+ require "active_record/type/internal/timezone"
9
6
 
10
- require 'active_record/type/serialized'
11
- require 'active_record/type/adapter_specific_registry'
7
+ require "active_record/type/date"
8
+ require "active_record/type/date_time"
9
+ require "active_record/type/decimal_without_scale"
10
+ require "active_record/type/json"
11
+ require "active_record/type/time"
12
+ require "active_record/type/text"
13
+ require "active_record/type/unsigned_integer"
12
14
 
13
- require 'active_record/type/type_map'
14
- require 'active_record/type/hash_lookup_type_map'
15
+ require "active_record/type/serialized"
16
+ require "active_record/type/adapter_specific_registry"
17
+
18
+ require "active_record/type/type_map"
19
+ require "active_record/type/hash_lookup_type_map"
15
20
 
16
21
  module ActiveRecord
17
22
  module Type
@@ -37,24 +42,23 @@ module ActiveRecord
37
42
  registry.lookup(*args, adapter: adapter, **kwargs)
38
43
  end
39
44
 
40
- private
41
-
42
- def current_adapter_name
43
- ActiveRecord::Base.connection.adapter_name.downcase.to_sym
45
+ def default_value # :nodoc:
46
+ @default_value ||= Value.new
44
47
  end
48
+
49
+ private
50
+ def current_adapter_name
51
+ ActiveRecord::Base.connection.adapter_name.downcase.to_sym
52
+ end
45
53
  end
46
54
 
47
- Helpers = ActiveModel::Type::Helpers
48
55
  BigInteger = ActiveModel::Type::BigInteger
49
56
  Binary = ActiveModel::Type::Binary
50
57
  Boolean = ActiveModel::Type::Boolean
51
58
  Decimal = ActiveModel::Type::Decimal
52
- DecimalWithoutScale = ActiveModel::Type::DecimalWithoutScale
53
59
  Float = ActiveModel::Type::Float
54
60
  Integer = ActiveModel::Type::Integer
55
61
  String = ActiveModel::Type::String
56
- Text = ActiveModel::Type::Text
57
- UnsignedInteger = ActiveModel::Type::UnsignedInteger
58
62
  Value = ActiveModel::Type::Value
59
63
 
60
64
  register(:big_integer, Type::BigInteger, override: false)
@@ -65,6 +69,7 @@ module ActiveRecord
65
69
  register(:decimal, Type::Decimal, override: false)
66
70
  register(:float, Type::Float, override: false)
67
71
  register(:integer, Type::Integer, override: false)
72
+ register(:json, Type::Json, override: false)
68
73
  register(:string, Type::String, override: false)
69
74
  register(:text, Type::Text, override: false)
70
75
  register(:time, Type::Time, override: false)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module TypeCaster
3
5
  class Connection # :nodoc:
@@ -6,24 +8,27 @@ module ActiveRecord
6
8
  @table_name = table_name
7
9
  end
8
10
 
9
- def type_cast_for_database(attribute_name, value)
11
+ def type_cast_for_database(attr_name, value)
10
12
  return value if value.is_a?(Arel::Nodes::BindParam)
11
- column = column_for(attribute_name)
12
- connection.type_cast_from_column(column, value)
13
+ type = type_for_attribute(attr_name)
14
+ type.serialize(value)
13
15
  end
14
16
 
15
- protected
16
-
17
- attr_reader :table_name
18
- delegate :connection, to: :@klass
19
-
20
- private
17
+ def type_for_attribute(attr_name)
18
+ schema_cache = connection.schema_cache
21
19
 
22
- def column_for(attribute_name)
23
- if connection.schema_cache.data_source_exists?(table_name)
24
- connection.schema_cache.columns_hash(table_name)[attribute_name.to_s]
20
+ if schema_cache.data_source_exists?(table_name)
21
+ column = schema_cache.columns_hash(table_name)[attr_name.to_s]
22
+ type = connection.lookup_cast_type_from_column(column) if column
25
23
  end
24
+
25
+ type || Type.default_value
26
26
  end
27
+
28
+ delegate :connection, to: :@klass, private: true
29
+
30
+ private
31
+ attr_reader :table_name
27
32
  end
28
33
  end
29
34
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module TypeCaster
3
5
  class Map # :nodoc:
@@ -7,13 +9,12 @@ module ActiveRecord
7
9
 
8
10
  def type_cast_for_database(attr_name, value)
9
11
  return value if value.is_a?(Arel::Nodes::BindParam)
10
- type = types.type_for_attribute(attr_name.to_s)
12
+ type = types.type_for_attribute(attr_name)
11
13
  type.serialize(value)
12
14
  end
13
15
 
14
- protected
15
-
16
- attr_reader :types
16
+ private
17
+ attr_reader :types
17
18
  end
18
19
  end
19
20
  end
@@ -1,5 +1,7 @@
1
- require 'active_record/type_caster/map'
2
- require 'active_record/type_caster/connection'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/type_caster/map"
4
+ require "active_record/type_caster/connection"
3
5
 
4
6
  module ActiveRecord
5
7
  module TypeCaster # :nodoc:
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Validations
3
5
  class AbsenceValidator < ActiveModel::Validations::AbsenceValidator # :nodoc:
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Validations
3
5
  class AssociatedValidator < ActiveModel::EachValidator #:nodoc:
@@ -8,7 +10,6 @@ module ActiveRecord
8
10
  end
9
11
 
10
12
  private
11
-
12
13
  def valid_object?(record)
13
14
  (record.respond_to?(:marked_for_destruction?) && record.marked_for_destruction?) || record.valid?
14
15
  end
@@ -37,7 +38,7 @@ module ActiveRecord
37
38
  #
38
39
  # * <tt>:message</tt> - A custom error message (default is: "is invalid").
39
40
  # * <tt>:on</tt> - Specifies the contexts where this validation is active.
40
- # Runs in all validation contexts by default (nil). You can pass a symbol
41
+ # Runs in all validation contexts by default +nil+. You can pass a symbol
41
42
  # or an array of symbols. (e.g. <tt>on: :create</tt> or
42
43
  # <tt>on: :custom_validation_context</tt> or
43
44
  # <tt>on: [:create, :custom_validation_context]</tt>)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Validations
3
5
  class LengthValidator < ActiveModel::Validations::LengthValidator # :nodoc:
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Validations
3
5
  class PresenceValidator < ActiveModel::Validations::PresenceValidator # :nodoc:
@@ -44,7 +46,7 @@ module ActiveRecord
44
46
  # Configuration options:
45
47
  # * <tt>:message</tt> - A custom error message (default is: "can't be blank").
46
48
  # * <tt>:on</tt> - Specifies the contexts where this validation is active.
47
- # 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
48
50
  # or an array of symbols. (e.g. <tt>on: :create</tt> or
49
51
  # <tt>on: :custom_validation_context</tt> or
50
52
  # <tt>on: [:create, :custom_validation_context]</tt>)
@@ -57,7 +59,7 @@ module ActiveRecord
57
59
  # or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The method,
58
60
  # proc or string should return or evaluate to a +true+ or +false+ value.
59
61
  # * <tt>:strict</tt> - Specifies whether validation should be strict.
60
- # See ActiveModel::Validation#validates! for more information.
62
+ # See ActiveModel::Validations#validates! for more information.
61
63
  def validates_presence_of(*attr_names)
62
64
  validates_with PresenceValidator, _merge_attributes(attr_names)
63
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,24 +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)
23
+ relation = build_relation(finder_class, attribute, value)
19
24
  if record.persisted?
20
25
  if finder_class.primary_key
21
- relation = relation.where.not(finder_class.primary_key => record.id_was || record.id)
26
+ relation = relation.where.not(finder_class.primary_key => record.id_in_database)
22
27
  else
23
- raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.")
28
+ raise UnknownPrimaryKey.new(finder_class, "Cannot validate uniqueness for persisted record without primary key.")
24
29
  end
25
30
  end
26
- relation = scope_relation(record, table, relation)
31
+ relation = scope_relation(record, relation)
27
32
  relation = relation.merge(options[:conditions]) if options[:conditions]
28
33
 
29
34
  if relation.exists?
@@ -34,13 +39,13 @@ module ActiveRecord
34
39
  end
35
40
  end
36
41
 
37
- protected
42
+ private
38
43
  # The check for an existing value should be run from a class that
39
44
  # isn't abstract. This means working down from the current class
40
45
  # (self), to the first non-abstract class. Since classes don't know
41
46
  # their subclasses, we have to build the hierarchy between self and
42
47
  # the record's class.
43
- def find_finder_class_for(record) #:nodoc:
48
+ def find_finder_class_for(record)
44
49
  class_hierarchy = [record.class]
45
50
 
46
51
  while class_hierarchy.first != @klass
@@ -50,41 +55,25 @@ module ActiveRecord
50
55
  class_hierarchy.detect { |klass| !klass.abstract_class? }
51
56
  end
52
57
 
53
- def build_relation(klass, table, attribute, value) #:nodoc:
54
- if reflection = klass._reflect_on_association(attribute)
55
- attribute = reflection.foreign_key
56
- value = value.attributes[reflection.klass.primary_key] unless value.nil?
57
- 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?
58
62
 
59
- # the attribute may be an aliased attribute
60
- if klass.attribute_alias?(attribute)
61
- attribute = klass.attribute_alias(attribute)
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
62
71
  end
63
72
 
64
- attribute_name = attribute.to_s
65
-
66
- column = klass.columns_hash[attribute_name]
67
- cast_type = klass.type_for_attribute(attribute_name)
68
- value = cast_type.serialize(value)
69
- value = klass.connection.type_cast(value)
70
-
71
- comparison = if !options[:case_sensitive] && !value.nil?
72
- # will use SQL LOWER function before comparison, unless it detects a case insensitive collation
73
- klass.connection.case_insensitive_comparison(table, attribute, column, value)
74
- else
75
- klass.connection.case_sensitive_comparison(table, attribute, column, value)
76
- end
77
- if value.nil?
78
- klass.unscoped.where(comparison)
79
- else
80
- bind = Relation::QueryAttribute.new(attribute_name, value, Type::Value.new)
81
- klass.unscoped.where(comparison, bind)
82
- end
83
- rescue RangeError
84
- klass.none
73
+ relation.where!(comparison)
85
74
  end
86
75
 
87
- def scope_relation(record, table, relation)
76
+ def scope_relation(record, relation)
88
77
  Array(options[:scope]).each do |scope_item|
89
78
  scope_value = if record.class._reflect_on_association(scope_item)
90
79
  record.association(scope_item).reader
@@ -204,9 +193,7 @@ module ActiveRecord
204
193
  # | # Boom! We now have a duplicate
205
194
  # | # title!
206
195
  #
207
- # This could even happen if you use transactions with the 'serializable'
208
- # isolation level. The best way to work around this problem is to add a unique
209
- # index to the database table using
196
+ # The best way to work around this problem is to add a unique index to the database table using
210
197
  # {connection.add_index}[rdoc-ref:ConnectionAdapters::SchemaStatements#add_index].
211
198
  # In the rare case that a race condition occurs, the database will guarantee
212
199
  # the field's uniqueness.
@@ -218,7 +205,7 @@ module ActiveRecord
218
205
  # can catch it and restart the transaction (e.g. by telling the user
219
206
  # that the title already exists, and asking them to re-enter the title).
220
207
  # This technique is also known as
221
- # {optimistic concurrency control}[http://en.wikipedia.org/wiki/Optimistic_concurrency_control].
208
+ # {optimistic concurrency control}[https://en.wikipedia.org/wiki/Optimistic_concurrency_control].
222
209
  #
223
210
  # The bundled ActiveRecord::ConnectionAdapters distinguish unique index
224
211
  # constraint errors from other types of database errors by throwing an
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  # = Active Record \RecordInvalid
3
5
  #
@@ -38,15 +40,16 @@ module ActiveRecord
38
40
  include ActiveModel::Validations
39
41
 
40
42
  # The validation process on save can be skipped by passing <tt>validate: false</tt>.
43
+ # The validation context can be changed by passing <tt>context: context</tt>.
41
44
  # The regular {ActiveRecord::Base#save}[rdoc-ref:Persistence#save] method is replaced
42
45
  # with this when the validations module is mixed in, which it is by default.
43
- def save(options={})
46
+ def save(**options)
44
47
  perform_validations(options) ? super : false
45
48
  end
46
49
 
47
50
  # Attempts to save the record just like {ActiveRecord::Base#save}[rdoc-ref:Base#save] but
48
51
  # will raise an ActiveRecord::RecordInvalid exception instead of returning +false+ if the record is not valid.
49
- def save!(options={})
52
+ def save!(**options)
50
53
  perform_validations(options) ? super : raise_validation_error
51
54
  end
52
55
 
@@ -68,8 +71,7 @@ module ActiveRecord
68
71
 
69
72
  alias_method :validate, :valid?
70
73
 
71
- protected
72
-
74
+ private
73
75
  def default_validation_context
74
76
  new_record? ? :create : :update
75
77
  end
@@ -78,7 +80,7 @@ module ActiveRecord
78
80
  raise(RecordInvalid.new(self))
79
81
  end
80
82
 
81
- def perform_validations(options={}) # :nodoc:
83
+ def perform_validations(options = {})
82
84
  options[:validate] == false || valid?(options[:context])
83
85
  end
84
86
  end
@@ -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>