activerecord 4.2.11.3 → 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 +4 -4
  2. data/CHANGELOG.md +613 -1643
  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.rb +41 -22
  8. data/lib/active_record/aggregations.rb +267 -251
  9. data/lib/active_record/association_relation.rb +11 -6
  10. data/lib/active_record/associations.rb +1737 -1597
  11. data/lib/active_record/associations/alias_tracker.rb +29 -35
  12. data/lib/active_record/associations/association.rb +125 -58
  13. data/lib/active_record/associations/association_scope.rb +103 -132
  14. data/lib/active_record/associations/belongs_to_association.rb +65 -60
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  16. data/lib/active_record/associations/builder/association.rb +27 -40
  17. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  18. data/lib/active_record/associations/builder/collection_association.rb +10 -33
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +52 -66
  20. data/lib/active_record/associations/builder/has_many.rb +8 -4
  21. data/lib/active_record/associations/builder/has_one.rb +46 -5
  22. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  23. data/lib/active_record/associations/collection_association.rb +131 -287
  24. data/lib/active_record/associations/collection_proxy.rb +241 -146
  25. data/lib/active_record/associations/foreign_association.rb +10 -1
  26. data/lib/active_record/associations/has_many_association.rb +34 -97
  27. data/lib/active_record/associations/has_many_through_association.rb +60 -87
  28. data/lib/active_record/associations/has_one_association.rb +61 -49
  29. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  30. data/lib/active_record/associations/join_dependency.rb +137 -167
  31. data/lib/active_record/associations/join_dependency/join_association.rb +38 -86
  32. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  33. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  34. data/lib/active_record/associations/preloader.rb +90 -92
  35. data/lib/active_record/associations/preloader/association.rb +90 -123
  36. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  37. data/lib/active_record/associations/singular_association.rb +18 -39
  38. data/lib/active_record/associations/through_association.rb +38 -18
  39. data/lib/active_record/attribute_assignment.rb +56 -183
  40. data/lib/active_record/attribute_decorators.rb +39 -15
  41. data/lib/active_record/attribute_methods.rb +120 -135
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -8
  43. data/lib/active_record/attribute_methods/dirty.rb +174 -144
  44. data/lib/active_record/attribute_methods/primary_key.rb +91 -83
  45. data/lib/active_record/attribute_methods/query.rb +6 -5
  46. data/lib/active_record/attribute_methods/read.rb +20 -76
  47. data/lib/active_record/attribute_methods/serialization.rb +40 -20
  48. data/lib/active_record/attribute_methods/time_zone_conversion.rb +58 -36
  49. data/lib/active_record/attribute_methods/write.rb +32 -54
  50. data/lib/active_record/attributes.rb +214 -82
  51. data/lib/active_record/autosave_association.rb +91 -37
  52. data/lib/active_record/base.rb +57 -45
  53. data/lib/active_record/callbacks.rb +100 -74
  54. data/lib/active_record/coders/json.rb +3 -1
  55. data/lib/active_record/coders/yaml_column.rb +24 -12
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +796 -296
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +234 -115
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +82 -23
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -46
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +356 -227
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +664 -243
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +191 -83
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +460 -204
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +510 -635
  69. data/lib/active_record/connection_adapters/column.rb +56 -43
  70. data/lib/active_record/connection_adapters/connection_specification.rb +174 -152
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +58 -180
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -114
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  86. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +50 -58
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  88. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +4 -2
  90. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -22
  93. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  94. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -3
  95. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -19
  96. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  98. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  100. data/lib/active_record/connection_adapters/postgresql/oid/{integer.rb → oid.rb} +6 -2
  101. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +33 -11
  102. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -34
  103. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  104. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  105. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +10 -5
  106. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +470 -290
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +12 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +551 -356
  117. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  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 +290 -345
  127. data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
  128. data/lib/active_record/connection_handling.rb +176 -41
  129. data/lib/active_record/core.rb +251 -231
  130. data/lib/active_record/counter_cache.rb +67 -49
  131. data/lib/active_record/database_configurations.rb +233 -0
  132. data/lib/active_record/database_configurations/database_config.rb +37 -0
  133. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  134. data/lib/active_record/database_configurations/url_config.rb +79 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -105
  137. data/lib/active_record/enum.rb +163 -86
  138. data/lib/active_record/errors.rb +188 -53
  139. data/lib/active_record/explain.rb +23 -11
  140. data/lib/active_record/explain_registry.rb +4 -2
  141. data/lib/active_record/explain_subscriber.rb +10 -5
  142. data/lib/active_record/fixture_set/file.rb +35 -9
  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 +153 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  147. data/lib/active_record/fixtures.rb +228 -499
  148. data/lib/active_record/gem_version.rb +6 -4
  149. data/lib/active_record/inheritance.rb +158 -112
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +123 -29
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +21 -3
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +87 -96
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +76 -33
  158. data/lib/active_record/middleware/database_selector.rb +75 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  160. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  161. data/lib/active_record/migration.rb +621 -303
  162. data/lib/active_record/migration/command_recorder.rb +177 -90
  163. data/lib/active_record/migration/compatibility.rb +244 -0
  164. data/lib/active_record/migration/join_table.rb +8 -6
  165. data/lib/active_record/model_schema.rb +312 -112
  166. data/lib/active_record/nested_attributes.rb +264 -222
  167. data/lib/active_record/no_touching.rb +14 -1
  168. data/lib/active_record/null_relation.rb +24 -37
  169. data/lib/active_record/persistence.rb +557 -125
  170. data/lib/active_record/query_cache.rb +19 -23
  171. data/lib/active_record/querying.rb +43 -29
  172. data/lib/active_record/railtie.rb +143 -44
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +2 -0
  175. data/lib/active_record/railties/controller_runtime.rb +34 -33
  176. data/lib/active_record/railties/databases.rake +328 -185
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +428 -279
  179. data/lib/active_record/relation.rb +518 -341
  180. data/lib/active_record/relation/batches.rb +207 -55
  181. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  182. data/lib/active_record/relation/calculations.rb +267 -253
  183. data/lib/active_record/relation/delegation.rb +70 -80
  184. data/lib/active_record/relation/finder_methods.rb +277 -241
  185. data/lib/active_record/relation/from_clause.rb +26 -0
  186. data/lib/active_record/relation/merger.rb +78 -87
  187. data/lib/active_record/relation/predicate_builder.rb +114 -119
  188. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
  189. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  190. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  191. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  192. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  193. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  194. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  195. data/lib/active_record/relation/query_attribute.rb +50 -0
  196. data/lib/active_record/relation/query_methods.rb +575 -394
  197. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  198. data/lib/active_record/relation/spawn_methods.rb +11 -13
  199. data/lib/active_record/relation/where_clause.rb +190 -0
  200. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  201. data/lib/active_record/result.rb +79 -42
  202. data/lib/active_record/runtime_registry.rb +6 -4
  203. data/lib/active_record/sanitization.rb +144 -121
  204. data/lib/active_record/schema.rb +21 -24
  205. data/lib/active_record/schema_dumper.rb +112 -93
  206. data/lib/active_record/schema_migration.rb +24 -17
  207. data/lib/active_record/scoping.rb +45 -26
  208. data/lib/active_record/scoping/default.rb +101 -85
  209. data/lib/active_record/scoping/named.rb +86 -33
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +5 -5
  212. data/lib/active_record/statement_cache.rb +73 -36
  213. data/lib/active_record/store.rb +127 -42
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +75 -0
  216. data/lib/active_record/tasks/database_tasks.rb +307 -100
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +55 -99
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +81 -41
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +38 -16
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +224 -0
  222. data/lib/active_record/timestamp.rb +86 -40
  223. data/lib/active_record/touch_later.rb +66 -0
  224. data/lib/active_record/transactions.rb +216 -150
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type.rb +78 -23
  227. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  228. data/lib/active_record/type/date.rb +4 -45
  229. data/lib/active_record/type/date_time.rb +4 -49
  230. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  231. data/lib/active_record/type/hash_lookup_type_map.rb +5 -3
  232. data/lib/active_record/type/internal/timezone.rb +17 -0
  233. data/lib/active_record/type/json.rb +30 -0
  234. data/lib/active_record/type/serialized.rb +24 -15
  235. data/lib/active_record/type/text.rb +2 -2
  236. data/lib/active_record/type/time.rb +11 -16
  237. data/lib/active_record/type/type_map.rb +15 -17
  238. data/lib/active_record/type/unsigned_integer.rb +9 -7
  239. data/lib/active_record/type_caster.rb +9 -0
  240. data/lib/active_record/type_caster/connection.rb +34 -0
  241. data/lib/active_record/type_caster/map.rb +20 -0
  242. data/lib/active_record/validations.rb +39 -35
  243. data/lib/active_record/validations/absence.rb +25 -0
  244. data/lib/active_record/validations/associated.rb +13 -4
  245. data/lib/active_record/validations/length.rb +26 -0
  246. data/lib/active_record/validations/presence.rb +14 -13
  247. data/lib/active_record/validations/uniqueness.rb +42 -55
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/arel.rb +51 -0
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/attributes/attribute.rb +37 -0
  253. data/lib/arel/collectors/bind.rb +24 -0
  254. data/lib/arel/collectors/composite.rb +31 -0
  255. data/lib/arel/collectors/plain_string.rb +20 -0
  256. data/lib/arel/collectors/sql_string.rb +20 -0
  257. data/lib/arel/collectors/substitute_binds.rb +28 -0
  258. data/lib/arel/crud.rb +42 -0
  259. data/lib/arel/delete_manager.rb +18 -0
  260. data/lib/arel/errors.rb +9 -0
  261. data/lib/arel/expressions.rb +29 -0
  262. data/lib/arel/factory_methods.rb +49 -0
  263. data/lib/arel/insert_manager.rb +49 -0
  264. data/lib/arel/math.rb +45 -0
  265. data/lib/arel/nodes.rb +68 -0
  266. data/lib/arel/nodes/and.rb +32 -0
  267. data/lib/arel/nodes/ascending.rb +23 -0
  268. data/lib/arel/nodes/binary.rb +52 -0
  269. data/lib/arel/nodes/bind_param.rb +36 -0
  270. data/lib/arel/nodes/case.rb +55 -0
  271. data/lib/arel/nodes/casted.rb +50 -0
  272. data/lib/arel/nodes/comment.rb +29 -0
  273. data/lib/arel/nodes/count.rb +12 -0
  274. data/lib/arel/nodes/delete_statement.rb +45 -0
  275. data/lib/arel/nodes/descending.rb +23 -0
  276. data/lib/arel/nodes/equality.rb +18 -0
  277. data/lib/arel/nodes/extract.rb +24 -0
  278. data/lib/arel/nodes/false.rb +16 -0
  279. data/lib/arel/nodes/full_outer_join.rb +8 -0
  280. data/lib/arel/nodes/function.rb +44 -0
  281. data/lib/arel/nodes/grouping.rb +8 -0
  282. data/lib/arel/nodes/in.rb +8 -0
  283. data/lib/arel/nodes/infix_operation.rb +80 -0
  284. data/lib/arel/nodes/inner_join.rb +8 -0
  285. data/lib/arel/nodes/insert_statement.rb +37 -0
  286. data/lib/arel/nodes/join_source.rb +20 -0
  287. data/lib/arel/nodes/matches.rb +18 -0
  288. data/lib/arel/nodes/named_function.rb +23 -0
  289. data/lib/arel/nodes/node.rb +50 -0
  290. data/lib/arel/nodes/node_expression.rb +13 -0
  291. data/lib/arel/nodes/outer_join.rb +8 -0
  292. data/lib/arel/nodes/over.rb +15 -0
  293. data/lib/arel/nodes/regexp.rb +16 -0
  294. data/lib/arel/nodes/right_outer_join.rb +8 -0
  295. data/lib/arel/nodes/select_core.rb +67 -0
  296. data/lib/arel/nodes/select_statement.rb +41 -0
  297. data/lib/arel/nodes/sql_literal.rb +16 -0
  298. data/lib/arel/nodes/string_join.rb +11 -0
  299. data/lib/arel/nodes/table_alias.rb +27 -0
  300. data/lib/arel/nodes/terminal.rb +16 -0
  301. data/lib/arel/nodes/true.rb +16 -0
  302. data/lib/arel/nodes/unary.rb +45 -0
  303. data/lib/arel/nodes/unary_operation.rb +20 -0
  304. data/lib/arel/nodes/unqualified_column.rb +22 -0
  305. data/lib/arel/nodes/update_statement.rb +41 -0
  306. data/lib/arel/nodes/values_list.rb +9 -0
  307. data/lib/arel/nodes/window.rb +126 -0
  308. data/lib/arel/nodes/with.rb +11 -0
  309. data/lib/arel/order_predications.rb +13 -0
  310. data/lib/arel/predications.rb +257 -0
  311. data/lib/arel/select_manager.rb +271 -0
  312. data/lib/arel/table.rb +110 -0
  313. data/lib/arel/tree_manager.rb +72 -0
  314. data/lib/arel/update_manager.rb +34 -0
  315. data/lib/arel/visitors.rb +20 -0
  316. data/lib/arel/visitors/depth_first.rb +204 -0
  317. data/lib/arel/visitors/dot.rb +297 -0
  318. data/lib/arel/visitors/ibm_db.rb +34 -0
  319. data/lib/arel/visitors/informix.rb +62 -0
  320. data/lib/arel/visitors/mssql.rb +157 -0
  321. data/lib/arel/visitors/mysql.rb +83 -0
  322. data/lib/arel/visitors/oracle.rb +159 -0
  323. data/lib/arel/visitors/oracle12.rb +66 -0
  324. data/lib/arel/visitors/postgresql.rb +110 -0
  325. data/lib/arel/visitors/sqlite.rb +39 -0
  326. data/lib/arel/visitors/to_sql.rb +889 -0
  327. data/lib/arel/visitors/visitor.rb +46 -0
  328. data/lib/arel/visitors/where_sql.rb +23 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/rails/generators/active_record.rb +7 -5
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration.rb +31 -1
  334. data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
  335. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  336. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -2
  337. data/lib/rails/generators/active_record/model/model_generator.rb +19 -22
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  340. metadata +164 -59
  341. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  342. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  343. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  344. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  345. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  346. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  347. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  348. data/lib/active_record/attribute.rb +0 -163
  349. data/lib/active_record/attribute_set.rb +0 -81
  350. data/lib/active_record/attribute_set/builder.rb +0 -106
  351. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
  352. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  353. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  354. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
  355. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  356. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  359. data/lib/active_record/type/big_integer.rb +0 -13
  360. data/lib/active_record/type/binary.rb +0 -50
  361. data/lib/active_record/type/boolean.rb +0 -31
  362. data/lib/active_record/type/decimal.rb +0 -64
  363. data/lib/active_record/type/decorator.rb +0 -14
  364. data/lib/active_record/type/float.rb +0 -19
  365. data/lib/active_record/type/integer.rb +0 -59
  366. data/lib/active_record/type/mutable.rb +0 -16
  367. data/lib/active_record/type/numeric.rb +0 -36
  368. data/lib/active_record/type/string.rb +0 -40
  369. data/lib/active_record/type/time_value.rb +0 -38
  370. data/lib/active_record/type/value.rb +0 -110
  371. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  372. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  class Migration
3
5
  # <tt>ActiveRecord::Migration::CommandRecorder</tt> records commands done during
@@ -5,15 +7,39 @@ module ActiveRecord
5
7
  # knows how to invert the following commands:
6
8
  #
7
9
  # * add_column
10
+ # * add_foreign_key
8
11
  # * add_index
12
+ # * add_reference
9
13
  # * add_timestamps
10
- # * create_table
14
+ # * change_column
15
+ # * change_column_default (must supply a :from and :to option)
16
+ # * change_column_null
17
+ # * change_column_comment (must supply a :from and :to option)
18
+ # * change_table_comment (must supply a :from and :to option)
11
19
  # * create_join_table
20
+ # * create_table
21
+ # * disable_extension
22
+ # * drop_join_table
23
+ # * drop_table (must supply a block)
24
+ # * enable_extension
25
+ # * remove_column (must supply a type)
26
+ # * remove_columns (must specify at least one column name or more)
27
+ # * remove_foreign_key (must supply a second table)
28
+ # * remove_index
29
+ # * remove_reference
12
30
  # * remove_timestamps
13
31
  # * rename_column
14
32
  # * rename_index
15
33
  # * rename_table
16
34
  class CommandRecorder
35
+ ReversibleAndIrreversibleMethods = [:create_table, :create_join_table, :rename_table, :add_column, :remove_column,
36
+ :rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,
37
+ :change_column_default, :add_reference, :remove_reference, :transaction,
38
+ :drop_join_table, :drop_table, :execute_block, :enable_extension, :disable_extension,
39
+ :change_column, :execute, :remove_columns, :change_column_null,
40
+ :add_foreign_key, :remove_foreign_key,
41
+ :change_column_comment, :change_table_comment
42
+ ]
17
43
  include JoinTable
18
44
 
19
45
  attr_accessor :commands, :delegate, :reverting
@@ -41,7 +67,7 @@ module ActiveRecord
41
67
  @reverting = !@reverting
42
68
  end
43
69
 
44
- # record +command+. +command+ should be a method name and arguments.
70
+ # Record +command+. +command+ should be a method name and arguments.
45
71
  # For example:
46
72
  #
47
73
  # recorder.record(:method_name, [:arg1, :arg2])
@@ -62,22 +88,16 @@ module ActiveRecord
62
88
  # invert the +command+.
63
89
  def inverse_of(command, args, &block)
64
90
  method = :"invert_#{command}"
65
- raise IrreversibleMigration unless respond_to?(method, true)
91
+ raise IrreversibleMigration, <<~MSG unless respond_to?(method, true)
92
+ This migration uses #{command}, which is not automatically reversible.
93
+ To make the migration reversible you can either:
94
+ 1. Define #up and #down methods in place of the #change method.
95
+ 2. Use the #reversible method to define reversible behavior.
96
+ MSG
66
97
  send(method, args, &block)
67
98
  end
68
99
 
69
- def respond_to?(*args) # :nodoc:
70
- super || delegate.respond_to?(*args)
71
- end
72
-
73
- [:create_table, :create_join_table, :rename_table, :add_column, :remove_column,
74
- :rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,
75
- :change_column_default, :add_reference, :remove_reference, :transaction,
76
- :drop_join_table, :drop_table, :execute_block, :enable_extension,
77
- :change_column, :execute, :remove_columns, :change_column_null,
78
- :add_foreign_key, :remove_foreign_key
79
- # irreversible methods need to be here too
80
- ].each do |method|
100
+ ReversibleAndIrreversibleMethods.each do |method|
81
101
  class_eval <<-EOV, __FILE__, __LINE__ + 1
82
102
  def #{method}(*args, &block) # def create_table(*args, &block)
83
103
  record(:"#{method}", args, &block) # record(:create_table, args, &block)
@@ -91,107 +111,174 @@ module ActiveRecord
91
111
  yield delegate.update_table_definition(table_name, self)
92
112
  end
93
113
 
114
+ def replay(migration)
115
+ commands.each do |cmd, args, block|
116
+ migration.send(cmd, *args, &block)
117
+ end
118
+ end
119
+
94
120
  private
95
121
 
96
- module StraightReversions
97
- private
98
- { transaction: :transaction,
99
- execute_block: :execute_block,
100
- create_table: :drop_table,
101
- create_join_table: :drop_join_table,
102
- add_column: :remove_column,
103
- add_timestamps: :remove_timestamps,
104
- add_reference: :remove_reference,
105
- enable_extension: :disable_extension
106
- }.each do |cmd, inv|
107
- [[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
108
- class_eval <<-EOV, __FILE__, __LINE__ + 1
109
- def invert_#{method}(args, &block) # def invert_create_table(args, &block)
110
- [:#{inverse}, args, block] # [:drop_table, args, block]
111
- end # end
112
- EOV
122
+ module StraightReversions # :nodoc:
123
+ private
124
+ {
125
+ execute_block: :execute_block,
126
+ create_table: :drop_table,
127
+ create_join_table: :drop_join_table,
128
+ add_column: :remove_column,
129
+ add_timestamps: :remove_timestamps,
130
+ add_reference: :remove_reference,
131
+ enable_extension: :disable_extension
132
+ }.each do |cmd, inv|
133
+ [[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
134
+ class_eval <<-EOV, __FILE__, __LINE__ + 1
135
+ def invert_#{method}(args, &block) # def invert_create_table(args, &block)
136
+ [:#{inverse}, args, block] # [:drop_table, args, block]
137
+ end # end
138
+ EOV
139
+ end
140
+ end
141
+ end
142
+
143
+ include StraightReversions
144
+
145
+ def invert_transaction(args)
146
+ sub_recorder = CommandRecorder.new(delegate)
147
+ sub_recorder.revert { yield }
148
+
149
+ invertions_proc = proc {
150
+ sub_recorder.replay(self)
151
+ }
152
+
153
+ [:transaction, args, invertions_proc]
154
+ end
155
+
156
+ def invert_drop_table(args, &block)
157
+ if args.size == 1 && block == nil
158
+ raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
113
159
  end
160
+ super
114
161
  end
115
- end
116
162
 
117
- include StraightReversions
163
+ def invert_rename_table(args)
164
+ [:rename_table, args.reverse]
165
+ end
118
166
 
119
- def invert_drop_table(args, &block)
120
- if args.size == 1 && block == nil
121
- raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
167
+ def invert_remove_column(args)
168
+ raise ActiveRecord::IrreversibleMigration, "remove_column is only reversible if given a type." if args.size <= 2
169
+ super
122
170
  end
123
- super
124
- end
125
171
 
126
- def invert_rename_table(args)
127
- [:rename_table, args.reverse]
128
- end
172
+ def invert_rename_index(args)
173
+ [:rename_index, [args.first] + args.last(2).reverse]
174
+ end
129
175
 
130
- def invert_remove_column(args)
131
- raise ActiveRecord::IrreversibleMigration, "remove_column is only reversible if given a type." if args.size <= 2
132
- super
133
- end
176
+ def invert_rename_column(args)
177
+ [:rename_column, [args.first] + args.last(2).reverse]
178
+ end
134
179
 
135
- def invert_rename_index(args)
136
- [:rename_index, [args.first] + args.last(2).reverse]
137
- end
180
+ def invert_add_index(args)
181
+ table, columns, options = *args
182
+ options ||= {}
138
183
 
139
- def invert_rename_column(args)
140
- [:rename_column, [args.first] + args.last(2).reverse]
141
- end
184
+ options_hash = options.slice(:name, :algorithm)
185
+ options_hash[:column] = columns if !options_hash[:name]
142
186
 
143
- def invert_add_index(args)
144
- table, columns, options = *args
145
- options ||= {}
187
+ [:remove_index, [table, options_hash]]
188
+ end
146
189
 
147
- index_name = options[:name]
148
- options_hash = index_name ? { name: index_name } : { column: columns }
190
+ def invert_remove_index(args)
191
+ table, options_or_column = *args
192
+ if (options = options_or_column).is_a?(Hash)
193
+ unless options[:column]
194
+ raise ActiveRecord::IrreversibleMigration, "remove_index is only reversible if given a :column option."
195
+ end
196
+ options = options.dup
197
+ [:add_index, [table, options.delete(:column), options]]
198
+ elsif (column = options_or_column).present?
199
+ [:add_index, [table, column]]
200
+ end
201
+ end
149
202
 
150
- [:remove_index, [table, options_hash]]
151
- end
203
+ alias :invert_add_belongs_to :invert_add_reference
204
+ alias :invert_remove_belongs_to :invert_remove_reference
152
205
 
153
- def invert_remove_index(args)
154
- table, options = *args
206
+ def invert_change_column_default(args)
207
+ table, column, options = *args
155
208
 
156
- unless options && options.is_a?(Hash) && options[:column]
157
- raise ActiveRecord::IrreversibleMigration, "remove_index is only reversible if given a :column option."
209
+ unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
210
+ raise ActiveRecord::IrreversibleMigration, "change_column_default is only reversible if given a :from and :to option."
211
+ end
212
+
213
+ [:change_column_default, [table, column, from: options[:to], to: options[:from]]]
158
214
  end
159
215
 
160
- options = options.dup
161
- [:add_index, [table, options.delete(:column), options]]
162
- end
216
+ def invert_change_column_null(args)
217
+ args[2] = !args[2]
218
+ [:change_column_null, args]
219
+ end
163
220
 
164
- alias :invert_add_belongs_to :invert_add_reference
165
- alias :invert_remove_belongs_to :invert_remove_reference
221
+ def invert_add_foreign_key(args)
222
+ from_table, to_table, add_options = args
223
+ add_options ||= {}
166
224
 
167
- def invert_change_column_null(args)
168
- args[2] = !args[2]
169
- [:change_column_null, args]
170
- end
225
+ if add_options[:name]
226
+ options = { name: add_options[:name] }
227
+ elsif add_options[:column]
228
+ options = { column: add_options[:column] }
229
+ else
230
+ options = to_table
231
+ end
171
232
 
172
- def invert_add_foreign_key(args)
173
- from_table, to_table, add_options = args
174
- add_options ||= {}
233
+ [:remove_foreign_key, [from_table, options]]
234
+ end
175
235
 
176
- if add_options[:name]
177
- options = { name: add_options[:name] }
178
- elsif add_options[:column]
179
- options = { column: add_options[:column] }
180
- else
181
- options = to_table
236
+ def invert_remove_foreign_key(args)
237
+ options = args.extract_options!
238
+ from_table, to_table = args
239
+
240
+ to_table ||= options.delete(:to_table)
241
+
242
+ raise ActiveRecord::IrreversibleMigration, "remove_foreign_key is only reversible if given a second table" if to_table.nil?
243
+
244
+ reversed_args = [from_table, to_table]
245
+ reversed_args << options unless options.empty?
246
+
247
+ [:add_foreign_key, reversed_args]
182
248
  end
183
249
 
184
- [:remove_foreign_key, [from_table, options]]
185
- end
250
+ def invert_change_column_comment(args)
251
+ table, column, options = *args
186
252
 
187
- # Forwards any missing method call to the \target.
188
- def method_missing(method, *args, &block)
189
- if @delegate.respond_to?(method)
190
- @delegate.send(method, *args, &block)
191
- else
192
- super
253
+ unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
254
+ raise ActiveRecord::IrreversibleMigration, "change_column_comment is only reversible if given a :from and :to option."
255
+ end
256
+
257
+ [:change_column_comment, [table, column, from: options[:to], to: options[:from]]]
258
+ end
259
+
260
+ def invert_change_table_comment(args)
261
+ table, options = *args
262
+
263
+ unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
264
+ raise ActiveRecord::IrreversibleMigration, "change_table_comment is only reversible if given a :from and :to option."
265
+ end
266
+
267
+ [:change_table_comment, [table, from: options[:to], to: options[:from]]]
268
+ end
269
+
270
+ def respond_to_missing?(method, _)
271
+ super || delegate.respond_to?(method)
272
+ end
273
+
274
+ # Forwards any missing method call to the \target.
275
+ def method_missing(method, *args, &block)
276
+ if delegate.respond_to?(method)
277
+ delegate.public_send(method, *args, &block)
278
+ else
279
+ super
280
+ end
193
281
  end
194
- end
195
282
  end
196
283
  end
197
284
  end
@@ -0,0 +1,244 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ module Compatibility # :nodoc: all
6
+ def self.find(version)
7
+ version = version.to_s
8
+ name = "V#{version.tr('.', '_')}"
9
+ unless const_defined?(name)
10
+ versions = constants.grep(/\AV[0-9_]+\z/).map { |s| s.to_s.delete("V").tr("_", ".").inspect }
11
+ raise ArgumentError, "Unknown migration version #{version.inspect}; expected one of #{versions.sort.join(', ')}"
12
+ end
13
+ const_get(name)
14
+ end
15
+
16
+ V6_0 = Current
17
+
18
+ class V5_2 < V6_0
19
+ module TableDefinition
20
+ def timestamps(**options)
21
+ options[:precision] ||= nil
22
+ super
23
+ end
24
+ end
25
+
26
+ module CommandRecorder
27
+ def invert_transaction(args, &block)
28
+ [:transaction, args, block]
29
+ end
30
+
31
+ def invert_change_column_comment(args)
32
+ table_name, column_name, comment = args
33
+ [:change_column_comment, [table_name, column_name, from: comment, to: comment]]
34
+ end
35
+
36
+ def invert_change_table_comment(args)
37
+ table_name, comment = args
38
+ [:change_table_comment, [table_name, from: comment, to: comment]]
39
+ end
40
+ end
41
+
42
+ def create_table(table_name, **options)
43
+ if block_given?
44
+ super { |t| yield compatible_table_definition(t) }
45
+ else
46
+ super
47
+ end
48
+ end
49
+
50
+ def change_table(table_name, **options)
51
+ if block_given?
52
+ super { |t| yield compatible_table_definition(t) }
53
+ else
54
+ super
55
+ end
56
+ end
57
+
58
+ def create_join_table(table_1, table_2, **options)
59
+ if block_given?
60
+ super { |t| yield compatible_table_definition(t) }
61
+ else
62
+ super
63
+ end
64
+ end
65
+
66
+ def add_timestamps(table_name, **options)
67
+ options[:precision] ||= nil
68
+ super
69
+ end
70
+
71
+ private
72
+ def compatible_table_definition(t)
73
+ class << t
74
+ prepend TableDefinition
75
+ end
76
+ t
77
+ end
78
+
79
+ def command_recorder
80
+ recorder = super
81
+ class << recorder
82
+ prepend CommandRecorder
83
+ end
84
+ recorder
85
+ end
86
+ end
87
+
88
+ class V5_1 < V5_2
89
+ def change_column(table_name, column_name, type, options = {})
90
+ if connection.adapter_name == "PostgreSQL"
91
+ super(table_name, column_name, type, options.except(:default, :null, :comment))
92
+ connection.change_column_default(table_name, column_name, options[:default]) if options.key?(:default)
93
+ connection.change_column_null(table_name, column_name, options[:null], options[:default]) if options.key?(:null)
94
+ connection.change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
95
+ else
96
+ super
97
+ end
98
+ end
99
+
100
+ def create_table(table_name, options = {})
101
+ if connection.adapter_name == "Mysql2"
102
+ super(table_name, options: "ENGINE=InnoDB", **options)
103
+ else
104
+ super
105
+ end
106
+ end
107
+ end
108
+
109
+ class V5_0 < V5_1
110
+ module TableDefinition
111
+ def primary_key(name, type = :primary_key, **options)
112
+ type = :integer if type == :primary_key
113
+ super
114
+ end
115
+
116
+ def references(*args, **options)
117
+ super(*args, type: :integer, **options)
118
+ end
119
+ alias :belongs_to :references
120
+ end
121
+
122
+ def create_table(table_name, options = {})
123
+ if connection.adapter_name == "PostgreSQL"
124
+ if options[:id] == :uuid && !options.key?(:default)
125
+ options[:default] = "uuid_generate_v4()"
126
+ end
127
+ end
128
+
129
+ unless connection.adapter_name == "Mysql2" && options[:id] == :bigint
130
+ if [:integer, :bigint].include?(options[:id]) && !options.key?(:default)
131
+ options[:default] = nil
132
+ end
133
+ end
134
+
135
+ # Since 5.1 PostgreSQL adapter uses bigserial type for primary
136
+ # keys by default and MySQL uses bigint. This compat layer makes old migrations utilize
137
+ # serial/int type instead -- the way it used to work before 5.1.
138
+ unless options.key?(:id)
139
+ options[:id] = :integer
140
+ end
141
+
142
+ super
143
+ end
144
+
145
+ def create_join_table(table_1, table_2, column_options: {}, **options)
146
+ column_options.reverse_merge!(type: :integer)
147
+ super
148
+ end
149
+
150
+ def add_column(table_name, column_name, type, options = {})
151
+ if type == :primary_key
152
+ type = :integer
153
+ options[:primary_key] = true
154
+ end
155
+ super
156
+ end
157
+
158
+ def add_reference(table_name, ref_name, **options)
159
+ super(table_name, ref_name, type: :integer, **options)
160
+ end
161
+ alias :add_belongs_to :add_reference
162
+
163
+ private
164
+ def compatible_table_definition(t)
165
+ class << t
166
+ prepend TableDefinition
167
+ end
168
+ super
169
+ end
170
+ end
171
+
172
+ class V4_2 < V5_0
173
+ module TableDefinition
174
+ def references(*, **options)
175
+ options[:index] ||= false
176
+ super
177
+ end
178
+ alias :belongs_to :references
179
+
180
+ def timestamps(**options)
181
+ options[:null] = true if options[:null].nil?
182
+ super
183
+ end
184
+ end
185
+
186
+ def add_reference(table_name, ref_name, **options)
187
+ options[:index] ||= false
188
+ super
189
+ end
190
+ alias :add_belongs_to :add_reference
191
+
192
+ def add_timestamps(table_name, **options)
193
+ options[:null] = true if options[:null].nil?
194
+ super
195
+ end
196
+
197
+ def index_exists?(table_name, column_name, options = {})
198
+ column_names = Array(column_name).map(&:to_s)
199
+ options[:name] =
200
+ if options[:name].present?
201
+ options[:name].to_s
202
+ else
203
+ connection.index_name(table_name, column: column_names)
204
+ end
205
+ super
206
+ end
207
+
208
+ def remove_index(table_name, options = {})
209
+ options = { column: options } unless options.is_a?(Hash)
210
+ options[:name] = index_name_for_remove(table_name, options)
211
+ super(table_name, options)
212
+ end
213
+
214
+ private
215
+ def compatible_table_definition(t)
216
+ class << t
217
+ prepend TableDefinition
218
+ end
219
+ super
220
+ end
221
+
222
+ def index_name_for_remove(table_name, options = {})
223
+ index_name = connection.index_name(table_name, options)
224
+
225
+ unless connection.index_name_exists?(table_name, index_name)
226
+ if options.is_a?(Hash) && options.has_key?(:name)
227
+ options_without_column = options.dup
228
+ options_without_column.delete :column
229
+ index_name_without_column = connection.index_name(table_name, options_without_column)
230
+
231
+ if connection.index_name_exists?(table_name, index_name_without_column)
232
+ return index_name_without_column
233
+ end
234
+ end
235
+
236
+ raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
237
+ end
238
+
239
+ index_name
240
+ end
241
+ end
242
+ end
243
+ end
244
+ end