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,32 +1,81 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters #:nodoc:
3
5
  # Abstract representation of an index definition on a table. Instances of
4
6
  # this type are typically created and returned by methods in database
5
- # adapters. e.g. ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#indexes
6
- class IndexDefinition < Struct.new(:table, :name, :unique, :columns, :lengths, :orders, :where, :type, :using, :comment) #:nodoc:
7
+ # adapters. e.g. ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#indexes
8
+ class IndexDefinition # :nodoc:
9
+ attr_reader :table, :name, :unique, :columns, :lengths, :orders, :opclasses, :where, :type, :using, :comment
10
+
11
+ def initialize(
12
+ table, name,
13
+ unique = false,
14
+ columns = [],
15
+ lengths: {},
16
+ orders: {},
17
+ opclasses: {},
18
+ where: nil,
19
+ type: nil,
20
+ using: nil,
21
+ comment: nil
22
+ )
23
+ @table = table
24
+ @name = name
25
+ @unique = unique
26
+ @columns = columns
27
+ @lengths = concise_options(lengths)
28
+ @orders = concise_options(orders)
29
+ @opclasses = concise_options(opclasses)
30
+ @where = where
31
+ @type = type
32
+ @using = using
33
+ @comment = comment
34
+ end
35
+
36
+ private
37
+ def concise_options(options)
38
+ if columns.size == options.size && options.values.uniq.size == 1
39
+ options.values.first
40
+ else
41
+ options
42
+ end
43
+ end
7
44
  end
8
45
 
9
46
  # Abstract representation of a column definition. Instances of this type
10
47
  # are typically created by methods in TableDefinition, and added to the
11
48
  # +columns+ attribute of said TableDefinition object, in order to be used
12
49
  # for generating a number of table creation or table changing SQL statements.
13
- class ColumnDefinition < Struct.new(:name, :type, :limit, :precision, :scale, :default, :null, :first, :after, :auto_increment, :primary_key, :collation, :sql_type, :comment) #:nodoc:
14
-
50
+ ColumnDefinition = Struct.new(:name, :type, :options, :sql_type) do # :nodoc:
15
51
  def primary_key?
16
- primary_key || type.to_sym == :primary_key
52
+ options[:primary_key]
17
53
  end
18
- end
19
54
 
20
- class AddColumnDefinition < Struct.new(:column) # :nodoc:
21
- end
55
+ [:limit, :precision, :scale, :default, :null, :collation, :comment].each do |option_name|
56
+ module_eval <<-CODE, __FILE__, __LINE__ + 1
57
+ def #{option_name}
58
+ options[:#{option_name}]
59
+ end
22
60
 
23
- class ChangeColumnDefinition < Struct.new(:column, :name) #:nodoc:
24
- end
61
+ def #{option_name}=(value)
62
+ options[:#{option_name}] = value
63
+ end
64
+ CODE
65
+ end
25
66
 
26
- class PrimaryKeyDefinition < Struct.new(:name) # :nodoc:
67
+ def aliased_types(name, fallback)
68
+ "timestamp" == name ? :datetime : fallback
69
+ end
27
70
  end
28
71
 
29
- class ForeignKeyDefinition < Struct.new(:from_table, :to_table, :options) #:nodoc:
72
+ AddColumnDefinition = Struct.new(:column) # :nodoc:
73
+
74
+ ChangeColumnDefinition = Struct.new(:column, :name) #:nodoc:
75
+
76
+ PrimaryKeyDefinition = Struct.new(:name) # :nodoc:
77
+
78
+ ForeignKeyDefinition = Struct.new(:from_table, :to_table, :options) do #:nodoc:
30
79
  def name
31
80
  options[:name]
32
81
  end
@@ -51,19 +100,25 @@ module ActiveRecord
51
100
  options[:primary_key] != default_primary_key
52
101
  end
53
102
 
54
- def defined_for?(to_table_ord = nil, to_table: nil, **options)
55
- if to_table_ord
56
- self.to_table == to_table_ord.to_s
57
- else
58
- (to_table.nil? || to_table.to_s == self.to_table) &&
59
- options.all? { |k, v| self.options[k].to_s == v.to_s }
60
- end
103
+ def validate?
104
+ options.fetch(:validate, true)
61
105
  end
106
+ alias validated? validate?
62
107
 
63
- private
64
- def default_primary_key
65
- "id"
108
+ def export_name_on_schema_dump?
109
+ !ActiveRecord::SchemaDumper.fk_ignore_pattern.match?(name) if name
110
+ end
111
+
112
+ def defined_for?(to_table: nil, validate: nil, **options)
113
+ (to_table.nil? || to_table.to_s == self.to_table) &&
114
+ (validate.nil? || validate == options.fetch(:validate, validate)) &&
115
+ options.all? { |k, v| self.options[k].to_s == v.to_s }
66
116
  end
117
+
118
+ private
119
+ def default_primary_key
120
+ "id"
121
+ end
67
122
  end
68
123
 
69
124
  class ReferenceDefinition # :nodoc:
@@ -72,7 +127,7 @@ module ActiveRecord
72
127
  polymorphic: false,
73
128
  index: true,
74
129
  foreign_key: false,
75
- type: :integer,
130
+ type: :bigint,
76
131
  **options
77
132
  )
78
133
  @name = name
@@ -89,7 +144,8 @@ module ActiveRecord
89
144
 
90
145
  def add_to(table)
91
146
  columns.each do |column_options|
92
- table.column(*column_options)
147
+ kwargs = column_options.extract_options!
148
+ table.column(*column_options, **kwargs)
93
149
  end
94
150
 
95
151
  if index
@@ -97,89 +153,91 @@ module ActiveRecord
97
153
  end
98
154
 
99
155
  if foreign_key
100
- table.foreign_key(foreign_table_name, foreign_key_options)
156
+ table.foreign_key(foreign_table_name, **foreign_key_options)
101
157
  end
102
158
  end
103
159
 
104
- protected
105
-
106
- attr_reader :name, :polymorphic, :index, :foreign_key, :type, :options
107
-
108
160
  private
161
+ attr_reader :name, :polymorphic, :index, :foreign_key, :type, :options
109
162
 
110
- def as_options(value)
111
- value.is_a?(Hash) ? value : {}
112
- end
163
+ def as_options(value)
164
+ value.is_a?(Hash) ? value : {}
165
+ end
113
166
 
114
- def polymorphic_options
115
- as_options(polymorphic).merge(null: options[:null])
116
- end
167
+ def polymorphic_options
168
+ as_options(polymorphic).merge(options.slice(:null, :first, :after))
169
+ end
117
170
 
118
- def index_options
119
- as_options(index)
120
- end
171
+ def index_options
172
+ as_options(index)
173
+ end
121
174
 
122
- def foreign_key_options
123
- as_options(foreign_key).merge(column: column_name)
124
- end
175
+ def foreign_key_options
176
+ as_options(foreign_key).merge(column: column_name)
177
+ end
125
178
 
126
- def columns
127
- result = [[column_name, type, options]]
128
- if polymorphic
129
- result.unshift(["#{name}_type", :string, polymorphic_options])
179
+ def columns
180
+ result = [[column_name, type, options]]
181
+ if polymorphic
182
+ result.unshift(["#{name}_type", :string, polymorphic_options])
183
+ end
184
+ result
130
185
  end
131
- result
132
- end
133
186
 
134
- def column_name
135
- "#{name}_id"
136
- end
187
+ def column_name
188
+ "#{name}_id"
189
+ end
137
190
 
138
- def column_names
139
- columns.map(&:first)
140
- end
191
+ def column_names
192
+ columns.map(&:first)
193
+ end
141
194
 
142
- def foreign_table_name
143
- foreign_key_options.fetch(:to_table) do
144
- Base.pluralize_table_names ? name.to_s.pluralize : name
195
+ def foreign_table_name
196
+ foreign_key_options.fetch(:to_table) do
197
+ Base.pluralize_table_names ? name.to_s.pluralize : name
198
+ end
145
199
  end
146
- end
147
200
  end
148
201
 
149
202
  module ColumnMethods
203
+ extend ActiveSupport::Concern
204
+
150
205
  # Appends a primary key definition to the table definition.
151
206
  # Can be called multiple times, but this is probably not a good idea.
152
207
  def primary_key(name, type = :primary_key, **options)
153
- column(name, type, options.merge(primary_key: true))
208
+ column(name, type, **options.merge(primary_key: true))
154
209
  end
155
210
 
211
+ ##
212
+ # :method: column
213
+ # :call-seq: column(name, type, **options)
214
+ #
156
215
  # Appends a column or columns of a specified type.
157
216
  #
158
217
  # t.string(:goat)
159
218
  # t.string(:goat, :sheep)
160
219
  #
161
220
  # See TableDefinition#column
162
- [
163
- :bigint,
164
- :binary,
165
- :boolean,
166
- :date,
167
- :datetime,
168
- :decimal,
169
- :float,
170
- :integer,
171
- :string,
172
- :text,
173
- :time,
174
- :timestamp,
175
- ].each do |column_type|
176
- module_eval <<-CODE, __FILE__, __LINE__ + 1
177
- def #{column_type}(*args, **options)
178
- args.each { |name| column(name, :#{column_type}, options) }
221
+
222
+ included do
223
+ define_column_methods :bigint, :binary, :boolean, :date, :datetime, :decimal,
224
+ :float, :integer, :json, :string, :text, :time, :timestamp, :virtual
225
+
226
+ alias :numeric :decimal
227
+ end
228
+
229
+ class_methods do
230
+ private def define_column_methods(*column_types) # :nodoc:
231
+ column_types.each do |column_type|
232
+ module_eval <<-RUBY, __FILE__, __LINE__ + 1
233
+ def #{column_type}(*names, **options)
234
+ raise ArgumentError, "Missing column name(s) for #{column_type}" if names.empty?
235
+ names.each { |name| column(name, :#{column_type}, **options) }
236
+ end
237
+ RUBY
179
238
  end
180
- CODE
239
+ end
181
240
  end
182
- alias_method :numeric, :decimal
183
241
  end
184
242
 
185
243
  # Represents the schema of an SQL table in an abstract way. This class
@@ -203,15 +261,25 @@ module ActiveRecord
203
261
  class TableDefinition
204
262
  include ColumnMethods
205
263
 
206
- attr_accessor :indexes
207
- attr_reader :name, :temporary, :options, :as, :foreign_keys, :comment
264
+ attr_reader :name, :temporary, :if_not_exists, :options, :as, :comment, :indexes, :foreign_keys
208
265
 
209
- def initialize(name, temporary = false, options = nil, as = nil, comment: nil)
266
+ def initialize(
267
+ conn,
268
+ name,
269
+ temporary: false,
270
+ if_not_exists: false,
271
+ options: nil,
272
+ as: nil,
273
+ comment: nil,
274
+ **
275
+ )
276
+ @conn = conn
210
277
  @columns_hash = {}
211
278
  @indexes = []
212
279
  @foreign_keys = []
213
280
  @primary_keys = nil
214
281
  @temporary = temporary
282
+ @if_not_exists = if_not_exists
215
283
  @options = options
216
284
  @as = as
217
285
  @name = name
@@ -295,21 +363,24 @@ module ActiveRecord
295
363
  #
296
364
  # create_table :taggings do |t|
297
365
  # t.references :tag, index: { name: 'index_taggings_on_tag_id' }
298
- # t.references :tagger, polymorphic: true, index: true
299
- # t.references :taggable, polymorphic: { default: 'Photo' }
366
+ # t.references :tagger, polymorphic: true
367
+ # t.references :taggable, polymorphic: { default: 'Photo' }, index: false
300
368
  # end
301
- def column(name, type, options = {})
369
+ def column(name, type, **options)
302
370
  name = name.to_s
303
371
  type = type.to_sym if type
304
- options = options.dup
305
372
 
306
- if @columns_hash[name] && @columns_hash[name].primary_key?
307
- raise ArgumentError, "you can't redefine the primary key column '#{name}'. To define a custom primary key, pass { id: false } to create_table."
373
+ if @columns_hash[name]
374
+ if @columns_hash[name].primary_key?
375
+ raise ArgumentError, "you can't redefine the primary key column '#{name}'. To define a custom primary key, pass { id: false } to create_table."
376
+ else
377
+ raise ArgumentError, "you can't define an already defined column '#{name}'."
378
+ end
308
379
  end
309
380
 
310
381
  index_options = options.delete(:index)
311
382
  index(name, index_options.is_a?(Hash) ? index_options : {}) if index_options
312
- @columns_hash[name] = new_column_definition(name, type, options)
383
+ @columns_hash[name] = new_column_definition(name, type, **options)
313
384
  self
314
385
  end
315
386
 
@@ -327,65 +398,65 @@ module ActiveRecord
327
398
  indexes << [column_name, options]
328
399
  end
329
400
 
330
- def foreign_key(table_name, options = {}) # :nodoc:
331
- table_name_prefix = ActiveRecord::Base.table_name_prefix
332
- table_name_suffix = ActiveRecord::Base.table_name_suffix
333
- table_name = "#{table_name_prefix}#{table_name}#{table_name_suffix}"
334
- foreign_keys.push([table_name, options])
401
+ def foreign_key(table_name, **options) # :nodoc:
402
+ foreign_keys << [table_name, options]
335
403
  end
336
404
 
337
405
  # Appends <tt>:datetime</tt> columns <tt>:created_at</tt> and
338
406
  # <tt>:updated_at</tt> to the table. See {connection.add_timestamps}[rdoc-ref:SchemaStatements#add_timestamps]
339
407
  #
340
408
  # t.timestamps null: false
341
- def timestamps(*args)
342
- options = args.extract_options!
343
-
409
+ def timestamps(**options)
344
410
  options[:null] = false if options[:null].nil?
345
411
 
346
- column(:created_at, :datetime, options)
347
- column(:updated_at, :datetime, options)
412
+ if !options.key?(:precision) && @conn.supports_datetime_with_precision?
413
+ options[:precision] = 6
414
+ end
415
+
416
+ column(:created_at, :datetime, **options)
417
+ column(:updated_at, :datetime, **options)
348
418
  end
349
419
 
350
420
  # Adds a reference.
351
421
  #
352
422
  # t.references(:user)
353
423
  # t.belongs_to(:supplier, foreign_key: true)
424
+ # t.belongs_to(:supplier, foreign_key: true, type: :integer)
354
425
  #
355
426
  # See {connection.add_reference}[rdoc-ref:SchemaStatements#add_reference] for details of the options you can use.
356
427
  def references(*args, **options)
357
- args.each do |col|
358
- ReferenceDefinition.new(col, **options).add_to(self)
428
+ args.each do |ref_name|
429
+ ReferenceDefinition.new(ref_name, **options).add_to(self)
359
430
  end
360
431
  end
361
432
  alias :belongs_to :references
362
433
 
363
- def new_column_definition(name, type, options) # :nodoc:
434
+ def new_column_definition(name, type, **options) # :nodoc:
435
+ if integer_like_primary_key?(type, options)
436
+ type = integer_like_primary_key_type(type, options)
437
+ end
364
438
  type = aliased_types(type.to_s, type)
365
- column = create_column_definition name, type
366
-
367
- column.limit = options[:limit]
368
- column.precision = options[:precision]
369
- column.scale = options[:scale]
370
- column.default = options[:default]
371
- column.null = options[:null]
372
- column.first = options[:first]
373
- column.after = options[:after]
374
- column.auto_increment = options[:auto_increment]
375
- column.primary_key = type == :primary_key || options[:primary_key]
376
- column.collation = options[:collation]
377
- column.comment = options[:comment]
378
- column
439
+ options[:primary_key] ||= type == :primary_key
440
+ options[:null] = false if options[:primary_key]
441
+ create_column_definition(name, type, options)
379
442
  end
380
443
 
381
444
  private
382
- def create_column_definition(name, type)
383
- ColumnDefinition.new name, type
384
- end
445
+ def create_column_definition(name, type, options)
446
+ ColumnDefinition.new(name, type, options)
447
+ end
385
448
 
386
- def aliased_types(name, fallback)
387
- 'timestamp' == name ? :datetime : fallback
388
- end
449
+ def aliased_types(name, fallback)
450
+ "timestamp" == name ? :datetime : fallback
451
+ end
452
+
453
+ def integer_like_primary_key?(type, options)
454
+ options[:primary_key] && [:integer, :bigint].include?(type) && !options.key?(:default)
455
+ end
456
+
457
+ def integer_like_primary_key_type(type, options)
458
+ type
459
+ end
389
460
  end
390
461
 
391
462
  class AlterTable # :nodoc:
@@ -410,10 +481,10 @@ module ActiveRecord
410
481
  @foreign_key_drops << name
411
482
  end
412
483
 
413
- def add_column(name, type, options)
484
+ def add_column(name, type, **options)
414
485
  name = name.to_s
415
486
  type = type.to_sym
416
- @adds << AddColumnDefinition.new(@td.new_column_definition(name, type, options))
487
+ @adds << AddColumnDefinition.new(@td.new_column_definition(name, type, **options))
417
488
  end
418
489
  end
419
490
 
@@ -446,7 +517,11 @@ module ActiveRecord
446
517
  # t.date
447
518
  # t.binary
448
519
  # t.boolean
520
+ # t.foreign_key
521
+ # t.json
522
+ # t.virtual
449
523
  # t.remove
524
+ # t.remove_foreign_key
450
525
  # t.remove_references
451
526
  # t.remove_belongs_to
452
527
  # t.remove_index
@@ -468,17 +543,19 @@ module ActiveRecord
468
543
  # t.column(:name, :string)
469
544
  #
470
545
  # See TableDefinition#column for details of the options you can use.
471
- def column(column_name, type, options = {})
472
- @base.add_column(name, column_name, type, options)
546
+ def column(column_name, type, **options)
547
+ index_options = options.delete(:index)
548
+ @base.add_column(name, column_name, type, **options)
549
+ index(column_name, index_options.is_a?(Hash) ? index_options : {}) if index_options
473
550
  end
474
551
 
475
552
  # Checks to see if a column exists.
476
553
  #
477
- # t.string(:name) unless t.column_exists?(:name, :string)
554
+ # t.string(:name) unless t.column_exists?(:name, :string)
478
555
  #
479
556
  # See {connection.column_exists?}[rdoc-ref:SchemaStatements#column_exists?]
480
- def column_exists?(column_name, type = nil, options = {})
481
- @base.column_exists?(name, column_name, type, options)
557
+ def column_exists?(column_name, type = nil, **options)
558
+ @base.column_exists?(name, column_name, type, **options)
482
559
  end
483
560
 
484
561
  # Adds a new index to the table. +column_name+ can be a single Symbol, or
@@ -495,9 +572,9 @@ module ActiveRecord
495
572
 
496
573
  # Checks to see if an index exists.
497
574
  #
498
- # unless t.index_exists?(:branch_id)
499
- # t.index(:branch_id)
500
- # end
575
+ # unless t.index_exists?(:branch_id)
576
+ # t.index(:branch_id)
577
+ # end
501
578
  #
502
579
  # See {connection.index_exists?}[rdoc-ref:SchemaStatements#index_exists?]
503
580
  def index_exists?(column_name, options = {})
@@ -518,8 +595,8 @@ module ActiveRecord
518
595
  # t.timestamps(null: false)
519
596
  #
520
597
  # See {connection.add_timestamps}[rdoc-ref:SchemaStatements#add_timestamps]
521
- def timestamps(options = {})
522
- @base.add_timestamps(name, options)
598
+ def timestamps(**options)
599
+ @base.add_timestamps(name, **options)
523
600
  end
524
601
 
525
602
  # Changes the column's definition according to the new options.
@@ -569,8 +646,8 @@ module ActiveRecord
569
646
  # t.remove_timestamps
570
647
  #
571
648
  # See {connection.remove_timestamps}[rdoc-ref:SchemaStatements#remove_timestamps]
572
- def remove_timestamps(options = {})
573
- @base.remove_timestamps(name, options)
649
+ def remove_timestamps(**options)
650
+ @base.remove_timestamps(name, **options)
574
651
  end
575
652
 
576
653
  # Renames a column.
@@ -588,10 +665,9 @@ module ActiveRecord
588
665
  # t.belongs_to(:supplier, foreign_key: true)
589
666
  #
590
667
  # See {connection.add_reference}[rdoc-ref:SchemaStatements#add_reference] for details of the options you can use.
591
- def references(*args)
592
- options = args.extract_options!
668
+ def references(*args, **options)
593
669
  args.each do |ref_name|
594
- @base.add_reference(name, ref_name, options)
670
+ @base.add_reference(name, ref_name, **options)
595
671
  end
596
672
  end
597
673
  alias :belongs_to :references
@@ -602,30 +678,40 @@ module ActiveRecord
602
678
  # t.remove_belongs_to(:supplier, polymorphic: true)
603
679
  #
604
680
  # See {connection.remove_reference}[rdoc-ref:SchemaStatements#remove_reference]
605
- def remove_references(*args)
606
- options = args.extract_options!
681
+ def remove_references(*args, **options)
607
682
  args.each do |ref_name|
608
- @base.remove_reference(name, ref_name, options)
683
+ @base.remove_reference(name, ref_name, **options)
609
684
  end
610
685
  end
611
686
  alias :remove_belongs_to :remove_references
612
687
 
613
- # Adds a foreign key.
688
+ # Adds a foreign key to the table using a supplied table name.
614
689
  #
615
- # t.foreign_key(:authors)
690
+ # t.foreign_key(:authors)
691
+ # t.foreign_key(:authors, column: :author_id, primary_key: "id")
616
692
  #
617
693
  # See {connection.add_foreign_key}[rdoc-ref:SchemaStatements#add_foreign_key]
618
- def foreign_key(*args) # :nodoc:
619
- @base.add_foreign_key(name, *args)
694
+ def foreign_key(*args, **options)
695
+ @base.add_foreign_key(name, *args, **options)
696
+ end
697
+
698
+ # Removes the given foreign key from the table.
699
+ #
700
+ # t.remove_foreign_key(:authors)
701
+ # t.remove_foreign_key(column: :author_id)
702
+ #
703
+ # See {connection.remove_foreign_key}[rdoc-ref:SchemaStatements#remove_foreign_key]
704
+ def remove_foreign_key(*args, **options)
705
+ @base.remove_foreign_key(name, *args, **options)
620
706
  end
621
707
 
622
708
  # Checks to see if a foreign key exists.
623
709
  #
624
- # t.foreign_key(:authors) unless t.foreign_key_exists?(:authors)
710
+ # t.foreign_key(:authors) unless t.foreign_key_exists?(:authors)
625
711
  #
626
712
  # See {connection.foreign_key_exists?}[rdoc-ref:SchemaStatements#foreign_key_exists?]
627
- def foreign_key_exists?(*args) # :nodoc:
628
- @base.foreign_key_exists?(name, *args)
713
+ def foreign_key_exists?(*args, **options)
714
+ @base.foreign_key_exists?(name, *args, **options)
629
715
  end
630
716
  end
631
717
  end