activerecord 5.0.6 → 6.0.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 (358) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +638 -2023
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +8 -6
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record/aggregations.rb +249 -246
  8. data/lib/active_record/association_relation.rb +24 -13
  9. data/lib/active_record/associations/alias_tracker.rb +24 -33
  10. data/lib/active_record/associations/association.rb +119 -56
  11. data/lib/active_record/associations/association_scope.rb +94 -94
  12. data/lib/active_record/associations/belongs_to_association.rb +58 -42
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  14. data/lib/active_record/associations/builder/association.rb +18 -25
  15. data/lib/active_record/associations/builder/belongs_to.rb +43 -54
  16. data/lib/active_record/associations/builder/collection_association.rb +7 -18
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +42 -61
  18. data/lib/active_record/associations/builder/has_many.rb +4 -0
  19. data/lib/active_record/associations/builder/has_one.rb +37 -1
  20. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  21. data/lib/active_record/associations/collection_association.rb +80 -252
  22. data/lib/active_record/associations/collection_proxy.rb +158 -121
  23. data/lib/active_record/associations/foreign_association.rb +9 -0
  24. data/lib/active_record/associations/has_many_association.rb +23 -29
  25. data/lib/active_record/associations/has_many_through_association.rb +58 -44
  26. data/lib/active_record/associations/has_one_association.rb +59 -54
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +38 -90
  29. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  30. data/lib/active_record/associations/join_dependency/join_part.rb +12 -12
  31. data/lib/active_record/associations/join_dependency.rb +134 -176
  32. data/lib/active_record/associations/preloader/association.rb +84 -125
  33. data/lib/active_record/associations/preloader/through_association.rb +82 -75
  34. data/lib/active_record/associations/preloader.rb +90 -102
  35. data/lib/active_record/associations/singular_association.rb +12 -45
  36. data/lib/active_record/associations/through_association.rb +26 -14
  37. data/lib/active_record/associations.rb +1603 -1592
  38. data/lib/active_record/attribute_assignment.rb +54 -60
  39. data/lib/active_record/attribute_decorators.rb +38 -15
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -7
  41. data/lib/active_record/attribute_methods/dirty.rb +179 -109
  42. data/lib/active_record/attribute_methods/primary_key.rb +86 -91
  43. data/lib/active_record/attribute_methods/query.rb +4 -3
  44. data/lib/active_record/attribute_methods/read.rb +21 -49
  45. data/lib/active_record/attribute_methods/serialization.rb +30 -7
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -64
  47. data/lib/active_record/attribute_methods/write.rb +35 -33
  48. data/lib/active_record/attribute_methods.rb +66 -106
  49. data/lib/active_record/attributes.rb +38 -24
  50. data/lib/active_record/autosave_association.rb +53 -32
  51. data/lib/active_record/base.rb +27 -24
  52. data/lib/active_record/callbacks.rb +63 -33
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +11 -11
  55. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +553 -321
  56. data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
  57. data/lib/active_record/connection_adapters/abstract/database_statements.rb +213 -94
  58. data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -28
  59. data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -75
  60. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  61. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -27
  62. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +207 -126
  63. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  64. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +369 -199
  65. data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -78
  66. data/lib/active_record/connection_adapters/abstract_adapter.rb +363 -202
  67. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +405 -551
  68. data/lib/active_record/connection_adapters/column.rb +41 -13
  69. data/lib/active_record/connection_adapters/connection_specification.rb +172 -138
  70. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
  71. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +143 -49
  73. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -22
  74. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  75. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +50 -45
  76. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
  77. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  78. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  79. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
  80. data/lib/active_record/connection_adapters/mysql2_adapter.rb +49 -30
  81. data/lib/active_record/connection_adapters/postgresql/column.rb +22 -7
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +60 -54
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -10
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  89. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +4 -2
  91. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -3
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -17
  94. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  96. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  98. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +31 -9
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +34 -30
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  102. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  103. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -4
  104. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
  107. data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
  108. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
  109. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  111. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +35 -32
  112. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +380 -300
  113. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
  114. data/lib/active_record/connection_adapters/postgresql/utils.rb +10 -6
  115. data/lib/active_record/connection_adapters/postgresql_adapter.rb +382 -275
  116. data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
  117. data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
  118. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +74 -19
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +254 -262
  126. data/lib/active_record/connection_adapters/statement_pool.rb +9 -7
  127. data/lib/active_record/connection_handling.rb +159 -40
  128. data/lib/active_record/core.rb +202 -162
  129. data/lib/active_record/counter_cache.rb +57 -28
  130. data/lib/active_record/database_configurations/database_config.rb +37 -0
  131. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  132. data/lib/active_record/database_configurations/url_config.rb +79 -0
  133. data/lib/active_record/database_configurations.rb +233 -0
  134. data/lib/active_record/define_callbacks.rb +22 -0
  135. data/lib/active_record/dynamic_matchers.rb +87 -86
  136. data/lib/active_record/enum.rb +60 -23
  137. data/lib/active_record/errors.rb +114 -18
  138. data/lib/active_record/explain.rb +4 -3
  139. data/lib/active_record/explain_registry.rb +3 -1
  140. data/lib/active_record/explain_subscriber.rb +9 -4
  141. data/lib/active_record/fixture_set/file.rb +13 -8
  142. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  143. data/lib/active_record/fixture_set/render_context.rb +17 -0
  144. data/lib/active_record/fixture_set/table_row.rb +153 -0
  145. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  146. data/lib/active_record/fixtures.rb +195 -502
  147. data/lib/active_record/gem_version.rb +4 -2
  148. data/lib/active_record/inheritance.rb +151 -97
  149. data/lib/active_record/insert_all.rb +179 -0
  150. data/lib/active_record/integration.rb +116 -25
  151. data/lib/active_record/internal_metadata.rb +15 -18
  152. data/lib/active_record/legacy_yaml_adapter.rb +4 -2
  153. data/lib/active_record/locking/optimistic.rb +78 -87
  154. data/lib/active_record/locking/pessimistic.rb +18 -6
  155. data/lib/active_record/log_subscriber.rb +48 -29
  156. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  157. data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
  158. data/lib/active_record/middleware/database_selector.rb +75 -0
  159. data/lib/active_record/migration/command_recorder.rb +143 -97
  160. data/lib/active_record/migration/compatibility.rb +174 -56
  161. data/lib/active_record/migration/join_table.rb +8 -6
  162. data/lib/active_record/migration.rb +367 -300
  163. data/lib/active_record/model_schema.rb +145 -139
  164. data/lib/active_record/nested_attributes.rb +214 -201
  165. data/lib/active_record/no_touching.rb +10 -1
  166. data/lib/active_record/null_relation.rb +13 -34
  167. data/lib/active_record/persistence.rb +442 -72
  168. data/lib/active_record/query_cache.rb +15 -14
  169. data/lib/active_record/querying.rb +36 -23
  170. data/lib/active_record/railtie.rb +128 -36
  171. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  172. data/lib/active_record/railties/console_sandbox.rb +2 -0
  173. data/lib/active_record/railties/controller_runtime.rb +34 -33
  174. data/lib/active_record/railties/databases.rake +309 -177
  175. data/lib/active_record/readonly_attributes.rb +5 -4
  176. data/lib/active_record/reflection.rb +211 -249
  177. data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
  178. data/lib/active_record/relation/batches.rb +99 -52
  179. data/lib/active_record/relation/calculations.rb +211 -172
  180. data/lib/active_record/relation/delegation.rb +67 -65
  181. data/lib/active_record/relation/finder_methods.rb +208 -247
  182. data/lib/active_record/relation/from_clause.rb +2 -8
  183. data/lib/active_record/relation/merger.rb +78 -61
  184. data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
  185. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  186. data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
  187. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  188. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  189. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  190. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  191. data/lib/active_record/relation/predicate_builder.rb +86 -104
  192. data/lib/active_record/relation/query_attribute.rb +33 -2
  193. data/lib/active_record/relation/query_methods.rb +458 -329
  194. data/lib/active_record/relation/record_fetch_warning.rb +5 -3
  195. data/lib/active_record/relation/spawn_methods.rb +8 -7
  196. data/lib/active_record/relation/where_clause.rb +111 -95
  197. data/lib/active_record/relation/where_clause_factory.rb +6 -11
  198. data/lib/active_record/relation.rb +429 -318
  199. data/lib/active_record/result.rb +69 -39
  200. data/lib/active_record/runtime_registry.rb +5 -3
  201. data/lib/active_record/sanitization.rb +83 -99
  202. data/lib/active_record/schema.rb +7 -14
  203. data/lib/active_record/schema_dumper.rb +71 -69
  204. data/lib/active_record/schema_migration.rb +15 -5
  205. data/lib/active_record/scoping/default.rb +93 -95
  206. data/lib/active_record/scoping/named.rb +45 -25
  207. data/lib/active_record/scoping.rb +20 -19
  208. data/lib/active_record/secure_token.rb +4 -2
  209. data/lib/active_record/serialization.rb +2 -0
  210. data/lib/active_record/statement_cache.rb +63 -28
  211. data/lib/active_record/store.rb +121 -41
  212. data/lib/active_record/suppressor.rb +4 -1
  213. data/lib/active_record/table_metadata.rb +26 -20
  214. data/lib/active_record/tasks/database_tasks.rb +276 -85
  215. data/lib/active_record/tasks/mysql_database_tasks.rb +54 -90
  216. data/lib/active_record/tasks/postgresql_database_tasks.rb +78 -47
  217. data/lib/active_record/tasks/sqlite_database_tasks.rb +34 -16
  218. data/lib/active_record/test_databases.rb +23 -0
  219. data/lib/active_record/test_fixtures.rb +224 -0
  220. data/lib/active_record/timestamp.rb +70 -35
  221. data/lib/active_record/touch_later.rb +7 -4
  222. data/lib/active_record/transactions.rb +133 -149
  223. data/lib/active_record/translation.rb +3 -1
  224. data/lib/active_record/type/adapter_specific_registry.rb +44 -45
  225. data/lib/active_record/type/date.rb +2 -0
  226. data/lib/active_record/type/date_time.rb +2 -0
  227. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  228. data/lib/active_record/type/hash_lookup_type_map.rb +5 -3
  229. data/lib/active_record/type/internal/timezone.rb +2 -0
  230. data/lib/active_record/type/json.rb +30 -0
  231. data/lib/active_record/type/serialized.rb +16 -8
  232. data/lib/active_record/type/text.rb +11 -0
  233. data/lib/active_record/type/time.rb +2 -1
  234. data/lib/active_record/type/type_map.rb +13 -15
  235. data/lib/active_record/type/unsigned_integer.rb +17 -0
  236. data/lib/active_record/type.rb +23 -17
  237. data/lib/active_record/type_caster/connection.rb +17 -12
  238. data/lib/active_record/type_caster/map.rb +5 -4
  239. data/lib/active_record/type_caster.rb +4 -2
  240. data/lib/active_record/validations/absence.rb +2 -0
  241. data/lib/active_record/validations/associated.rb +3 -1
  242. data/lib/active_record/validations/length.rb +2 -0
  243. data/lib/active_record/validations/presence.rb +4 -2
  244. data/lib/active_record/validations/uniqueness.rb +29 -42
  245. data/lib/active_record/validations.rb +7 -4
  246. data/lib/active_record/version.rb +3 -1
  247. data/lib/active_record.rb +36 -22
  248. data/lib/arel/alias_predication.rb +9 -0
  249. data/lib/arel/attributes/attribute.rb +37 -0
  250. data/lib/arel/attributes.rb +22 -0
  251. data/lib/arel/collectors/bind.rb +24 -0
  252. data/lib/arel/collectors/composite.rb +31 -0
  253. data/lib/arel/collectors/plain_string.rb +20 -0
  254. data/lib/arel/collectors/sql_string.rb +20 -0
  255. data/lib/arel/collectors/substitute_binds.rb +28 -0
  256. data/lib/arel/crud.rb +42 -0
  257. data/lib/arel/delete_manager.rb +18 -0
  258. data/lib/arel/errors.rb +9 -0
  259. data/lib/arel/expressions.rb +29 -0
  260. data/lib/arel/factory_methods.rb +49 -0
  261. data/lib/arel/insert_manager.rb +49 -0
  262. data/lib/arel/math.rb +45 -0
  263. data/lib/arel/nodes/and.rb +32 -0
  264. data/lib/arel/nodes/ascending.rb +23 -0
  265. data/lib/arel/nodes/binary.rb +52 -0
  266. data/lib/arel/nodes/bind_param.rb +36 -0
  267. data/lib/arel/nodes/case.rb +55 -0
  268. data/lib/arel/nodes/casted.rb +50 -0
  269. data/lib/arel/nodes/comment.rb +29 -0
  270. data/lib/arel/nodes/count.rb +12 -0
  271. data/lib/arel/nodes/delete_statement.rb +45 -0
  272. data/lib/arel/nodes/descending.rb +23 -0
  273. data/lib/arel/nodes/equality.rb +18 -0
  274. data/lib/arel/nodes/extract.rb +24 -0
  275. data/lib/arel/nodes/false.rb +16 -0
  276. data/lib/arel/nodes/full_outer_join.rb +8 -0
  277. data/lib/arel/nodes/function.rb +44 -0
  278. data/lib/arel/nodes/grouping.rb +8 -0
  279. data/lib/arel/nodes/in.rb +8 -0
  280. data/lib/arel/nodes/infix_operation.rb +80 -0
  281. data/lib/arel/nodes/inner_join.rb +8 -0
  282. data/lib/arel/nodes/insert_statement.rb +37 -0
  283. data/lib/arel/nodes/join_source.rb +20 -0
  284. data/lib/arel/nodes/matches.rb +18 -0
  285. data/lib/arel/nodes/named_function.rb +23 -0
  286. data/lib/arel/nodes/node.rb +50 -0
  287. data/lib/arel/nodes/node_expression.rb +13 -0
  288. data/lib/arel/nodes/outer_join.rb +8 -0
  289. data/lib/arel/nodes/over.rb +15 -0
  290. data/lib/arel/nodes/regexp.rb +16 -0
  291. data/lib/arel/nodes/right_outer_join.rb +8 -0
  292. data/lib/arel/nodes/select_core.rb +67 -0
  293. data/lib/arel/nodes/select_statement.rb +41 -0
  294. data/lib/arel/nodes/sql_literal.rb +16 -0
  295. data/lib/arel/nodes/string_join.rb +11 -0
  296. data/lib/arel/nodes/table_alias.rb +27 -0
  297. data/lib/arel/nodes/terminal.rb +16 -0
  298. data/lib/arel/nodes/true.rb +16 -0
  299. data/lib/arel/nodes/unary.rb +45 -0
  300. data/lib/arel/nodes/unary_operation.rb +20 -0
  301. data/lib/arel/nodes/unqualified_column.rb +22 -0
  302. data/lib/arel/nodes/update_statement.rb +41 -0
  303. data/lib/arel/nodes/values_list.rb +9 -0
  304. data/lib/arel/nodes/window.rb +126 -0
  305. data/lib/arel/nodes/with.rb +11 -0
  306. data/lib/arel/nodes.rb +68 -0
  307. data/lib/arel/order_predications.rb +13 -0
  308. data/lib/arel/predications.rb +257 -0
  309. data/lib/arel/select_manager.rb +271 -0
  310. data/lib/arel/table.rb +110 -0
  311. data/lib/arel/tree_manager.rb +72 -0
  312. data/lib/arel/update_manager.rb +34 -0
  313. data/lib/arel/visitors/depth_first.rb +204 -0
  314. data/lib/arel/visitors/dot.rb +297 -0
  315. data/lib/arel/visitors/ibm_db.rb +34 -0
  316. data/lib/arel/visitors/informix.rb +62 -0
  317. data/lib/arel/visitors/mssql.rb +157 -0
  318. data/lib/arel/visitors/mysql.rb +83 -0
  319. data/lib/arel/visitors/oracle.rb +159 -0
  320. data/lib/arel/visitors/oracle12.rb +66 -0
  321. data/lib/arel/visitors/postgresql.rb +110 -0
  322. data/lib/arel/visitors/sqlite.rb +39 -0
  323. data/lib/arel/visitors/to_sql.rb +889 -0
  324. data/lib/arel/visitors/visitor.rb +46 -0
  325. data/lib/arel/visitors/where_sql.rb +23 -0
  326. data/lib/arel/visitors.rb +20 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/arel.rb +58 -0
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -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/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 -2
  335. data/lib/rails/generators/active_record/model/model_generator.rb +9 -29
  336. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  337. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  338. data/lib/rails/generators/active_record.rb +7 -5
  339. metadata +133 -50
  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/user_provided_default.rb +0 -28
  348. data/lib/active_record/attribute.rb +0 -213
  349. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  350. data/lib/active_record/attribute_set/builder.rb +0 -130
  351. data/lib/active_record/attribute_set.rb +0 -110
  352. data/lib/active_record/collection_cache_key.rb +0 -50
  353. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  354. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  355. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  356. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  357. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  358. data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -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
@@ -114,45 +103,34 @@ module ActiveRecord
114
103
  # See table_name for the full rules on table/class naming. This is true, by default.
115
104
 
116
105
  ##
117
- # :singleton-method: ignored_columns
118
- # :call-seq: ignored_columns
106
+ # :singleton-method: implicit_order_column
107
+ # :call-seq: implicit_order_column
119
108
  #
120
- # The list of columns names the model should ignore. Ignored columns won't have attribute
121
- # accessors defined, and won't be referenced in SQL queries.
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.
122
111
 
123
112
  ##
124
- # :singleton-method: ignored_columns=
125
- # :call-seq: ignored_columns=(columns)
113
+ # :singleton-method: implicit_order_column=
114
+ # :call-seq: implicit_order_column=(column_name)
126
115
  #
127
- # Sets the columns names the model should ignore. Ignored columns won't have attribute
128
- # accessors defined, and won't be referenced in SQL queries.
129
-
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. Note that using
119
+ # a non-unique column can result in non-deterministic results.
130
120
  included do
131
121
  mattr_accessor :primary_key_prefix_type, instance_writer: false
132
122
 
133
- class_attribute :table_name_prefix, instance_writer: false
134
- self.table_name_prefix = ""
135
-
136
- class_attribute :table_name_suffix, instance_writer: false
137
- self.table_name_suffix = ""
138
-
139
- class_attribute :schema_migrations_table_name, instance_accessor: false
140
- self.schema_migrations_table_name = "schema_migrations"
141
-
142
- class_attribute :internal_metadata_table_name, instance_accessor: false
143
- self.internal_metadata_table_name = "ar_internal_metadata"
123
+ class_attribute :table_name_prefix, instance_writer: false, default: ""
124
+ class_attribute :table_name_suffix, instance_writer: false, default: ""
125
+ class_attribute :schema_migrations_table_name, instance_accessor: false, default: "schema_migrations"
126
+ class_attribute :internal_metadata_table_name, instance_accessor: false, default: "ar_internal_metadata"
127
+ class_attribute :pluralize_table_names, instance_writer: false, default: true
128
+ class_attribute :implicit_order_column, instance_accessor: false
144
129
 
145
- class_attribute :protected_environments, instance_accessor: false
146
130
  self.protected_environments = ["production"]
147
-
148
- class_attribute :pluralize_table_names, instance_writer: false
149
- self.pluralize_table_names = true
150
-
151
- class_attribute :ignored_columns, instance_accessor: false
131
+ self.inheritance_column = "type"
152
132
  self.ignored_columns = [].freeze
153
133
 
154
- self.inheritance_column = 'type'
155
-
156
134
  delegate :type_for_attribute, to: :class
157
135
 
158
136
  initialize_load_schema_monitor
@@ -256,11 +234,26 @@ module ActiveRecord
256
234
  end
257
235
 
258
236
  def full_table_name_prefix #:nodoc:
259
- (parents.detect{ |p| p.respond_to?(:table_name_prefix) } || self).table_name_prefix
237
+ (module_parents.detect { |p| p.respond_to?(:table_name_prefix) } || self).table_name_prefix
260
238
  end
261
239
 
262
240
  def full_table_name_suffix #:nodoc:
263
- (parents.detect {|p| p.respond_to?(:table_name_suffix) } || self).table_name_suffix
241
+ (module_parents.detect { |p| p.respond_to?(:table_name_suffix) } || self).table_name_suffix
242
+ end
243
+
244
+ # The array of names of environments where destructive actions should be prohibited. By default,
245
+ # the value is <tt>["production"]</tt>.
246
+ def protected_environments
247
+ if defined?(@protected_environments)
248
+ @protected_environments
249
+ else
250
+ superclass.protected_environments
251
+ end
252
+ end
253
+
254
+ # Sets an array of names of environments where destructive actions should be prohibited.
255
+ def protected_environments=(environments)
256
+ @protected_environments = environments.map(&:to_s)
264
257
  end
265
258
 
266
259
  # Defines the name of the table column which will store the class name on single-table
@@ -282,8 +275,24 @@ module ActiveRecord
282
275
  @explicit_inheritance_column = true
283
276
  end
284
277
 
278
+ # The list of columns names the model should ignore. Ignored columns won't have attribute
279
+ # accessors defined, and won't be referenced in SQL queries.
280
+ def ignored_columns
281
+ if defined?(@ignored_columns)
282
+ @ignored_columns
283
+ else
284
+ superclass.ignored_columns
285
+ end
286
+ end
287
+
288
+ # Sets the columns names the model should ignore. Ignored columns won't have attribute
289
+ # accessors defined, and won't be referenced in SQL queries.
290
+ def ignored_columns=(columns)
291
+ @ignored_columns = columns.map(&:to_s)
292
+ end
293
+
285
294
  def sequence_name
286
- if base_class == self
295
+ if base_class?
287
296
  @sequence_name ||= reset_sequence_name
288
297
  else
289
298
  (@sequence_name ||= nil) || base_class.sequence_name
@@ -296,7 +305,7 @@ module ActiveRecord
296
305
  end
297
306
 
298
307
  # 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
308
+ # value, or (if the value is +nil+ or +false+) to the value returned by the
300
309
  # given block. This is required for Oracle and is useful for any
301
310
  # database which relies on sequences for primary key generation.
302
311
  #
@@ -332,11 +341,11 @@ module ActiveRecord
332
341
  end
333
342
 
334
343
  def attributes_builder # :nodoc:
335
- @attributes_builder ||= AttributeSet::Builder.new(attribute_types, primary_key) do |name|
336
- unless columns_hash.key?(name)
337
- _default_attributes[name].dup
338
- end
344
+ unless defined?(@attributes_builder) && @attributes_builder
345
+ defaults = _default_attributes.except(*(column_names - [primary_key]))
346
+ @attributes_builder = ActiveModel::AttributeSet::Builder.new(attribute_types, defaults)
339
347
  end
348
+ @attributes_builder
340
349
  end
341
350
 
342
351
  def columns_hash # :nodoc:
@@ -351,7 +360,11 @@ module ActiveRecord
351
360
 
352
361
  def attribute_types # :nodoc:
353
362
  load_schema
354
- @attribute_types ||= Hash.new(Type::Value.new)
363
+ @attribute_types ||= Hash.new(Type.default_value)
364
+ end
365
+
366
+ def yaml_encoder # :nodoc:
367
+ @yaml_encoder ||= ActiveModel::AttributeSet::YAMLEncoder.new(attribute_types)
355
368
  end
356
369
 
357
370
  # Returns the type of the attribute with the given name, after applying
@@ -364,8 +377,9 @@ module ActiveRecord
364
377
  # it).
365
378
  #
366
379
  # +attr_name+ The name of the attribute to retrieve the type for. Must be
367
- # a string
380
+ # a string or a symbol.
368
381
  def type_for_attribute(attr_name, &block)
382
+ attr_name = attr_name.to_s
369
383
  if block
370
384
  attribute_types.fetch(attr_name, &block)
371
385
  else
@@ -377,11 +391,12 @@ module ActiveRecord
377
391
  # default values when instantiating the Active Record object for this table.
378
392
  def column_defaults
379
393
  load_schema
380
- _default_attributes.to_hash
394
+ @column_defaults ||= _default_attributes.deep_dup.to_hash
381
395
  end
382
396
 
383
397
  def _default_attributes # :nodoc:
384
- @default_attributes ||= AttributeSet.new({})
398
+ load_schema
399
+ @default_attributes ||= ActiveModel::AttributeSet.new({})
385
400
  end
386
401
 
387
402
  # Returns an array of column names as strings.
@@ -389,10 +404,20 @@ module ActiveRecord
389
404
  @column_names ||= columns.map(&:name)
390
405
  end
391
406
 
407
+ def symbol_column_to_string(name_symbol) # :nodoc:
408
+ @symbol_column_to_string_name_hash ||= column_names.index_by(&:to_sym)
409
+ @symbol_column_to_string_name_hash[name_symbol]
410
+ end
411
+
392
412
  # Returns an array of column objects where the primary id, all columns ending in "_id" or "_count",
393
413
  # and columns used for single table inheritance have been removed.
394
414
  def content_columns
395
- @content_columns ||= columns.reject { |c| c.name == primary_key || c.name =~ /(_id|_count)$/ || c.name == inheritance_column }
415
+ @content_columns ||= columns.reject do |c|
416
+ c.name == primary_key ||
417
+ c.name == inheritance_column ||
418
+ c.name.end_with?("_id") ||
419
+ c.name.end_with?("_count")
420
+ end
396
421
  end
397
422
 
398
423
  # Resets all the cached information about columns, which will cause them
@@ -423,7 +448,7 @@ module ActiveRecord
423
448
  # end
424
449
  def reset_column_information
425
450
  connection.clear_cache!
426
- undefine_attribute_methods
451
+ ([self] + descendants).each(&:undefine_attribute_methods)
427
452
  connection.schema_cache.clear_data_source_cache!(table_name)
428
453
 
429
454
  reload_schema_from_cache
@@ -432,108 +457,89 @@ module ActiveRecord
432
457
 
433
458
  protected
434
459
 
435
- def initialize_load_schema_monitor
436
- @load_schema_monitor = Monitor.new
437
- end
460
+ def initialize_load_schema_monitor
461
+ @load_schema_monitor = Monitor.new
462
+ end
438
463
 
439
464
  private
440
465
 
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
466
+ def inherited(child_class)
467
+ super
468
+ child_class.initialize_load_schema_monitor
469
+ end
449
470
 
450
- def load_schema
451
- return if schema_loaded?
452
- @load_schema_monitor.synchronize do
453
- return if defined?(@columns_hash) && @columns_hash
471
+ def schema_loaded?
472
+ defined?(@schema_loaded) && @schema_loaded
473
+ end
454
474
 
455
- load_schema!
475
+ def load_schema
476
+ return if schema_loaded?
477
+ @load_schema_monitor.synchronize do
478
+ return if defined?(@columns_hash) && @columns_hash
456
479
 
457
- @schema_loaded = true
458
- end
459
- end
480
+ load_schema!
460
481
 
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
- )
482
+ @schema_loaded = true
483
+ rescue
484
+ reload_schema_from_cache # If the schema loading failed half way through, we must reset the state.
485
+ raise
486
+ end
471
487
  end
472
- end
473
488
 
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)
489
+ def load_schema!
490
+ @columns_hash = connection.schema_cache.columns_hash(table_name).except(*ignored_columns)
491
+ @columns_hash.each do |name, column|
492
+ define_attribute(
493
+ name,
494
+ connection.lookup_cast_type_from_column(column),
495
+ default: column.default,
496
+ user_provided_default: false
497
+ )
498
+ end
489
499
  end
490
- end
491
500
 
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
497
-
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 += '_'
501
+ def reload_schema_from_cache
502
+ @arel_table = nil
503
+ @column_names = nil
504
+ @symbol_column_to_string_name_hash = nil
505
+ @attribute_types = nil
506
+ @content_columns = nil
507
+ @default_attributes = nil
508
+ @column_defaults = nil
509
+ @inheritance_column = nil unless defined?(@explicit_inheritance_column) && @explicit_inheritance_column
510
+ @attributes_builder = nil
511
+ @columns = nil
512
+ @columns_hash = nil
513
+ @schema_loaded = false
514
+ @attribute_names = nil
515
+ @yaml_encoder = nil
516
+ direct_descendants.each do |descendant|
517
+ descendant.send(:reload_schema_from_cache)
507
518
  end
519
+ end
508
520
 
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
521
+ # Guesses the table name, but does not decorate it with prefix and suffix information.
522
+ def undecorated_table_name(class_name = base_class.name)
523
+ table_name = class_name.to_s.demodulize.underscore
524
+ pluralize_table_names ? table_name.pluralize : table_name
513
525
  end
514
- end
515
526
 
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")
519
- if column.array?
520
- array_arguments = ", array: true"
527
+ # Computes and returns a table name according to default conventions.
528
+ def compute_table_name
529
+ if base_class?
530
+ # Nested classes are prefixed with singular parent table name.
531
+ if module_parent < Base && !module_parent.abstract_class?
532
+ contained = module_parent.table_name
533
+ contained = contained.singularize if module_parent.pluralize_table_names
534
+ contained += "_"
535
+ end
536
+
537
+ "#{full_table_name_prefix}#{contained}#{undecorated_table_name(name)}#{full_table_name_suffix}"
521
538
  else
522
- array_arguments = ""
539
+ # STI subclasses always use their superclass' table.
540
+ base_class.table_name
523
541
  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
-
529
- attribute :#{column.name}, :legacy_point#{array_arguments}
530
-
531
- If you'd like the new behavior today, you can add this line:
532
-
533
- attribute :#{column.name}, :point#{array_arguments}
534
- WARNING
535
542
  end
536
- end
537
543
  end
538
544
  end
539
545
  end