activerecord 5.0.7.2 → 6.1.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 (363) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +829 -2015
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +11 -9
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record.rb +37 -29
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +30 -18
  10. data/lib/active_record/associations.rb +1714 -1596
  11. data/lib/active_record/associations/alias_tracker.rb +36 -42
  12. data/lib/active_record/associations/association.rb +143 -68
  13. data/lib/active_record/associations/association_scope.rb +98 -94
  14. data/lib/active_record/associations/belongs_to_association.rb +76 -46
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
  16. data/lib/active_record/associations/builder/association.rb +27 -28
  17. data/lib/active_record/associations/builder/belongs_to.rb +52 -60
  18. data/lib/active_record/associations/builder/collection_association.rb +12 -22
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +40 -62
  20. data/lib/active_record/associations/builder/has_many.rb +10 -2
  21. data/lib/active_record/associations/builder/has_one.rb +35 -2
  22. data/lib/active_record/associations/builder/singular_association.rb +5 -1
  23. data/lib/active_record/associations/collection_association.rb +104 -259
  24. data/lib/active_record/associations/collection_proxy.rb +169 -125
  25. data/lib/active_record/associations/foreign_association.rb +22 -0
  26. data/lib/active_record/associations/has_many_association.rb +46 -31
  27. data/lib/active_record/associations/has_many_through_association.rb +66 -46
  28. data/lib/active_record/associations/has_one_association.rb +71 -52
  29. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  30. data/lib/active_record/associations/join_dependency.rb +169 -180
  31. data/lib/active_record/associations/join_dependency/join_association.rb +53 -79
  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 +97 -104
  35. data/lib/active_record/associations/preloader/association.rb +109 -97
  36. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  37. data/lib/active_record/associations/singular_association.rb +12 -45
  38. data/lib/active_record/associations/through_association.rb +27 -15
  39. data/lib/active_record/attribute_assignment.rb +55 -60
  40. data/lib/active_record/attribute_methods.rb +111 -141
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +17 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +172 -112
  43. data/lib/active_record/attribute_methods/primary_key.rb +88 -91
  44. data/lib/active_record/attribute_methods/query.rb +6 -8
  45. data/lib/active_record/attribute_methods/read.rb +18 -50
  46. data/lib/active_record/attribute_methods/serialization.rb +38 -10
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +38 -66
  48. data/lib/active_record/attribute_methods/write.rb +25 -32
  49. data/lib/active_record/attributes.rb +69 -31
  50. data/lib/active_record/autosave_association.rb +102 -66
  51. data/lib/active_record/base.rb +16 -25
  52. data/lib/active_record/callbacks.rb +202 -43
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +11 -12
  55. data/lib/active_record/connection_adapters.rb +50 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +661 -375
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +14 -38
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +269 -105
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +54 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +137 -93
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +155 -113
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +328 -162
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +591 -259
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +229 -91
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +392 -244
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +457 -582
  69. data/lib/active_record/connection_adapters/column.rb +55 -13
  70. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  71. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +135 -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 +79 -49
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +66 -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 +20 -12
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +74 -37
  82. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  83. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  84. data/lib/active_record/connection_adapters/postgresql/column.rb +39 -28
  85. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -101
  86. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  87. data/lib/active_record/connection_adapters/postgresql/oid.rb +26 -21
  88. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  90. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -6
  93. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -4
  95. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  96. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  97. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
  98. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  104. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  106. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  107. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  108. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  109. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
  110. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  111. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  112. data/lib/active_record/connection_adapters/postgresql/quoting.rb +98 -38
  113. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +21 -27
  114. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
  115. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  116. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  117. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +426 -324
  118. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +32 -23
  119. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  120. data/lib/active_record/connection_adapters/postgresql_adapter.rb +418 -293
  121. data/lib/active_record/connection_adapters/schema_cache.rb +135 -18
  122. data/lib/active_record/connection_adapters/sql_type_metadata.rb +22 -7
  123. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
  124. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  125. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  126. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -6
  127. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  128. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  129. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +170 -0
  130. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +282 -290
  131. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  132. data/lib/active_record/connection_handling.rb +287 -45
  133. data/lib/active_record/core.rb +385 -181
  134. data/lib/active_record/counter_cache.rb +60 -28
  135. data/lib/active_record/database_configurations.rb +272 -0
  136. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  137. data/lib/active_record/database_configurations/database_config.rb +80 -0
  138. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  139. data/lib/active_record/database_configurations/url_config.rb +53 -0
  140. data/lib/active_record/delegated_type.rb +209 -0
  141. data/lib/active_record/destroy_association_async_job.rb +36 -0
  142. data/lib/active_record/dynamic_matchers.rb +87 -87
  143. data/lib/active_record/enum.rb +122 -47
  144. data/lib/active_record/errors.rb +153 -22
  145. data/lib/active_record/explain.rb +13 -8
  146. data/lib/active_record/explain_registry.rb +3 -1
  147. data/lib/active_record/explain_subscriber.rb +9 -4
  148. data/lib/active_record/fixture_set/file.rb +20 -22
  149. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  150. data/lib/active_record/fixture_set/render_context.rb +17 -0
  151. data/lib/active_record/fixture_set/table_row.rb +152 -0
  152. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  153. data/lib/active_record/fixtures.rb +246 -507
  154. data/lib/active_record/gem_version.rb +6 -4
  155. data/lib/active_record/inheritance.rb +168 -95
  156. data/lib/active_record/insert_all.rb +208 -0
  157. data/lib/active_record/integration.rb +114 -25
  158. data/lib/active_record/internal_metadata.rb +30 -24
  159. data/lib/active_record/legacy_yaml_adapter.rb +11 -5
  160. data/lib/active_record/locking/optimistic.rb +81 -85
  161. data/lib/active_record/locking/pessimistic.rb +22 -6
  162. data/lib/active_record/log_subscriber.rb +68 -31
  163. data/lib/active_record/middleware/database_selector.rb +77 -0
  164. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  165. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  166. data/lib/active_record/migration.rb +439 -342
  167. data/lib/active_record/migration/command_recorder.rb +152 -98
  168. data/lib/active_record/migration/compatibility.rb +229 -60
  169. data/lib/active_record/migration/join_table.rb +8 -7
  170. data/lib/active_record/model_schema.rb +230 -122
  171. data/lib/active_record/nested_attributes.rb +213 -203
  172. data/lib/active_record/no_touching.rb +11 -2
  173. data/lib/active_record/null_relation.rb +12 -34
  174. data/lib/active_record/persistence.rb +471 -97
  175. data/lib/active_record/query_cache.rb +23 -12
  176. data/lib/active_record/querying.rb +43 -25
  177. data/lib/active_record/railtie.rb +155 -43
  178. data/lib/active_record/railties/console_sandbox.rb +2 -0
  179. data/lib/active_record/railties/controller_runtime.rb +34 -33
  180. data/lib/active_record/railties/databases.rake +507 -195
  181. data/lib/active_record/readonly_attributes.rb +9 -4
  182. data/lib/active_record/reflection.rb +245 -269
  183. data/lib/active_record/relation.rb +475 -324
  184. data/lib/active_record/relation/batches.rb +125 -72
  185. data/lib/active_record/relation/batches/batch_enumerator.rb +28 -10
  186. data/lib/active_record/relation/calculations.rb +267 -171
  187. data/lib/active_record/relation/delegation.rb +73 -69
  188. data/lib/active_record/relation/finder_methods.rb +238 -248
  189. data/lib/active_record/relation/from_clause.rb +7 -9
  190. data/lib/active_record/relation/merger.rb +95 -77
  191. data/lib/active_record/relation/predicate_builder.rb +109 -110
  192. data/lib/active_record/relation/predicate_builder/array_handler.rb +22 -17
  193. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
  194. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  195. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +55 -0
  196. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  197. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  198. data/lib/active_record/relation/query_attribute.rb +33 -2
  199. data/lib/active_record/relation/query_methods.rb +654 -374
  200. data/lib/active_record/relation/record_fetch_warning.rb +8 -6
  201. data/lib/active_record/relation/spawn_methods.rb +15 -14
  202. data/lib/active_record/relation/where_clause.rb +171 -109
  203. data/lib/active_record/result.rb +88 -51
  204. data/lib/active_record/runtime_registry.rb +5 -3
  205. data/lib/active_record/sanitization.rb +73 -100
  206. data/lib/active_record/schema.rb +7 -14
  207. data/lib/active_record/schema_dumper.rb +101 -69
  208. data/lib/active_record/schema_migration.rb +16 -12
  209. data/lib/active_record/scoping.rb +20 -20
  210. data/lib/active_record/scoping/default.rb +92 -95
  211. data/lib/active_record/scoping/named.rb +39 -30
  212. data/lib/active_record/secure_token.rb +19 -9
  213. data/lib/active_record/serialization.rb +7 -3
  214. data/lib/active_record/signed_id.rb +116 -0
  215. data/lib/active_record/statement_cache.rb +80 -29
  216. data/lib/active_record/store.rb +122 -42
  217. data/lib/active_record/suppressor.rb +6 -3
  218. data/lib/active_record/table_metadata.rb +51 -39
  219. data/lib/active_record/tasks/database_tasks.rb +332 -115
  220. data/lib/active_record/tasks/mysql_database_tasks.rb +66 -104
  221. data/lib/active_record/tasks/postgresql_database_tasks.rb +84 -56
  222. data/lib/active_record/tasks/sqlite_database_tasks.rb +40 -19
  223. data/lib/active_record/test_databases.rb +24 -0
  224. data/lib/active_record/test_fixtures.rb +246 -0
  225. data/lib/active_record/timestamp.rb +70 -38
  226. data/lib/active_record/touch_later.rb +26 -24
  227. data/lib/active_record/transactions.rb +121 -184
  228. data/lib/active_record/translation.rb +3 -1
  229. data/lib/active_record/type.rb +29 -17
  230. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  231. data/lib/active_record/type/date.rb +2 -0
  232. data/lib/active_record/type/date_time.rb +2 -0
  233. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  234. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  235. data/lib/active_record/type/internal/timezone.rb +2 -0
  236. data/lib/active_record/type/json.rb +30 -0
  237. data/lib/active_record/type/serialized.rb +20 -9
  238. data/lib/active_record/type/text.rb +11 -0
  239. data/lib/active_record/type/time.rb +12 -1
  240. data/lib/active_record/type/type_map.rb +14 -17
  241. data/lib/active_record/type/unsigned_integer.rb +16 -0
  242. data/lib/active_record/type_caster.rb +4 -2
  243. data/lib/active_record/type_caster/connection.rb +17 -13
  244. data/lib/active_record/type_caster/map.rb +10 -6
  245. data/lib/active_record/validations.rb +8 -5
  246. data/lib/active_record/validations/absence.rb +2 -0
  247. data/lib/active_record/validations/associated.rb +4 -3
  248. data/lib/active_record/validations/length.rb +2 -0
  249. data/lib/active_record/validations/numericality.rb +35 -0
  250. data/lib/active_record/validations/presence.rb +4 -2
  251. data/lib/active_record/validations/uniqueness.rb +52 -45
  252. data/lib/active_record/version.rb +3 -1
  253. data/lib/arel.rb +54 -0
  254. data/lib/arel/alias_predication.rb +9 -0
  255. data/lib/arel/attributes/attribute.rb +41 -0
  256. data/lib/arel/collectors/bind.rb +29 -0
  257. data/lib/arel/collectors/composite.rb +39 -0
  258. data/lib/arel/collectors/plain_string.rb +20 -0
  259. data/lib/arel/collectors/sql_string.rb +27 -0
  260. data/lib/arel/collectors/substitute_binds.rb +35 -0
  261. data/lib/arel/crud.rb +42 -0
  262. data/lib/arel/delete_manager.rb +18 -0
  263. data/lib/arel/errors.rb +9 -0
  264. data/lib/arel/expressions.rb +29 -0
  265. data/lib/arel/factory_methods.rb +49 -0
  266. data/lib/arel/insert_manager.rb +49 -0
  267. data/lib/arel/math.rb +45 -0
  268. data/lib/arel/nodes.rb +70 -0
  269. data/lib/arel/nodes/and.rb +32 -0
  270. data/lib/arel/nodes/ascending.rb +23 -0
  271. data/lib/arel/nodes/binary.rb +126 -0
  272. data/lib/arel/nodes/bind_param.rb +44 -0
  273. data/lib/arel/nodes/case.rb +55 -0
  274. data/lib/arel/nodes/casted.rb +62 -0
  275. data/lib/arel/nodes/comment.rb +29 -0
  276. data/lib/arel/nodes/count.rb +12 -0
  277. data/lib/arel/nodes/delete_statement.rb +45 -0
  278. data/lib/arel/nodes/descending.rb +23 -0
  279. data/lib/arel/nodes/equality.rb +15 -0
  280. data/lib/arel/nodes/extract.rb +24 -0
  281. data/lib/arel/nodes/false.rb +16 -0
  282. data/lib/arel/nodes/full_outer_join.rb +8 -0
  283. data/lib/arel/nodes/function.rb +44 -0
  284. data/lib/arel/nodes/grouping.rb +11 -0
  285. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  286. data/lib/arel/nodes/in.rb +15 -0
  287. data/lib/arel/nodes/infix_operation.rb +92 -0
  288. data/lib/arel/nodes/inner_join.rb +8 -0
  289. data/lib/arel/nodes/insert_statement.rb +37 -0
  290. data/lib/arel/nodes/join_source.rb +20 -0
  291. data/lib/arel/nodes/matches.rb +18 -0
  292. data/lib/arel/nodes/named_function.rb +23 -0
  293. data/lib/arel/nodes/node.rb +51 -0
  294. data/lib/arel/nodes/node_expression.rb +13 -0
  295. data/lib/arel/nodes/ordering.rb +27 -0
  296. data/lib/arel/nodes/outer_join.rb +8 -0
  297. data/lib/arel/nodes/over.rb +15 -0
  298. data/lib/arel/nodes/regexp.rb +16 -0
  299. data/lib/arel/nodes/right_outer_join.rb +8 -0
  300. data/lib/arel/nodes/select_core.rb +67 -0
  301. data/lib/arel/nodes/select_statement.rb +41 -0
  302. data/lib/arel/nodes/sql_literal.rb +19 -0
  303. data/lib/arel/nodes/string_join.rb +11 -0
  304. data/lib/arel/nodes/table_alias.rb +31 -0
  305. data/lib/arel/nodes/terminal.rb +16 -0
  306. data/lib/arel/nodes/true.rb +16 -0
  307. data/lib/arel/nodes/unary.rb +44 -0
  308. data/lib/arel/nodes/unary_operation.rb +20 -0
  309. data/lib/arel/nodes/unqualified_column.rb +22 -0
  310. data/lib/arel/nodes/update_statement.rb +41 -0
  311. data/lib/arel/nodes/values_list.rb +9 -0
  312. data/lib/arel/nodes/window.rb +126 -0
  313. data/lib/arel/nodes/with.rb +11 -0
  314. data/lib/arel/order_predications.rb +13 -0
  315. data/lib/arel/predications.rb +250 -0
  316. data/lib/arel/select_manager.rb +270 -0
  317. data/lib/arel/table.rb +118 -0
  318. data/lib/arel/tree_manager.rb +72 -0
  319. data/lib/arel/update_manager.rb +34 -0
  320. data/lib/arel/visitors.rb +13 -0
  321. data/lib/arel/visitors/dot.rb +308 -0
  322. data/lib/arel/visitors/mysql.rb +93 -0
  323. data/lib/arel/visitors/postgresql.rb +120 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +899 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/rails/generators/active_record.rb +7 -5
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  330. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  331. data/lib/rails/generators/active_record/migration.rb +22 -3
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +38 -35
  333. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +3 -1
  334. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +7 -5
  335. data/lib/rails/generators/active_record/model/model_generator.rb +41 -25
  336. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  337. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  339. metadata +141 -57
  340. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  341. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  343. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  344. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  345. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  346. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  347. data/lib/active_record/attribute.rb +0 -213
  348. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  349. data/lib/active_record/attribute_decorators.rb +0 -67
  350. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  351. data/lib/active_record/attribute_set.rb +0 -110
  352. data/lib/active_record/attribute_set/builder.rb +0 -132
  353. data/lib/active_record/collection_cache_key.rb +0 -50
  354. data/lib/active_record/connection_adapters/connection_specification.rb +0 -263
  355. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -22
  356. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  359. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -17
  360. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  361. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  362. data/lib/active_record/relation/where_clause_factory.rb +0 -38
  363. data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,15 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  class Migration
3
5
  module JoinTable #:nodoc:
4
6
  private
7
+ def find_join_table_name(table_1, table_2, options = {})
8
+ options.delete(:table_name) || join_table_name(table_1, table_2)
9
+ end
5
10
 
6
- def find_join_table_name(table_1, table_2, options = {})
7
- options.delete(:table_name) || join_table_name(table_1, table_2)
8
- end
9
-
10
- def join_table_name(table_1, table_2)
11
- ModelSchema.derive_join_table_name(table_1, table_2).to_sym
12
- end
11
+ def join_table_name(table_1, table_2)
12
+ ModelSchema.derive_join_table_name(table_1, table_2).to_sym
13
+ end
13
14
  end
14
15
  end
15
16
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "monitor"
2
4
 
3
5
  module ActiveRecord
@@ -84,19 +86,6 @@ module ActiveRecord
84
86
  #
85
87
  # Sets the name of the internal metadata table.
86
88
 
87
- ##
88
- # :singleton-method: protected_environments
89
- # :call-seq: protected_environments
90
- #
91
- # The array of names of environments where destructive actions should be prohibited. By default,
92
- # the value is <tt>["production"]</tt>.
93
-
94
- ##
95
- # :singleton-method: protected_environments=
96
- # :call-seq: protected_environments=(environments)
97
- #
98
- # Sets an array of names of environments where destructive actions should be prohibited.
99
-
100
89
  ##
101
90
  # :singleton-method: pluralize_table_names
102
91
  # :call-seq: pluralize_table_names
@@ -113,31 +102,46 @@ module ActiveRecord
113
102
  # If true, the default table name for a Product class will be "products". If false, it would just be "product".
114
103
  # See table_name for the full rules on table/class naming. This is true, by default.
115
104
 
116
- included do
117
- mattr_accessor :primary_key_prefix_type, instance_writer: false
105
+ ##
106
+ # :singleton-method: implicit_order_column
107
+ # :call-seq: implicit_order_column
108
+ #
109
+ # The name of the column records are ordered by if no explicit order clause
110
+ # is used during an ordered finder call. If not set the primary key is used.
118
111
 
119
- class_attribute :table_name_prefix, instance_writer: false
120
- self.table_name_prefix = ""
112
+ ##
113
+ # :singleton-method: implicit_order_column=
114
+ # :call-seq: implicit_order_column=(column_name)
115
+ #
116
+ # Sets the column to sort records by when no explicit order clause is used
117
+ # during an ordered finder call. Useful when the primary key is not an
118
+ # auto-incrementing integer, for example when it's a UUID. Records are subsorted
119
+ # by the primary key if it exists to ensure deterministic results.
121
120
 
122
- class_attribute :table_name_suffix, instance_writer: false
123
- self.table_name_suffix = ""
121
+ ##
122
+ # :singleton-method: immutable_strings_by_default=
123
+ # :call-seq: immutable_strings_by_default=(bool)
124
+ #
125
+ # Determines whether columns should infer their type as `:string` or
126
+ # `:immutable_string`. This setting does not affect the behavior of
127
+ # `attribute :foo, :string`. Defaults to false.
124
128
 
125
- class_attribute :schema_migrations_table_name, instance_accessor: false
126
- self.schema_migrations_table_name = "schema_migrations"
129
+ included do
130
+ mattr_accessor :primary_key_prefix_type, instance_writer: false
127
131
 
128
- class_attribute :internal_metadata_table_name, instance_accessor: false
129
- self.internal_metadata_table_name = "ar_internal_metadata"
132
+ class_attribute :table_name_prefix, instance_writer: false, default: ""
133
+ class_attribute :table_name_suffix, instance_writer: false, default: ""
134
+ class_attribute :schema_migrations_table_name, instance_accessor: false, default: "schema_migrations"
135
+ class_attribute :internal_metadata_table_name, instance_accessor: false, default: "ar_internal_metadata"
136
+ class_attribute :pluralize_table_names, instance_writer: false, default: true
137
+ class_attribute :implicit_order_column, instance_accessor: false
138
+ class_attribute :immutable_strings_by_default, instance_accessor: false
130
139
 
131
- class_attribute :protected_environments, instance_accessor: false
132
140
  self.protected_environments = ["production"]
133
-
134
- class_attribute :pluralize_table_names, instance_writer: false
135
- self.pluralize_table_names = true
136
-
137
- self.inheritance_column = 'type'
141
+ self.inheritance_column = "type"
138
142
  self.ignored_columns = [].freeze
139
143
 
140
- delegate :type_for_attribute, to: :class
144
+ delegate :type_for_attribute, :column_for_attribute, to: :class
141
145
 
142
146
  initialize_load_schema_monitor
143
147
  end
@@ -240,11 +244,26 @@ module ActiveRecord
240
244
  end
241
245
 
242
246
  def full_table_name_prefix #:nodoc:
243
- (parents.detect{ |p| p.respond_to?(:table_name_prefix) } || self).table_name_prefix
247
+ (module_parents.detect { |p| p.respond_to?(:table_name_prefix) } || self).table_name_prefix
244
248
  end
245
249
 
246
250
  def full_table_name_suffix #:nodoc:
247
- (parents.detect {|p| p.respond_to?(:table_name_suffix) } || self).table_name_suffix
251
+ (module_parents.detect { |p| p.respond_to?(:table_name_suffix) } || self).table_name_suffix
252
+ end
253
+
254
+ # The array of names of environments where destructive actions should be prohibited. By default,
255
+ # the value is <tt>["production"]</tt>.
256
+ def protected_environments
257
+ if defined?(@protected_environments)
258
+ @protected_environments
259
+ else
260
+ superclass.protected_environments
261
+ end
262
+ end
263
+
264
+ # Sets an array of names of environments where destructive actions should be prohibited.
265
+ def protected_environments=(environments)
266
+ @protected_environments = environments.map(&:to_s)
248
267
  end
249
268
 
250
269
  # Defines the name of the table column which will store the class name on single-table
@@ -278,12 +297,42 @@ module ActiveRecord
278
297
 
279
298
  # Sets the columns names the model should ignore. Ignored columns won't have attribute
280
299
  # accessors defined, and won't be referenced in SQL queries.
300
+ #
301
+ # A common usage pattern for this method is to ensure all references to an attribute
302
+ # have been removed and deployed, before a migration to drop the column from the database
303
+ # has been deployed and run. Using this two step approach to dropping columns ensures there
304
+ # is no code that raises errors due to having a cached schema in memory at the time the
305
+ # schema migration is run.
306
+ #
307
+ # For example, given a model where you want to drop the "category" attribute, first mark it
308
+ # as ignored:
309
+ #
310
+ # class Project < ActiveRecord::Base
311
+ # # schema:
312
+ # # id :bigint
313
+ # # name :string, limit: 255
314
+ # # category :string, limit: 255
315
+ #
316
+ # self.ignored_columns = [:category]
317
+ # end
318
+ #
319
+ # The schema still contains `category`, but now the model omits it, so any meta-driven code or
320
+ # schema caching will not attempt to use the column:
321
+ #
322
+ # Project.columns_hash["category"] => nil
323
+ #
324
+ # You will get an error if accessing that attribute directly, so ensure all usages of the
325
+ # column are removed (automated tests can help you find any usages).
326
+ #
327
+ # user = Project.create!(name: "First Project")
328
+ # user.category # => raises NoMethodError
281
329
  def ignored_columns=(columns)
282
- @ignored_columns = columns.map(&:to_s)
330
+ reload_schema_from_cache
331
+ @ignored_columns = columns.map(&:to_s).freeze
283
332
  end
284
333
 
285
334
  def sequence_name
286
- if base_class == self
335
+ if base_class?
287
336
  @sequence_name ||= reset_sequence_name
288
337
  else
289
338
  (@sequence_name ||= nil) || base_class.sequence_name
@@ -296,7 +345,7 @@ module ActiveRecord
296
345
  end
297
346
 
298
347
  # Sets the name of the sequence to use when generating ids to the given
299
- # value, or (if the value is nil or false) to the value returned by the
348
+ # value, or (if the value is +nil+ or +false+) to the value returned by the
300
349
  # given block. This is required for Oracle and is useful for any
301
350
  # database which relies on sequences for primary key generation.
302
351
  #
@@ -334,7 +383,7 @@ module ActiveRecord
334
383
  def attributes_builder # :nodoc:
335
384
  unless defined?(@attributes_builder) && @attributes_builder
336
385
  defaults = _default_attributes.except(*(column_names - [primary_key]))
337
- @attributes_builder = AttributeSet::Builder.new(attribute_types, defaults)
386
+ @attributes_builder = ActiveModel::AttributeSet::Builder.new(attribute_types, defaults)
338
387
  end
339
388
  @attributes_builder
340
389
  end
@@ -346,12 +395,16 @@ module ActiveRecord
346
395
 
347
396
  def columns
348
397
  load_schema
349
- @columns ||= columns_hash.values
398
+ @columns ||= columns_hash.values.freeze
350
399
  end
351
400
 
352
401
  def attribute_types # :nodoc:
353
402
  load_schema
354
- @attribute_types ||= Hash.new(Type::Value.new)
403
+ @attribute_types ||= Hash.new(Type.default_value)
404
+ end
405
+
406
+ def yaml_encoder # :nodoc:
407
+ @yaml_encoder ||= ActiveModel::AttributeSet::YAMLEncoder.new(attribute_types)
355
408
  end
356
409
 
357
410
  # Returns the type of the attribute with the given name, after applying
@@ -364,8 +417,11 @@ module ActiveRecord
364
417
  # it).
365
418
  #
366
419
  # +attr_name+ The name of the attribute to retrieve the type for. Must be
367
- # a string
420
+ # a string or a symbol.
368
421
  def type_for_attribute(attr_name, &block)
422
+ attr_name = attr_name.to_s
423
+ attr_name = attribute_aliases[attr_name] || attr_name
424
+
369
425
  if block
370
426
  attribute_types.fetch(attr_name, &block)
371
427
  else
@@ -373,26 +429,56 @@ module ActiveRecord
373
429
  end
374
430
  end
375
431
 
432
+ # Returns the column object for the named attribute.
433
+ # Returns an +ActiveRecord::ConnectionAdapters::NullColumn+ if the
434
+ # named attribute does not exist.
435
+ #
436
+ # class Person < ActiveRecord::Base
437
+ # end
438
+ #
439
+ # person = Person.new
440
+ # person.column_for_attribute(:name) # the result depends on the ConnectionAdapter
441
+ # # => #<ActiveRecord::ConnectionAdapters::Column:0x007ff4ab083980 @name="name", @sql_type="varchar(255)", @null=true, ...>
442
+ #
443
+ # person.column_for_attribute(:nothing)
444
+ # # => #<ActiveRecord::ConnectionAdapters::NullColumn:0xXXX @name=nil, @sql_type=nil, @cast_type=#<Type::Value>, ...>
445
+ def column_for_attribute(name)
446
+ name = name.to_s
447
+ columns_hash.fetch(name) do
448
+ ConnectionAdapters::NullColumn.new(name)
449
+ end
450
+ end
451
+
376
452
  # Returns a hash where the keys are column names and the values are
377
453
  # default values when instantiating the Active Record object for this table.
378
454
  def column_defaults
379
455
  load_schema
380
- _default_attributes.to_hash
456
+ @column_defaults ||= _default_attributes.deep_dup.to_hash.freeze
381
457
  end
382
458
 
383
459
  def _default_attributes # :nodoc:
384
- @default_attributes ||= AttributeSet.new({})
460
+ load_schema
461
+ @default_attributes ||= ActiveModel::AttributeSet.new({})
385
462
  end
386
463
 
387
464
  # Returns an array of column names as strings.
388
465
  def column_names
389
- @column_names ||= columns.map(&:name)
466
+ @column_names ||= columns.map(&:name).freeze
467
+ end
468
+
469
+ def symbol_column_to_string(name_symbol) # :nodoc:
470
+ @symbol_column_to_string_name_hash ||= column_names.index_by(&:to_sym)
471
+ @symbol_column_to_string_name_hash[name_symbol]
390
472
  end
391
473
 
392
474
  # Returns an array of column objects where the primary id, all columns ending in "_id" or "_count",
393
475
  # and columns used for single table inheritance have been removed.
394
476
  def content_columns
395
- @content_columns ||= columns.reject { |c| c.name == primary_key || c.name =~ /(_id|_count)$/ || c.name == inheritance_column }
477
+ @content_columns ||= columns.reject do |c|
478
+ c.name == primary_key ||
479
+ c.name == inheritance_column ||
480
+ c.name.end_with?("_id", "_count")
481
+ end.freeze
396
482
  end
397
483
 
398
484
  # Resets all the cached information about columns, which will cause them
@@ -402,7 +488,7 @@ module ActiveRecord
402
488
  # when just after creating a table you want to populate it with some default
403
489
  # values, eg:
404
490
  #
405
- # class CreateJobLevels < ActiveRecord::Migration[5.0]
491
+ # class CreateJobLevels < ActiveRecord::Migration[6.0]
406
492
  # def up
407
493
  # create_table :job_levels do |t|
408
494
  # t.integer :id
@@ -423,7 +509,7 @@ module ActiveRecord
423
509
  # end
424
510
  def reset_column_information
425
511
  connection.clear_cache!
426
- undefine_attribute_methods
512
+ ([self] + descendants).each(&:undefine_attribute_methods)
427
513
  connection.schema_cache.clear_data_source_cache!(table_name)
428
514
 
429
515
  reload_schema_from_cache
@@ -431,109 +517,131 @@ module ActiveRecord
431
517
  end
432
518
 
433
519
  protected
434
-
435
- def initialize_load_schema_monitor
436
- @load_schema_monitor = Monitor.new
437
- end
520
+ def initialize_load_schema_monitor
521
+ @load_schema_monitor = Monitor.new
522
+ end
438
523
 
439
524
  private
525
+ def inherited(child_class)
526
+ super
527
+ child_class.initialize_load_schema_monitor
528
+ end
440
529
 
441
- def inherited(child_class)
442
- super
443
- child_class.initialize_load_schema_monitor
444
- end
445
-
446
- def schema_loaded?
447
- defined?(@schema_loaded) && @schema_loaded
448
- end
530
+ def schema_loaded?
531
+ defined?(@schema_loaded) && @schema_loaded
532
+ end
449
533
 
450
- def load_schema
451
- return if schema_loaded?
452
- @load_schema_monitor.synchronize do
453
- return if defined?(@columns_hash) && @columns_hash
534
+ def load_schema
535
+ return if schema_loaded?
536
+ @load_schema_monitor.synchronize do
537
+ return if defined?(@columns_hash) && @columns_hash
454
538
 
455
- load_schema!
539
+ load_schema!
456
540
 
457
- @schema_loaded = true
541
+ @schema_loaded = true
542
+ rescue
543
+ reload_schema_from_cache # If the schema loading failed half way through, we must reset the state.
544
+ raise
545
+ end
458
546
  end
459
- end
460
547
 
461
- def load_schema!
462
- @columns_hash = connection.schema_cache.columns_hash(table_name).except(*ignored_columns)
463
- @columns_hash.each do |name, column|
464
- warn_if_deprecated_type(column)
465
- define_attribute(
466
- name,
467
- connection.lookup_cast_type_from_column(column),
468
- default: column.default,
469
- user_provided_default: false
470
- )
548
+ def load_schema!
549
+ unless table_name
550
+ raise ActiveRecord::TableNotSpecified, "#{self} has no table configured. Set one with #{self}.table_name="
551
+ end
552
+
553
+ columns_hash = connection.schema_cache.columns_hash(table_name)
554
+ columns_hash = columns_hash.except(*ignored_columns) unless ignored_columns.empty?
555
+ @columns_hash = columns_hash.freeze
556
+ @columns_hash.each do |name, column|
557
+ type = connection.lookup_cast_type_from_column(column)
558
+ type = _convert_type_from_options(type)
559
+ warn_if_deprecated_type(column)
560
+ define_attribute(
561
+ name,
562
+ type,
563
+ default: column.default,
564
+ user_provided_default: false
565
+ )
566
+ end
471
567
  end
472
- end
473
568
 
474
- def reload_schema_from_cache
475
- @arel_engine = nil
476
- @arel_table = nil
477
- @column_names = nil
478
- @attribute_types = nil
479
- @content_columns = nil
480
- @default_attributes = nil
481
- @inheritance_column = nil unless defined?(@explicit_inheritance_column) && @explicit_inheritance_column
482
- @attributes_builder = nil
483
- @columns = nil
484
- @columns_hash = nil
485
- @schema_loaded = false
486
- @attribute_names = nil
487
- direct_descendants.each do |descendant|
488
- descendant.send(:reload_schema_from_cache)
569
+ def reload_schema_from_cache
570
+ @arel_table = nil
571
+ @column_names = nil
572
+ @symbol_column_to_string_name_hash = nil
573
+ @attribute_types = nil
574
+ @content_columns = nil
575
+ @default_attributes = nil
576
+ @column_defaults = nil
577
+ @inheritance_column = nil unless defined?(@explicit_inheritance_column) && @explicit_inheritance_column
578
+ @attributes_builder = nil
579
+ @columns = nil
580
+ @columns_hash = nil
581
+ @schema_loaded = false
582
+ @attribute_names = nil
583
+ @yaml_encoder = nil
584
+ direct_descendants.each do |descendant|
585
+ descendant.send(:reload_schema_from_cache)
586
+ end
489
587
  end
490
- end
491
588
 
492
- # Guesses the table name, but does not decorate it with prefix and suffix information.
493
- def undecorated_table_name(class_name = base_class.name)
494
- table_name = class_name.to_s.demodulize.underscore
495
- pluralize_table_names ? table_name.pluralize : table_name
496
- end
589
+ # Guesses the table name, but does not decorate it with prefix and suffix information.
590
+ def undecorated_table_name(class_name = base_class.name)
591
+ table_name = class_name.to_s.demodulize.underscore
592
+ pluralize_table_names ? table_name.pluralize : table_name
593
+ end
497
594
 
498
- # Computes and returns a table name according to default conventions.
499
- def compute_table_name
500
- base = base_class
501
- if self == base
502
- # Nested classes are prefixed with singular parent table name.
503
- if parent < Base && !parent.abstract_class?
504
- contained = parent.table_name
505
- contained = contained.singularize if parent.pluralize_table_names
506
- contained += '_'
595
+ # Computes and returns a table name according to default conventions.
596
+ def compute_table_name
597
+ if base_class?
598
+ # Nested classes are prefixed with singular parent table name.
599
+ if module_parent < Base && !module_parent.abstract_class?
600
+ contained = module_parent.table_name
601
+ contained = contained.singularize if module_parent.pluralize_table_names
602
+ contained += "_"
603
+ end
604
+
605
+ "#{full_table_name_prefix}#{contained}#{undecorated_table_name(name)}#{full_table_name_suffix}"
606
+ else
607
+ # STI subclasses always use their superclass' table.
608
+ base_class.table_name
507
609
  end
610
+ end
508
611
 
509
- "#{full_table_name_prefix}#{contained}#{undecorated_table_name(name)}#{full_table_name_suffix}"
510
- else
511
- # STI subclasses always use their superclass' table.
512
- base.table_name
612
+ def _convert_type_from_options(type)
613
+ if immutable_strings_by_default && type.respond_to?(:to_immutable_string)
614
+ type.to_immutable_string
615
+ else
616
+ type
617
+ end
513
618
  end
514
- end
515
619
 
516
- def warn_if_deprecated_type(column)
517
- return if attributes_to_define_after_schema_loads.key?(column.name)
518
- if column.respond_to?(:oid) && column.sql_type.start_with?("point")
620
+ def warn_if_deprecated_type(column)
621
+ return if attributes_to_define_after_schema_loads.key?(column.name)
622
+ return unless column.respond_to?(:oid)
623
+
519
624
  if column.array?
520
625
  array_arguments = ", array: true"
521
626
  else
522
627
  array_arguments = ""
523
628
  end
524
- ActiveSupport::Deprecation.warn(<<-WARNING.strip_heredoc)
525
- The behavior of the `:point` type will be changing in Rails 5.1 to
526
- return a `Point` object, rather than an `Array`. If you'd like to
527
- keep the old behavior, you can add this line to #{self.name}:
528
629
 
529
- attribute :#{column.name}, :legacy_point#{array_arguments}
630
+ if column.sql_type.start_with?("interval")
631
+ precision_arguments = column.precision.presence && ", precision: #{column.precision}"
632
+ ActiveSupport::Deprecation.warn(<<~WARNING)
633
+ The behavior of the `:interval` type will be changing in Rails 6.2
634
+ to return an `ActiveSupport::Duration` object. If you'd like to keep
635
+ the old behavior, you can add this line to #{self.name} model:
636
+
637
+ attribute :#{column.name}, :string#{precision_arguments}#{array_arguments}
530
638
 
531
- If you'd like the new behavior today, you can add this line:
639
+ If you'd like the new behavior today, you can add this line:
532
640
 
533
- attribute :#{column.name}, :point#{array_arguments}
534
- WARNING
641
+ attribute :#{column.name}, :interval#{precision_arguments}#{array_arguments}
642
+ WARNING
643
+ end
535
644
  end
536
- end
537
645
  end
538
646
  end
539
647
  end