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,5 +1,7 @@
1
- require 'active_record/scoping/default'
2
- require 'active_record/scoping/named'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/scoping/default"
4
+ require "active_record/scoping/named"
3
5
 
4
6
  module ActiveRecord
5
7
  # This class is used to create a table that keeps track of which migrations
@@ -8,24 +10,22 @@ module ActiveRecord
8
10
  # to be executed the next time.
9
11
  class SchemaMigration < ActiveRecord::Base # :nodoc:
10
12
  class << self
13
+ def _internal?
14
+ true
15
+ end
16
+
11
17
  def primary_key
12
18
  "version"
13
19
  end
14
20
 
15
21
  def table_name
16
- "#{table_name_prefix}#{ActiveRecord::Base.schema_migrations_table_name}#{table_name_suffix}"
17
- end
18
-
19
- def table_exists?
20
- ActiveSupport::Deprecation.silence { connection.table_exists?(table_name) }
22
+ "#{table_name_prefix}#{schema_migrations_table_name}#{table_name_suffix}"
21
23
  end
22
24
 
23
25
  def create_table
24
- unless table_exists?
25
- version_options = connection.internal_string_options_for_primary_key
26
-
26
+ unless connection.table_exists?(table_name)
27
27
  connection.create_table(table_name, id: false) do |t|
28
- t.string :version, version_options
28
+ t.string :version, **connection.internal_string_options_for_primary_key
29
29
  end
30
30
  end
31
31
  end
@@ -39,7 +39,11 @@ module ActiveRecord
39
39
  end
40
40
 
41
41
  def normalized_versions
42
- pluck(:version).map { |v| normalize_migration_number v }
42
+ all_versions.map { |v| normalize_migration_number v }
43
+ end
44
+
45
+ def all_versions
46
+ order(:version).pluck(:version)
43
47
  end
44
48
  end
45
49
 
@@ -1,4 +1,6 @@
1
- require 'active_support/per_thread_registry'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/per_thread_registry"
2
4
 
3
5
  module ActiveRecord
4
6
  module Scoping
@@ -9,33 +11,32 @@ module ActiveRecord
9
11
  include Named
10
12
  end
11
13
 
12
- module ClassMethods
13
- def current_scope(skip_inherited_scope = false) # :nodoc:
14
- ScopeRegistry.value_for(:current_scope, self, skip_inherited_scope)
15
- end
16
-
17
- def current_scope=(scope) #:nodoc:
18
- ScopeRegistry.set_value_for(:current_scope, self, scope)
19
- end
20
-
14
+ module ClassMethods # :nodoc:
21
15
  # Collects attributes from scopes that should be applied when creating
22
16
  # an AR instance for the particular class this is called on.
23
- def scope_attributes # :nodoc:
17
+ def scope_attributes
24
18
  all.scope_for_create
25
19
  end
26
20
 
27
21
  # Are there attributes associated with this scope?
28
- def scope_attributes? # :nodoc:
22
+ def scope_attributes?
29
23
  current_scope
30
24
  end
25
+
26
+ def current_scope(skip_inherited_scope = false)
27
+ ScopeRegistry.value_for(:current_scope, self, skip_inherited_scope)
28
+ end
29
+
30
+ def current_scope=(scope)
31
+ ScopeRegistry.set_value_for(:current_scope, self, scope)
32
+ end
31
33
  end
32
34
 
33
35
  def populate_with_current_scope_attributes # :nodoc:
34
36
  return unless self.class.scope_attributes?
35
37
 
36
- self.class.scope_attributes.each do |att,value|
37
- send("#{att}=", value) if respond_to?("#{att}=")
38
- end
38
+ attributes = self.class.scope_attributes
39
+ _assign_attributes(attributes) if attributes.any?
39
40
  end
40
41
 
41
42
  def initialize_internals_callback # :nodoc:
@@ -94,12 +95,11 @@ module ActiveRecord
94
95
  end
95
96
 
96
97
  private
97
-
98
- def raise_invalid_scope_type!(scope_type)
99
- if !VALID_SCOPE_TYPES.include?(scope_type)
100
- raise ArgumentError, "Invalid scope type '#{scope_type}' sent to the registry. Scope types must be included in VALID_SCOPE_TYPES"
98
+ def raise_invalid_scope_type!(scope_type)
99
+ if !VALID_SCOPE_TYPES.include?(scope_type)
100
+ raise ArgumentError, "Invalid scope type '#{scope_type}' sent to the registry. Scope types must be included in VALID_SCOPE_TYPES"
101
+ end
101
102
  end
102
- end
103
103
  end
104
104
  end
105
105
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Scoping
3
5
  module Default
@@ -5,11 +7,8 @@ module ActiveRecord
5
7
 
6
8
  included do
7
9
  # Stores the default scope for the class.
8
- class_attribute :default_scopes, instance_writer: false, instance_predicate: false
9
- class_attribute :default_scope_override, instance_writer: false, instance_predicate: false
10
-
11
- self.default_scopes = []
12
- self.default_scope_override = nil
10
+ class_attribute :default_scopes, instance_writer: false, instance_predicate: false, default: []
11
+ class_attribute :default_scope_override, instance_writer: false, instance_predicate: false, default: nil
13
12
  end
14
13
 
15
14
  module ClassMethods
@@ -44,109 +43,107 @@ module ActiveRecord
44
43
  self.current_scope = nil
45
44
  end
46
45
 
47
- protected
48
-
49
- # Use this macro in your model to set a default scope for all operations on
50
- # the model.
51
- #
52
- # class Article < ActiveRecord::Base
53
- # default_scope { where(published: true) }
54
- # end
55
- #
56
- # Article.all # => SELECT * FROM articles WHERE published = true
57
- #
58
- # The #default_scope is also applied while creating/building a record.
59
- # It is not applied while updating a record.
60
- #
61
- # Article.new.published # => true
62
- # Article.create.published # => true
63
- #
64
- # (You can also pass any object which responds to +call+ to the
65
- # +default_scope+ macro, and it will be called when building the
66
- # default scope.)
67
- #
68
- # If you use multiple #default_scope declarations in your model then
69
- # they will be merged together:
70
- #
71
- # class Article < ActiveRecord::Base
72
- # default_scope { where(published: true) }
73
- # default_scope { where(rating: 'G') }
74
- # end
75
- #
76
- # Article.all # => SELECT * FROM articles WHERE published = true AND rating = 'G'
77
- #
78
- # This is also the case with inheritance and module includes where the
79
- # parent or module defines a #default_scope and the child or including
80
- # class defines a second one.
81
- #
82
- # If you need to do more complex things with a default scope, you can
83
- # alternatively define it as a class method:
84
- #
85
- # class Article < ActiveRecord::Base
86
- # def self.default_scope
87
- # # Should return a scope, you can call 'super' here etc.
88
- # end
89
- # end
90
- def default_scope(scope = nil)
91
- scope = Proc.new if block_given?
46
+ private
47
+ # Use this macro in your model to set a default scope for all operations on
48
+ # the model.
49
+ #
50
+ # class Article < ActiveRecord::Base
51
+ # default_scope { where(published: true) }
52
+ # end
53
+ #
54
+ # Article.all # => SELECT * FROM articles WHERE published = true
55
+ #
56
+ # The #default_scope is also applied while creating/building a record.
57
+ # It is not applied while updating a record.
58
+ #
59
+ # Article.new.published # => true
60
+ # Article.create.published # => true
61
+ #
62
+ # (You can also pass any object which responds to +call+ to the
63
+ # +default_scope+ macro, and it will be called when building the
64
+ # default scope.)
65
+ #
66
+ # If you use multiple #default_scope declarations in your model then
67
+ # they will be merged together:
68
+ #
69
+ # class Article < ActiveRecord::Base
70
+ # default_scope { where(published: true) }
71
+ # default_scope { where(rating: 'G') }
72
+ # end
73
+ #
74
+ # Article.all # => SELECT * FROM articles WHERE published = true AND rating = 'G'
75
+ #
76
+ # This is also the case with inheritance and module includes where the
77
+ # parent or module defines a #default_scope and the child or including
78
+ # class defines a second one.
79
+ #
80
+ # If you need to do more complex things with a default scope, you can
81
+ # alternatively define it as a class method:
82
+ #
83
+ # class Article < ActiveRecord::Base
84
+ # def self.default_scope
85
+ # # Should return a scope, you can call 'super' here etc.
86
+ # end
87
+ # end
88
+ def default_scope(scope = nil, &block) # :doc:
89
+ scope = block if block_given?
90
+
91
+ if scope.is_a?(Relation) || !scope.respond_to?(:call)
92
+ raise ArgumentError,
93
+ "Support for calling #default_scope without a block is removed. For example instead " \
94
+ "of `default_scope where(color: 'red')`, please use " \
95
+ "`default_scope { where(color: 'red') }`. (Alternatively you can just redefine " \
96
+ "self.default_scope.)"
97
+ end
92
98
 
93
- if scope.is_a?(Relation) || !scope.respond_to?(:call)
94
- raise ArgumentError,
95
- "Support for calling #default_scope without a block is removed. For example instead " \
96
- "of `default_scope where(color: 'red')`, please use " \
97
- "`default_scope { where(color: 'red') }`. (Alternatively you can just redefine " \
98
- "self.default_scope.)"
99
+ self.default_scopes += [scope]
99
100
  end
100
101
 
101
- self.default_scopes += [scope]
102
- end
103
-
104
- def build_default_scope(base_rel = nil) # :nodoc:
105
- return if abstract_class?
102
+ def build_default_scope(relation = relation())
103
+ return if abstract_class?
106
104
 
107
- if self.default_scope_override.nil?
108
- self.default_scope_override = !Base.is_a?(method(:default_scope).owner)
109
- end
105
+ if default_scope_override.nil?
106
+ self.default_scope_override = !Base.is_a?(method(:default_scope).owner)
107
+ end
110
108
 
111
- if self.default_scope_override
112
- # The user has defined their own default scope method, so call that
113
- evaluate_default_scope do
114
- if scope = default_scope
115
- (base_rel ||= relation).merge(scope)
109
+ if default_scope_override
110
+ # The user has defined their own default scope method, so call that
111
+ evaluate_default_scope do
112
+ if scope = default_scope
113
+ relation.merge!(scope)
114
+ end
116
115
  end
117
- end
118
- elsif default_scopes.any?
119
- base_rel ||= relation
120
- evaluate_default_scope do
121
- default_scopes.inject(base_rel) do |default_scope, scope|
122
- scope = scope.respond_to?(:to_proc) ? scope : scope.method(:call)
123
- default_scope.merge(base_rel.instance_exec(&scope))
116
+ elsif default_scopes.any?
117
+ evaluate_default_scope do
118
+ default_scopes.inject(relation) do |default_scope, scope|
119
+ scope = scope.respond_to?(:to_proc) ? scope : scope.method(:call)
120
+ default_scope.instance_exec(&scope) || default_scope
121
+ end
124
122
  end
125
123
  end
126
124
  end
127
- end
128
-
129
- def ignore_default_scope? # :nodoc:
130
- ScopeRegistry.value_for(:ignore_default_scope, base_class)
131
- end
132
125
 
133
- def ignore_default_scope=(ignore) # :nodoc:
134
- ScopeRegistry.set_value_for(:ignore_default_scope, base_class, ignore)
135
- end
126
+ def ignore_default_scope?
127
+ ScopeRegistry.value_for(:ignore_default_scope, base_class)
128
+ end
136
129
 
137
- # The ignore_default_scope flag is used to prevent an infinite recursion
138
- # situation where a default scope references a scope which has a default
139
- # scope which references a scope...
140
- def evaluate_default_scope # :nodoc:
141
- return if ignore_default_scope?
130
+ def ignore_default_scope=(ignore)
131
+ ScopeRegistry.set_value_for(:ignore_default_scope, base_class, ignore)
132
+ end
142
133
 
143
- begin
144
- self.ignore_default_scope = true
145
- yield
146
- ensure
147
- self.ignore_default_scope = false
134
+ # The ignore_default_scope flag is used to prevent an infinite recursion
135
+ # situation where a default scope references a scope which has a default
136
+ # scope which references a scope...
137
+ def evaluate_default_scope
138
+ return if ignore_default_scope?
139
+
140
+ begin
141
+ self.ignore_default_scope = true
142
+ yield
143
+ ensure
144
+ self.ignore_default_scope = false
145
+ end
148
146
  end
149
- end
150
147
  end
151
148
  end
152
149
  end
@@ -1,6 +1,4 @@
1
- require 'active_support/core_ext/array'
2
- require 'active_support/core_ext/hash/except'
3
- require 'active_support/core_ext/kernel/singleton_class'
1
+ # frozen_string_literal: true
4
2
 
5
3
  module ActiveRecord
6
4
  # = Active Record \Named \Scopes
@@ -22,29 +20,34 @@ module ActiveRecord
22
20
  # You can define a scope that applies to all finders using
23
21
  # {default_scope}[rdoc-ref:Scoping::Default::ClassMethods#default_scope].
24
22
  def all
25
- if current_scope
26
- current_scope.clone
23
+ scope = current_scope
24
+
25
+ if scope
26
+ if self == scope.klass
27
+ scope.clone
28
+ else
29
+ relation.merge!(scope)
30
+ end
27
31
  else
28
32
  default_scoped
29
33
  end
30
34
  end
31
35
 
32
36
  def scope_for_association(scope = relation) # :nodoc:
33
- current_scope = self.current_scope
34
-
35
- if current_scope && current_scope.empty_scope?
37
+ if current_scope&.empty_scope?
36
38
  scope
37
39
  else
38
40
  default_scoped(scope)
39
41
  end
40
42
  end
41
43
 
42
- def default_scoped(scope = relation) # :nodoc:
44
+ # Returns a scope for the model with default scopes.
45
+ def default_scoped(scope = relation)
43
46
  build_default_scope(scope) || scope
44
47
  end
45
48
 
46
49
  def default_extensions # :nodoc:
47
- if scope = current_scope || build_default_scope
50
+ if scope = scope_for_association || build_default_scope
48
51
  scope.extensions
49
52
  else
50
53
  []
@@ -54,7 +57,7 @@ module ActiveRecord
54
57
  # Adds a class method for retrieving and querying objects.
55
58
  # The method is intended to return an ActiveRecord::Relation
56
59
  # object, which is composable with other scopes.
57
- # If it returns nil or false, an
60
+ # If it returns +nil+ or +false+, an
58
61
  # {all}[rdoc-ref:Scoping::Named::ClassMethods#all] scope is returned instead.
59
62
  #
60
63
  # A \scope represents a narrowing of a database query, such as
@@ -69,10 +72,6 @@ module ActiveRecord
69
72
  # <tt>Shirt.dry_clean_only</tt>. <tt>Shirt.red</tt>, in effect,
70
73
  # represents the query <tt>Shirt.where(color: 'red')</tt>.
71
74
  #
72
- # You should always pass a callable object to the scopes defined
73
- # with #scope. This ensures that the scope is re-evaluated each
74
- # time it is called.
75
- #
76
75
  # Note that this is simply 'syntactic sugar' for defining an actual
77
76
  # class method:
78
77
  #
@@ -154,7 +153,7 @@ module ActiveRecord
154
153
  # Article.featured.titles
155
154
  def scope(name, body, &block)
156
155
  unless body.respond_to?(:call)
157
- raise ArgumentError, 'The scope body needs to be callable.'
156
+ raise ArgumentError, "The scope body needs to be callable."
158
157
  end
159
158
 
160
159
  if dangerous_class_method?(name)
@@ -163,34 +162,44 @@ module ActiveRecord
163
162
  "a class method with the same name."
164
163
  end
165
164
 
165
+ if method_defined_within?(name, Relation)
166
+ raise ArgumentError, "You tried to define a scope named \"#{name}\" " \
167
+ "on the model \"#{self.name}\", but ActiveRecord::Relation already defined " \
168
+ "an instance method with the same name."
169
+ end
170
+
166
171
  valid_scope_name?(name)
167
172
  extension = Module.new(&block) if block
168
173
 
169
174
  if body.respond_to?(:to_proc)
170
- singleton_class.send(:define_method, name) do |*args|
171
- scope = all.scoping { instance_exec(*args, &body) }
175
+ singleton_class.define_method(name) do |*args|
176
+ scope = all._exec_scope(*args, &body)
172
177
  scope = scope.extending(extension) if extension
173
-
174
- scope || all
178
+ scope
175
179
  end
176
180
  else
177
- singleton_class.send(:define_method, name) do |*args|
178
- scope = all.scoping { body.call(*args) }
181
+ singleton_class.define_method(name) do |*args|
182
+ scope = body.call(*args) || all
179
183
  scope = scope.extending(extension) if extension
180
-
181
- scope || all
184
+ scope
182
185
  end
183
186
  end
187
+ singleton_class.send(:ruby2_keywords, name) if respond_to?(:ruby2_keywords, true)
188
+
189
+ generate_relation_method(name)
184
190
  end
185
191
 
186
- protected
192
+ private
193
+ def singleton_method_added(name)
194
+ generate_relation_method(name) if Kernel.respond_to?(name) && !ActiveRecord::Relation.method_defined?(name)
195
+ end
187
196
 
188
- def valid_scope_name?(name)
189
- if respond_to?(name, true) && logger
190
- logger.warn "Creating scope :#{name}. " \
191
- "Overwriting existing method #{self.name}.#{name}."
197
+ def valid_scope_name?(name)
198
+ if respond_to?(name, true) && logger
199
+ logger.warn "Creating scope :#{name}. " \
200
+ "Overwriting existing method #{self.name}.#{name}."
201
+ end
192
202
  end
193
- end
194
203
  end
195
204
  end
196
205
  end