activerecord 4.2.9 → 6.1.4.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 (374) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +964 -1382
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +15 -14
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/aggregations.rb +266 -251
  8. data/lib/active_record/association_relation.rb +40 -15
  9. data/lib/active_record/associations/alias_tracker.rb +40 -43
  10. data/lib/active_record/associations/association.rb +162 -69
  11. data/lib/active_record/associations/association_scope.rb +105 -130
  12. data/lib/active_record/associations/belongs_to_association.rb +83 -65
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
  14. data/lib/active_record/associations/builder/association.rb +57 -43
  15. data/lib/active_record/associations/builder/belongs_to.rb +74 -57
  16. data/lib/active_record/associations/builder/collection_association.rb +15 -37
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +49 -66
  18. data/lib/active_record/associations/builder/has_many.rb +13 -5
  19. data/lib/active_record/associations/builder/has_one.rb +44 -6
  20. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  21. data/lib/active_record/associations/collection_association.rb +148 -287
  22. data/lib/active_record/associations/collection_proxy.rb +252 -150
  23. data/lib/active_record/associations/foreign_association.rb +23 -1
  24. data/lib/active_record/associations/has_many_association.rb +56 -98
  25. data/lib/active_record/associations/has_many_through_association.rb +68 -89
  26. data/lib/active_record/associations/has_one_association.rb +73 -47
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +54 -81
  29. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  30. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  31. data/lib/active_record/associations/join_dependency.rb +174 -169
  32. data/lib/active_record/associations/preloader/association.rb +108 -115
  33. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  34. data/lib/active_record/associations/preloader.rb +97 -94
  35. data/lib/active_record/associations/singular_association.rb +18 -39
  36. data/lib/active_record/associations/through_association.rb +39 -19
  37. data/lib/active_record/associations.rb +1845 -1598
  38. data/lib/active_record/attribute_assignment.rb +59 -185
  39. data/lib/active_record/attribute_methods/before_type_cast.rb +18 -10
  40. data/lib/active_record/attribute_methods/dirty.rb +168 -148
  41. data/lib/active_record/attribute_methods/primary_key.rb +93 -83
  42. data/lib/active_record/attribute_methods/query.rb +8 -10
  43. data/lib/active_record/attribute_methods/read.rb +19 -79
  44. data/lib/active_record/attribute_methods/serialization.rb +49 -24
  45. data/lib/active_record/attribute_methods/time_zone_conversion.rb +55 -36
  46. data/lib/active_record/attribute_methods/write.rb +24 -55
  47. data/lib/active_record/attribute_methods.rb +149 -154
  48. data/lib/active_record/attributes.rb +234 -78
  49. data/lib/active_record/autosave_association.rb +133 -60
  50. data/lib/active_record/base.rb +46 -46
  51. data/lib/active_record/callbacks.rb +234 -79
  52. data/lib/active_record/coders/json.rb +3 -1
  53. data/lib/active_record/coders/yaml_column.rb +34 -13
  54. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +887 -323
  55. data/lib/active_record/connection_adapters/abstract/database_limits.rb +17 -41
  56. data/lib/active_record/connection_adapters/abstract/database_statements.rb +292 -124
  57. data/lib/active_record/connection_adapters/abstract/query_cache.rb +78 -24
  58. data/lib/active_record/connection_adapters/abstract/quoting.rb +177 -60
  59. data/lib/active_record/connection_adapters/abstract/savepoints.rb +8 -6
  60. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +157 -93
  61. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +473 -255
  62. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  63. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +869 -286
  64. data/lib/active_record/connection_adapters/abstract/transaction.rb +257 -91
  65. data/lib/active_record/connection_adapters/abstract_adapter.rb +483 -230
  66. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +557 -640
  67. data/lib/active_record/connection_adapters/column.rb +67 -40
  68. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  69. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
  70. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  71. data/lib/active_record/connection_adapters/mysql/database_statements.rb +194 -0
  72. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  73. data/lib/active_record/connection_adapters/mysql/quoting.rb +96 -0
  74. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +97 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +103 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +91 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  78. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
  79. data/lib/active_record/connection_adapters/mysql2_adapter.rb +80 -192
  80. data/lib/active_record/connection_adapters/pool_config.rb +73 -0
  81. data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +44 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +75 -160
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -58
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +4 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +8 -6
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -19
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -20
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  98. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  101. data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
  102. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
  103. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +70 -34
  104. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  105. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  106. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
  107. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  108. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  109. data/lib/active_record/connection_adapters/postgresql/oid.rb +25 -25
  110. data/lib/active_record/connection_adapters/postgresql/quoting.rb +145 -48
  111. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  112. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  114. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
  115. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +496 -298
  116. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
  117. data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
  118. data/lib/active_record/connection_adapters/postgresql_adapter.rb +588 -375
  119. data/lib/active_record/connection_adapters/schema_cache.rb +167 -29
  120. data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
  121. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
  122. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  123. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +21 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  126. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  127. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +170 -0
  128. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +322 -373
  129. data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
  130. data/lib/active_record/connection_adapters.rb +52 -0
  131. data/lib/active_record/connection_handling.rb +314 -41
  132. data/lib/active_record/core.rb +458 -241
  133. data/lib/active_record/counter_cache.rb +70 -49
  134. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  135. data/lib/active_record/database_configurations/database_config.rb +80 -0
  136. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  137. data/lib/active_record/database_configurations/url_config.rb +53 -0
  138. data/lib/active_record/database_configurations.rb +272 -0
  139. data/lib/active_record/delegated_type.rb +209 -0
  140. data/lib/active_record/destroy_association_async_job.rb +36 -0
  141. data/lib/active_record/dynamic_matchers.rb +87 -106
  142. data/lib/active_record/enum.rb +211 -92
  143. data/lib/active_record/errors.rb +224 -54
  144. data/lib/active_record/explain.rb +27 -11
  145. data/lib/active_record/explain_registry.rb +4 -2
  146. data/lib/active_record/explain_subscriber.rb +10 -5
  147. data/lib/active_record/fixture_set/file.rb +33 -14
  148. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  149. data/lib/active_record/fixture_set/render_context.rb +17 -0
  150. data/lib/active_record/fixture_set/table_row.rb +152 -0
  151. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  152. data/lib/active_record/fixtures.rb +275 -500
  153. data/lib/active_record/gem_version.rb +6 -4
  154. data/lib/active_record/inheritance.rb +175 -110
  155. data/lib/active_record/insert_all.rb +212 -0
  156. data/lib/active_record/integration.rb +121 -29
  157. data/lib/active_record/internal_metadata.rb +62 -0
  158. data/lib/active_record/legacy_yaml_adapter.rb +27 -5
  159. data/lib/active_record/locale/en.yml +3 -2
  160. data/lib/active_record/locking/optimistic.rb +98 -92
  161. data/lib/active_record/locking/pessimistic.rb +22 -6
  162. data/lib/active_record/log_subscriber.rb +93 -31
  163. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  164. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  165. data/lib/active_record/middleware/database_selector.rb +77 -0
  166. data/lib/active_record/migration/command_recorder.rb +185 -90
  167. data/lib/active_record/migration/compatibility.rb +295 -0
  168. data/lib/active_record/migration/join_table.rb +8 -7
  169. data/lib/active_record/migration.rb +673 -325
  170. data/lib/active_record/model_schema.rb +418 -113
  171. data/lib/active_record/nested_attributes.rb +263 -224
  172. data/lib/active_record/no_touching.rb +15 -2
  173. data/lib/active_record/null_relation.rb +24 -38
  174. data/lib/active_record/persistence.rb +572 -136
  175. data/lib/active_record/query_cache.rb +29 -23
  176. data/lib/active_record/querying.rb +50 -31
  177. data/lib/active_record/railtie.rb +170 -51
  178. data/lib/active_record/railties/console_sandbox.rb +3 -3
  179. data/lib/active_record/railties/controller_runtime.rb +34 -33
  180. data/lib/active_record/railties/databases.rake +523 -199
  181. data/lib/active_record/readonly_attributes.rb +9 -4
  182. data/lib/active_record/reflection.rb +454 -291
  183. data/lib/active_record/relation/batches/batch_enumerator.rb +85 -0
  184. data/lib/active_record/relation/batches.rb +217 -59
  185. data/lib/active_record/relation/calculations.rb +324 -249
  186. data/lib/active_record/relation/delegation.rb +76 -84
  187. data/lib/active_record/relation/finder_methods.rb +316 -242
  188. data/lib/active_record/relation/from_clause.rb +30 -0
  189. data/lib/active_record/relation/merger.rb +95 -103
  190. data/lib/active_record/relation/predicate_builder/array_handler.rb +26 -26
  191. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
  192. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  193. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +57 -0
  194. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  195. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  196. data/lib/active_record/relation/predicate_builder.rb +136 -122
  197. data/lib/active_record/relation/query_attribute.rb +50 -0
  198. data/lib/active_record/relation/query_methods.rb +757 -413
  199. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  200. data/lib/active_record/relation/spawn_methods.rb +18 -20
  201. data/lib/active_record/relation/where_clause.rb +239 -0
  202. data/lib/active_record/relation.rb +554 -343
  203. data/lib/active_record/result.rb +91 -47
  204. data/lib/active_record/runtime_registry.rb +6 -4
  205. data/lib/active_record/sanitization.rb +134 -122
  206. data/lib/active_record/schema.rb +21 -24
  207. data/lib/active_record/schema_dumper.rb +141 -92
  208. data/lib/active_record/schema_migration.rb +24 -23
  209. data/lib/active_record/scoping/default.rb +96 -83
  210. data/lib/active_record/scoping/named.rb +78 -36
  211. data/lib/active_record/scoping.rb +45 -27
  212. data/lib/active_record/secure_token.rb +48 -0
  213. data/lib/active_record/serialization.rb +8 -6
  214. data/lib/active_record/signed_id.rb +116 -0
  215. data/lib/active_record/statement_cache.rb +89 -36
  216. data/lib/active_record/store.rb +128 -43
  217. data/lib/active_record/suppressor.rb +61 -0
  218. data/lib/active_record/table_metadata.rb +81 -0
  219. data/lib/active_record/tasks/database_tasks.rb +364 -130
  220. data/lib/active_record/tasks/mysql_database_tasks.rb +67 -113
  221. data/lib/active_record/tasks/postgresql_database_tasks.rb +86 -49
  222. data/lib/active_record/tasks/sqlite_database_tasks.rb +44 -19
  223. data/lib/active_record/test_databases.rb +24 -0
  224. data/lib/active_record/test_fixtures.rb +287 -0
  225. data/lib/active_record/timestamp.rb +86 -43
  226. data/lib/active_record/touch_later.rb +65 -0
  227. data/lib/active_record/transactions.rb +182 -163
  228. data/lib/active_record/translation.rb +3 -1
  229. data/lib/active_record/type/adapter_specific_registry.rb +126 -0
  230. data/lib/active_record/type/date.rb +4 -45
  231. data/lib/active_record/type/date_time.rb +4 -49
  232. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  233. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  234. data/lib/active_record/type/internal/timezone.rb +17 -0
  235. data/lib/active_record/type/json.rb +30 -0
  236. data/lib/active_record/type/serialized.rb +27 -15
  237. data/lib/active_record/type/text.rb +2 -2
  238. data/lib/active_record/type/time.rb +21 -16
  239. data/lib/active_record/type/type_map.rb +16 -19
  240. data/lib/active_record/type/unsigned_integer.rb +9 -8
  241. data/lib/active_record/type.rb +84 -23
  242. data/lib/active_record/type_caster/connection.rb +33 -0
  243. data/lib/active_record/type_caster/map.rb +23 -0
  244. data/lib/active_record/type_caster.rb +9 -0
  245. data/lib/active_record/validations/absence.rb +25 -0
  246. data/lib/active_record/validations/associated.rb +12 -4
  247. data/lib/active_record/validations/length.rb +26 -0
  248. data/lib/active_record/validations/numericality.rb +35 -0
  249. data/lib/active_record/validations/presence.rb +14 -13
  250. data/lib/active_record/validations/uniqueness.rb +63 -56
  251. data/lib/active_record/validations.rb +39 -35
  252. data/lib/active_record/version.rb +3 -1
  253. data/lib/active_record.rb +42 -29
  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/and.rb +32 -0
  269. data/lib/arel/nodes/ascending.rb +23 -0
  270. data/lib/arel/nodes/binary.rb +126 -0
  271. data/lib/arel/nodes/bind_param.rb +44 -0
  272. data/lib/arel/nodes/case.rb +55 -0
  273. data/lib/arel/nodes/casted.rb +62 -0
  274. data/lib/arel/nodes/comment.rb +29 -0
  275. data/lib/arel/nodes/count.rb +12 -0
  276. data/lib/arel/nodes/delete_statement.rb +45 -0
  277. data/lib/arel/nodes/descending.rb +23 -0
  278. data/lib/arel/nodes/equality.rb +15 -0
  279. data/lib/arel/nodes/extract.rb +24 -0
  280. data/lib/arel/nodes/false.rb +16 -0
  281. data/lib/arel/nodes/full_outer_join.rb +8 -0
  282. data/lib/arel/nodes/function.rb +44 -0
  283. data/lib/arel/nodes/grouping.rb +11 -0
  284. data/lib/arel/nodes/homogeneous_in.rb +76 -0
  285. data/lib/arel/nodes/in.rb +15 -0
  286. data/lib/arel/nodes/infix_operation.rb +92 -0
  287. data/lib/arel/nodes/inner_join.rb +8 -0
  288. data/lib/arel/nodes/insert_statement.rb +37 -0
  289. data/lib/arel/nodes/join_source.rb +20 -0
  290. data/lib/arel/nodes/matches.rb +18 -0
  291. data/lib/arel/nodes/named_function.rb +23 -0
  292. data/lib/arel/nodes/node.rb +51 -0
  293. data/lib/arel/nodes/node_expression.rb +13 -0
  294. data/lib/arel/nodes/ordering.rb +27 -0
  295. data/lib/arel/nodes/outer_join.rb +8 -0
  296. data/lib/arel/nodes/over.rb +15 -0
  297. data/lib/arel/nodes/regexp.rb +16 -0
  298. data/lib/arel/nodes/right_outer_join.rb +8 -0
  299. data/lib/arel/nodes/select_core.rb +67 -0
  300. data/lib/arel/nodes/select_statement.rb +41 -0
  301. data/lib/arel/nodes/sql_literal.rb +19 -0
  302. data/lib/arel/nodes/string_join.rb +11 -0
  303. data/lib/arel/nodes/table_alias.rb +31 -0
  304. data/lib/arel/nodes/terminal.rb +16 -0
  305. data/lib/arel/nodes/true.rb +16 -0
  306. data/lib/arel/nodes/unary.rb +44 -0
  307. data/lib/arel/nodes/unary_operation.rb +20 -0
  308. data/lib/arel/nodes/unqualified_column.rb +22 -0
  309. data/lib/arel/nodes/update_statement.rb +41 -0
  310. data/lib/arel/nodes/values_list.rb +9 -0
  311. data/lib/arel/nodes/window.rb +126 -0
  312. data/lib/arel/nodes/with.rb +11 -0
  313. data/lib/arel/nodes.rb +70 -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/dot.rb +308 -0
  321. data/lib/arel/visitors/mysql.rb +93 -0
  322. data/lib/arel/visitors/postgresql.rb +120 -0
  323. data/lib/arel/visitors/sqlite.rb +38 -0
  324. data/lib/arel/visitors/to_sql.rb +899 -0
  325. data/lib/arel/visitors/visitor.rb +45 -0
  326. data/lib/arel/visitors.rb +13 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/arel.rb +54 -0
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  330. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  331. data/lib/rails/generators/active_record/migration/migration_generator.rb +43 -37
  332. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +26 -0
  333. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +13 -4
  334. data/lib/rails/generators/active_record/migration.rb +35 -1
  335. data/lib/rails/generators/active_record/model/model_generator.rb +55 -22
  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.tt +22 -0
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  339. data/lib/rails/generators/active_record.rb +7 -5
  340. metadata +172 -65
  341. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  342. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  343. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  344. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  345. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  346. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  347. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  348. data/lib/active_record/attribute.rb +0 -163
  349. data/lib/active_record/attribute_decorators.rb +0 -66
  350. data/lib/active_record/attribute_set/builder.rb +0 -106
  351. data/lib/active_record/attribute_set.rb +0 -81
  352. data/lib/active_record/connection_adapters/connection_specification.rb +0 -275
  353. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
  354. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  355. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  356. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  357. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  358. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  359. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  360. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  361. data/lib/active_record/type/big_integer.rb +0 -13
  362. data/lib/active_record/type/binary.rb +0 -50
  363. data/lib/active_record/type/boolean.rb +0 -31
  364. data/lib/active_record/type/decimal.rb +0 -64
  365. data/lib/active_record/type/decorator.rb +0 -14
  366. data/lib/active_record/type/float.rb +0 -19
  367. data/lib/active_record/type/integer.rb +0 -59
  368. data/lib/active_record/type/mutable.rb +0 -16
  369. data/lib/active_record/type/numeric.rb +0 -36
  370. data/lib/active_record/type/string.rb +0 -40
  371. data/lib/active_record/type/time_value.rb +0 -38
  372. data/lib/active_record/type/value.rb +0 -110
  373. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  374. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,5 +1,6 @@
1
- require 'stringio'
2
- require 'active_support/core_ext/big_decimal'
1
+ # frozen_string_literal: true
2
+
3
+ require "stringio"
3
4
 
4
5
  module ActiveRecord
5
6
  # = Active Record Schema Dumper
@@ -12,14 +13,25 @@ module ActiveRecord
12
13
  ##
13
14
  # :singleton-method:
14
15
  # A list of tables which should not be dumped to the schema.
15
- # Acceptable values are strings as well as regexp.
16
- # This setting is only used if ActiveRecord::Base.schema_format == :ruby
17
- cattr_accessor :ignore_tables
18
- @@ignore_tables = []
16
+ # Acceptable values are strings as well as regexp if ActiveRecord::Base.schema_format == :ruby.
17
+ # Only strings are accepted if ActiveRecord::Base.schema_format == :sql.
18
+ cattr_accessor :ignore_tables, default: []
19
+
20
+ ##
21
+ # :singleton-method:
22
+ # Specify a custom regular expression matching foreign keys which name
23
+ # should not be dumped to db/schema.rb.
24
+ cattr_accessor :fk_ignore_pattern, default: /^fk_rails_[0-9a-f]{10}$/
25
+
26
+ ##
27
+ # :singleton-method:
28
+ # Specify a custom regular expression matching check constraints which name
29
+ # should not be dumped to db/schema.rb.
30
+ cattr_accessor :chk_ignore_pattern, default: /^chk_rails_[0-9a-f]{10}$/
19
31
 
20
32
  class << self
21
- def dump(connection=ActiveRecord::Base.connection, stream=STDOUT, config = ActiveRecord::Base)
22
- new(connection, generate_options(config)).dump(stream)
33
+ def dump(connection = ActiveRecord::Base.connection, stream = STDOUT, config = ActiveRecord::Base)
34
+ connection.create_schema_dumper(generate_options(config)).dump(stream)
23
35
  stream
24
36
  end
25
37
 
@@ -41,31 +53,36 @@ module ActiveRecord
41
53
  end
42
54
 
43
55
  private
56
+ attr_accessor :table_name
44
57
 
45
58
  def initialize(connection, options = {})
46
59
  @connection = connection
47
- @types = @connection.native_database_types
48
- @version = Migrator::current_version rescue nil
60
+ @version = connection.migration_context.current_version rescue nil
49
61
  @options = options
50
62
  end
51
63
 
52
- def header(stream)
53
- define_params = @version ? "version: #{@version}" : ""
64
+ # turns 20170404131909 into "2017_04_04_131909"
65
+ def formatted_version
66
+ stringified = @version.to_s
67
+ return stringified unless stringified.length == 14
68
+ stringified.insert(4, "_").insert(7, "_").insert(10, "_")
69
+ end
54
70
 
55
- if stream.respond_to?(:external_encoding) && stream.external_encoding
56
- stream.puts "# encoding: #{stream.external_encoding.name}"
57
- end
71
+ def define_params
72
+ @version ? "version: #{formatted_version}" : ""
73
+ end
58
74
 
75
+ def header(stream)
59
76
  stream.puts <<HEADER
60
77
  # This file is auto-generated from the current state of the database. Instead
61
78
  # of editing this file, please use the migrations feature of Active Record to
62
79
  # incrementally modify your database, and then regenerate this schema definition.
63
80
  #
64
- # Note that this schema.rb definition is the authoritative source for your
65
- # database schema. If you need to create the application database on another
66
- # system, you should be using db:schema:load, not running all the migrations
67
- # from scratch. The latter is a flawed and unsustainable approach (the more migrations
68
- # you'll amass, the slower it'll run and the greater likelihood for issues).
81
+ # This file is the source Rails uses to define your schema when running `bin/rails
82
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
83
+ # be faster and is potentially less error prone than running all of your
84
+ # migrations from scratch. Old migrations may fail to apply correctly if those
85
+ # migrations use external dependencies or application code.
69
86
  #
70
87
  # It's strongly recommended that you check this file into your version control system.
71
88
 
@@ -78,16 +95,8 @@ HEADER
78
95
  stream.puts "end"
79
96
  end
80
97
 
98
+ # extensions are only supported by PostgreSQL
81
99
  def extensions(stream)
82
- return unless @connection.supports_extensions?
83
- extensions = @connection.extensions
84
- if extensions.any?
85
- stream.puts " # These are extensions that must be enabled in order to support this database"
86
- extensions.each do |extension|
87
- stream.puts " enable_extension #{extension.inspect}"
88
- end
89
- stream.puts
90
- end
91
100
  end
92
101
 
93
102
  def tables(stream)
@@ -108,103 +117,123 @@ HEADER
108
117
  def table(table, stream)
109
118
  columns = @connection.columns(table)
110
119
  begin
120
+ self.table_name = table
121
+
111
122
  tbl = StringIO.new
112
123
 
113
124
  # first dump primary key column
114
125
  pk = @connection.primary_key(table)
115
126
 
116
127
  tbl.print " create_table #{remove_prefix_and_suffix(table).inspect}"
117
- pkcol = columns.detect { |c| c.name == pk }
118
- if pkcol
119
- if pk != 'id'
120
- tbl.print %Q(, primary_key: "#{pk}")
121
- elsif pkcol.sql_type == 'bigint'
122
- tbl.print ", id: :bigserial"
123
- elsif pkcol.sql_type == 'uuid'
124
- tbl.print ", id: :uuid"
125
- tbl.print %Q(, default: #{pkcol.default_function.inspect})
128
+
129
+ case pk
130
+ when String
131
+ tbl.print ", primary_key: #{pk.inspect}" unless pk == "id"
132
+ pkcol = columns.detect { |c| c.name == pk }
133
+ pkcolspec = column_spec_for_primary_key(pkcol)
134
+ unless pkcolspec.empty?
135
+ if pkcolspec != pkcolspec.slice(:id, :default)
136
+ pkcolspec = { id: { type: pkcolspec.delete(:id), **pkcolspec }.compact }
137
+ end
138
+ tbl.print ", #{format_colspec(pkcolspec)}"
126
139
  end
140
+ when Array
141
+ tbl.print ", primary_key: #{pk.inspect}"
127
142
  else
128
143
  tbl.print ", id: false"
129
144
  end
130
- tbl.print ", force: :cascade"
131
- tbl.puts " do |t|"
145
+
146
+ table_options = @connection.table_options(table)
147
+ if table_options.present?
148
+ tbl.print ", #{format_options(table_options)}"
149
+ end
150
+
151
+ tbl.puts ", force: :cascade do |t|"
132
152
 
133
153
  # then dump all non-primary key columns
134
- column_specs = columns.map do |column|
154
+ columns.each do |column|
135
155
  raise StandardError, "Unknown type '#{column.sql_type}' for column '#{column.name}'" unless @connection.valid_type?(column.type)
136
156
  next if column.name == pk
137
- @connection.column_spec(column, @types)
138
- end.compact
139
-
140
- # find all migration keys used in this table
141
- keys = @connection.migration_keys
142
-
143
- # figure out the lengths for each column based on above keys
144
- lengths = keys.map { |key|
145
- column_specs.map { |spec|
146
- spec[key] ? spec[key].length + 2 : 0
147
- }.max
148
- }
149
-
150
- # the string we're going to sprintf our values against, with standardized column widths
151
- format_string = lengths.map{ |len| "%-#{len}s" }
152
-
153
- # find the max length for the 'type' column, which is special
154
- type_length = column_specs.map{ |column| column[:type].length }.max
155
-
156
- # add column type definition to our format string
157
- format_string.unshift " t.%-#{type_length}s "
158
-
159
- format_string *= ''
160
-
161
- column_specs.each do |colspec|
162
- values = keys.zip(lengths).map{ |key, len| colspec.key?(key) ? colspec[key] + ", " : " " * len }
163
- values.unshift colspec[:type]
164
- tbl.print((format_string % values).gsub(/,\s*$/, ''))
157
+ type, colspec = column_spec(column)
158
+ if type.is_a?(Symbol)
159
+ tbl.print " t.#{type} #{column.name.inspect}"
160
+ else
161
+ tbl.print " t.column #{column.name.inspect}, #{type.inspect}"
162
+ end
163
+ tbl.print ", #{format_colspec(colspec)}" if colspec.present?
165
164
  tbl.puts
166
165
  end
167
166
 
167
+ indexes_in_create(table, tbl)
168
+ check_constraints_in_create(table, tbl) if @connection.supports_check_constraints?
169
+
168
170
  tbl.puts " end"
169
171
  tbl.puts
170
172
 
171
- indexes(table, tbl)
172
-
173
173
  tbl.rewind
174
174
  stream.print tbl.read
175
175
  rescue => e
176
176
  stream.puts "# Could not dump table #{table.inspect} because of following #{e.class}"
177
177
  stream.puts "# #{e.message}"
178
178
  stream.puts
179
+ ensure
180
+ self.table_name = nil
179
181
  end
180
-
181
- stream
182
182
  end
183
183
 
184
+ # Keep it for indexing materialized views
184
185
  def indexes(table, stream)
185
186
  if (indexes = @connection.indexes(table)).any?
186
187
  add_index_statements = indexes.map do |index|
187
- statement_parts = [
188
- "add_index #{remove_prefix_and_suffix(index.table).inspect}",
189
- index.columns.inspect,
190
- "name: #{index.name.inspect}",
191
- ]
192
- statement_parts << 'unique: true' if index.unique
188
+ table_name = remove_prefix_and_suffix(index.table).inspect
189
+ " add_index #{([table_name] + index_parts(index)).join(', ')}"
190
+ end
193
191
 
194
- index_lengths = (index.lengths || []).compact
195
- statement_parts << "length: #{Hash[index.columns.zip(index.lengths)].inspect}" if index_lengths.any?
192
+ stream.puts add_index_statements.sort.join("\n")
193
+ stream.puts
194
+ end
195
+ end
196
196
 
197
- index_orders = index.orders || {}
198
- statement_parts << "order: #{index.orders.inspect}" if index_orders.any?
199
- statement_parts << "where: #{index.where.inspect}" if index.where
200
- statement_parts << "using: #{index.using.inspect}" if index.using
201
- statement_parts << "type: #{index.type.inspect}" if index.type
197
+ def indexes_in_create(table, stream)
198
+ if (indexes = @connection.indexes(table)).any?
199
+ index_statements = indexes.map do |index|
200
+ " t.index #{index_parts(index).join(', ')}"
201
+ end
202
+ stream.puts index_statements.sort.join("\n")
203
+ end
204
+ end
205
+
206
+ def index_parts(index)
207
+ index_parts = [
208
+ index.columns.inspect,
209
+ "name: #{index.name.inspect}",
210
+ ]
211
+ index_parts << "unique: true" if index.unique
212
+ index_parts << "length: #{format_index_parts(index.lengths)}" if index.lengths.present?
213
+ index_parts << "order: #{format_index_parts(index.orders)}" if index.orders.present?
214
+ index_parts << "opclass: #{format_index_parts(index.opclasses)}" if index.opclasses.present?
215
+ index_parts << "where: #{index.where.inspect}" if index.where
216
+ index_parts << "using: #{index.using.inspect}" if !@connection.default_index_type?(index)
217
+ index_parts << "type: #{index.type.inspect}" if index.type
218
+ index_parts << "comment: #{index.comment.inspect}" if index.comment
219
+ index_parts
220
+ end
202
221
 
203
- " #{statement_parts.join(', ')}"
222
+ def check_constraints_in_create(table, stream)
223
+ if (check_constraints = @connection.check_constraints(table)).any?
224
+ add_check_constraint_statements = check_constraints.map do |check_constraint|
225
+ parts = [
226
+ "t.check_constraint #{check_constraint.expression.inspect}"
227
+ ]
228
+
229
+ if check_constraint.export_name_on_schema_dump?
230
+ parts << "name: #{check_constraint.name.inspect}"
231
+ end
232
+
233
+ " #{parts.join(', ')}"
204
234
  end
205
235
 
206
- stream.puts add_index_statements.sort.join("\n")
207
- stream.puts
236
+ stream.puts add_check_constraint_statements.sort.join("\n")
208
237
  end
209
238
  end
210
239
 
@@ -224,7 +253,7 @@ HEADER
224
253
  parts << "primary_key: #{foreign_key.primary_key.inspect}"
225
254
  end
226
255
 
227
- if foreign_key.name !~ /^fk_rails_[0-9a-f]{10}$/
256
+ if foreign_key.export_name_on_schema_dump?
228
257
  parts << "name: #{foreign_key.name.inspect}"
229
258
  end
230
259
 
@@ -238,12 +267,32 @@ HEADER
238
267
  end
239
268
  end
240
269
 
270
+ def format_colspec(colspec)
271
+ colspec.map do |key, value|
272
+ "#{key}: #{ value.is_a?(Hash) ? "{ #{format_colspec(value)} }" : value }"
273
+ end.join(", ")
274
+ end
275
+
276
+ def format_options(options)
277
+ options.map { |key, value| "#{key}: #{value.inspect}" }.join(", ")
278
+ end
279
+
280
+ def format_index_parts(options)
281
+ if options.is_a?(Hash)
282
+ "{ #{format_options(options)} }"
283
+ else
284
+ options.inspect
285
+ end
286
+ end
287
+
241
288
  def remove_prefix_and_suffix(table)
242
- table.gsub(/^(#{@options[:table_name_prefix]})(.+)(#{@options[:table_name_suffix]})$/, "\\2")
289
+ prefix = Regexp.escape(@options[:table_name_prefix].to_s)
290
+ suffix = Regexp.escape(@options[:table_name_suffix].to_s)
291
+ table.sub(/\A#{prefix}(.+)#{suffix}\z/, "\\1")
243
292
  end
244
293
 
245
294
  def ignored?(table_name)
246
- ['schema_migrations', ignore_tables].flatten.any? do |ignored|
295
+ [ActiveRecord::Base.schema_migrations_table_name, ActiveRecord::Base.internal_metadata_table_name, ignore_tables].flatten.any? do |ignored|
247
296
  ignored === remove_prefix_and_suffix(table_name)
248
297
  end
249
298
  end
@@ -1,40 +1,37 @@
1
- require 'active_record/scoping/default'
2
- require 'active_record/scoping/named'
3
- require 'active_record/base'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/scoping/default"
4
+ require "active_record/scoping/named"
4
5
 
5
6
  module ActiveRecord
6
- class SchemaMigration < ActiveRecord::Base
7
+ # This class is used to create a table that keeps track of which migrations
8
+ # have been applied to a given database. When a migration is run, its schema
9
+ # number is inserted in to the `SchemaMigration.table_name` so it doesn't need
10
+ # to be executed the next time.
11
+ class SchemaMigration < ActiveRecord::Base # :nodoc:
7
12
  class << self
8
- def primary_key
9
- nil
10
- end
11
-
12
- def table_name
13
- "#{table_name_prefix}#{ActiveRecord::Base.schema_migrations_table_name}#{table_name_suffix}"
13
+ def _internal?
14
+ true
14
15
  end
15
16
 
16
- def index_name
17
- "#{table_name_prefix}unique_#{ActiveRecord::Base.schema_migrations_table_name}#{table_name_suffix}"
17
+ def primary_key
18
+ "version"
18
19
  end
19
20
 
20
- def table_exists?
21
- connection.table_exists?(table_name)
21
+ def table_name
22
+ "#{table_name_prefix}#{schema_migrations_table_name}#{table_name_suffix}"
22
23
  end
23
24
 
24
- def create_table(limit=nil)
25
- unless table_exists?
26
- version_options = {null: false}
27
- version_options[:limit] = limit if limit
28
-
25
+ def create_table
26
+ unless connection.table_exists?(table_name)
29
27
  connection.create_table(table_name, id: false) do |t|
30
- t.column :version, :string, version_options
28
+ t.string :version, **connection.internal_string_options_for_primary_key
31
29
  end
32
- connection.add_index table_name, :version, unique: true, name: index_name
33
30
  end
34
31
  end
35
32
 
36
33
  def drop_table
37
- connection.drop_table table_name if table_exists?
34
+ connection.drop_table table_name, if_exists: true
38
35
  end
39
36
 
40
37
  def normalize_migration_number(number)
@@ -42,7 +39,11 @@ module ActiveRecord
42
39
  end
43
40
 
44
41
  def normalized_versions
45
- 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)
46
47
  end
47
48
  end
48
49
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Scoping
3
5
  module Default
@@ -5,9 +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
-
10
- self.default_scopes = []
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
11
12
  end
12
13
 
13
14
  module ClassMethods
@@ -15,7 +16,7 @@ module ActiveRecord
15
16
  #
16
17
  # class Post < ActiveRecord::Base
17
18
  # def self.default_scope
18
- # where published: true
19
+ # where(published: true)
19
20
  # end
20
21
  # end
21
22
  #
@@ -33,102 +34,114 @@ module ActiveRecord
33
34
  block_given? ? relation.scoping { yield } : relation
34
35
  end
35
36
 
37
+ # Are there attributes associated with this scope?
38
+ def scope_attributes? # :nodoc:
39
+ super || default_scopes.any? || respond_to?(:default_scope)
40
+ end
41
+
36
42
  def before_remove_const #:nodoc:
37
43
  self.current_scope = nil
38
44
  end
39
45
 
40
- protected
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?
41
90
 
42
- # Use this macro in your model to set a default scope for all operations on
43
- # the model.
44
- #
45
- # class Article < ActiveRecord::Base
46
- # default_scope { where(published: true) }
47
- # end
48
- #
49
- # Article.all # => SELECT * FROM articles WHERE published = true
50
- #
51
- # The +default_scope+ is also applied while creating/building a record.
52
- # It is not applied while updating a record.
53
- #
54
- # Article.new.published # => true
55
- # Article.create.published # => true
56
- #
57
- # (You can also pass any object which responds to +call+ to the
58
- # +default_scope+ macro, and it will be called when building the
59
- # default scope.)
60
- #
61
- # If you use multiple +default_scope+ declarations in your model then
62
- # they will be merged together:
63
- #
64
- # class Article < ActiveRecord::Base
65
- # default_scope { where(published: true) }
66
- # default_scope { where(rating: 'G') }
67
- # end
68
- #
69
- # Article.all # => SELECT * FROM articles WHERE published = true AND rating = 'G'
70
- #
71
- # This is also the case with inheritance and module includes where the
72
- # parent or module defines a +default_scope+ and the child or including
73
- # class defines a second one.
74
- #
75
- # If you need to do more complex things with a default scope, you can
76
- # alternatively define it as a class method:
77
- #
78
- # class Article < ActiveRecord::Base
79
- # def self.default_scope
80
- # # Should return a scope, you can call 'super' here etc.
81
- # end
82
- # end
83
- def default_scope(scope = nil)
84
- scope = Proc.new if block_given?
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
85
98
 
86
- if scope.is_a?(Relation) || !scope.respond_to?(:call)
87
- raise ArgumentError,
88
- "Support for calling #default_scope without a block is removed. For example instead " \
89
- "of `default_scope where(color: 'red')`, please use " \
90
- "`default_scope { where(color: 'red') }`. (Alternatively you can just redefine " \
91
- "self.default_scope.)"
99
+ self.default_scopes += [scope]
92
100
  end
93
101
 
94
- self.default_scopes += [scope]
95
- end
102
+ def build_default_scope(relation = relation())
103
+ return if abstract_class?
104
+
105
+ if default_scope_override.nil?
106
+ self.default_scope_override = !Base.is_a?(method(:default_scope).owner)
107
+ end
96
108
 
97
- def build_default_scope(base_rel = relation) # :nodoc:
98
- return if abstract_class?
99
- if !Base.is_a?(method(:default_scope).owner)
100
- # The user has defined their own default scope method, so call that
101
- evaluate_default_scope { default_scope }
102
- elsif default_scopes.any?
103
- evaluate_default_scope do
104
- default_scopes.inject(base_rel) do |default_scope, scope|
105
- default_scope.merge(base_rel.scoping { scope.call })
109
+ if default_scope_override
110
+ # The user has defined their own default scope method, so call that
111
+ evaluate_default_scope do
112
+ relation.scoping { default_scope }
113
+ end
114
+ elsif default_scopes.any?
115
+ evaluate_default_scope do
116
+ default_scopes.inject(relation) do |default_scope, scope|
117
+ scope = scope.respond_to?(:to_proc) ? scope : scope.method(:call)
118
+ default_scope.instance_exec(&scope) || default_scope
119
+ end
106
120
  end
107
121
  end
108
122
  end
109
- end
110
123
 
111
- def ignore_default_scope? # :nodoc:
112
- ScopeRegistry.value_for(:ignore_default_scope, self)
113
- end
124
+ def ignore_default_scope?
125
+ ScopeRegistry.value_for(:ignore_default_scope, base_class)
126
+ end
114
127
 
115
- def ignore_default_scope=(ignore) # :nodoc:
116
- ScopeRegistry.set_value_for(:ignore_default_scope, self, ignore)
117
- end
128
+ def ignore_default_scope=(ignore)
129
+ ScopeRegistry.set_value_for(:ignore_default_scope, base_class, ignore)
130
+ end
118
131
 
119
- # The ignore_default_scope flag is used to prevent an infinite recursion
120
- # situation where a default scope references a scope which has a default
121
- # scope which references a scope...
122
- def evaluate_default_scope # :nodoc:
123
- return if ignore_default_scope?
132
+ # The ignore_default_scope flag is used to prevent an infinite recursion
133
+ # situation where a default scope references a scope which has a default
134
+ # scope which references a scope...
135
+ def evaluate_default_scope
136
+ return if ignore_default_scope?
124
137
 
125
- begin
126
- self.ignore_default_scope = true
127
- yield
128
- ensure
129
- self.ignore_default_scope = false
138
+ begin
139
+ self.ignore_default_scope = true
140
+ yield
141
+ ensure
142
+ self.ignore_default_scope = false
143
+ end
130
144
  end
131
- end
132
145
  end
133
146
  end
134
147
  end