activerecord 4.2.0 → 6.0.5.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 (373) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +852 -801
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +14 -13
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +267 -249
  9. data/lib/active_record/association_relation.rb +26 -6
  10. data/lib/active_record/associations/alias_tracker.rb +29 -36
  11. data/lib/active_record/associations/association.rb +137 -55
  12. data/lib/active_record/associations/association_scope.rb +110 -132
  13. data/lib/active_record/associations/belongs_to_association.rb +67 -54
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +27 -40
  16. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  17. data/lib/active_record/associations/builder/collection_association.rb +10 -29
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +58 -70
  19. data/lib/active_record/associations/builder/has_many.rb +8 -4
  20. data/lib/active_record/associations/builder/has_one.rb +46 -5
  21. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  22. data/lib/active_record/associations/collection_association.rb +150 -275
  23. data/lib/active_record/associations/collection_proxy.rb +253 -152
  24. data/lib/active_record/associations/foreign_association.rb +20 -0
  25. data/lib/active_record/associations/has_many_association.rb +35 -84
  26. data/lib/active_record/associations/has_many_through_association.rb +62 -80
  27. data/lib/active_record/associations/has_one_association.rb +62 -49
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +43 -78
  30. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  31. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  32. data/lib/active_record/associations/join_dependency.rb +159 -162
  33. data/lib/active_record/associations/preloader/association.rb +102 -113
  34. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  35. data/lib/active_record/associations/preloader.rb +96 -95
  36. data/lib/active_record/associations/singular_association.rb +18 -45
  37. data/lib/active_record/associations/through_association.rb +49 -24
  38. data/lib/active_record/associations.rb +1737 -1596
  39. data/lib/active_record/attribute_assignment.rb +57 -185
  40. data/lib/active_record/attribute_decorators.rb +39 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +14 -5
  42. data/lib/active_record/attribute_methods/dirty.rb +174 -134
  43. data/lib/active_record/attribute_methods/primary_key.rb +90 -84
  44. data/lib/active_record/attribute_methods/query.rb +6 -5
  45. data/lib/active_record/attribute_methods/read.rb +20 -77
  46. data/lib/active_record/attribute_methods/serialization.rb +40 -21
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -37
  48. data/lib/active_record/attribute_methods/write.rb +33 -56
  49. data/lib/active_record/attribute_methods.rb +124 -143
  50. data/lib/active_record/attributes.rb +213 -74
  51. data/lib/active_record/autosave_association.rb +125 -54
  52. data/lib/active_record/base.rb +60 -49
  53. data/lib/active_record/callbacks.rb +101 -76
  54. data/lib/active_record/coders/json.rb +3 -1
  55. data/lib/active_record/coders/yaml_column.rb +36 -13
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +810 -291
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +253 -108
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +171 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +6 -4
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +383 -239
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +736 -235
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -87
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +487 -192
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +536 -600
  69. data/lib/active_record/connection_adapters/column.rb +56 -43
  70. data/lib/active_record/connection_adapters/connection_specification.rb +174 -153
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +196 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +71 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +59 -196
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +71 -115
  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 -57
  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 +5 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  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 +17 -13
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +6 -3
  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/jsonb.rb +3 -11
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  99. data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +70 -34
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +67 -51
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -5
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +465 -291
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +565 -363
  117. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +299 -364
  127. data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
  128. data/lib/active_record/connection_handling.rb +167 -41
  129. data/lib/active_record/core.rb +277 -233
  130. data/lib/active_record/counter_cache.rb +71 -50
  131. data/lib/active_record/database_configurations/database_config.rb +37 -0
  132. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  133. data/lib/active_record/database_configurations/url_config.rb +78 -0
  134. data/lib/active_record/database_configurations.rb +233 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -106
  137. data/lib/active_record/enum.rb +172 -89
  138. data/lib/active_record/errors.rb +189 -53
  139. data/lib/active_record/explain.rb +22 -11
  140. data/lib/active_record/explain_registry.rb +4 -2
  141. data/lib/active_record/explain_subscriber.rb +11 -6
  142. data/lib/active_record/fixture_set/file.rb +35 -9
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +152 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  147. data/lib/active_record/fixtures.rb +225 -497
  148. data/lib/active_record/gem_version.rb +6 -4
  149. data/lib/active_record/inheritance.rb +158 -115
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +123 -29
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +99 -98
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +76 -33
  158. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  160. data/lib/active_record/middleware/database_selector.rb +74 -0
  161. data/lib/active_record/migration/command_recorder.rb +166 -91
  162. data/lib/active_record/migration/compatibility.rb +244 -0
  163. data/lib/active_record/migration/join_table.rb +8 -7
  164. data/lib/active_record/migration.rb +636 -290
  165. data/lib/active_record/model_schema.rb +344 -112
  166. data/lib/active_record/nested_attributes.rb +265 -215
  167. data/lib/active_record/no_touching.rb +15 -2
  168. data/lib/active_record/null_relation.rb +24 -38
  169. data/lib/active_record/persistence.rb +559 -125
  170. data/lib/active_record/query_cache.rb +19 -23
  171. data/lib/active_record/querying.rb +44 -30
  172. data/lib/active_record/railtie.rb +166 -47
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +2 -0
  175. data/lib/active_record/railties/controller_runtime.rb +34 -33
  176. data/lib/active_record/railties/databases.rake +341 -202
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +461 -302
  179. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  180. data/lib/active_record/relation/batches.rb +206 -55
  181. data/lib/active_record/relation/calculations.rb +270 -249
  182. data/lib/active_record/relation/delegation.rb +76 -84
  183. data/lib/active_record/relation/finder_methods.rb +287 -255
  184. data/lib/active_record/relation/from_clause.rb +30 -0
  185. data/lib/active_record/relation/merger.rb +86 -68
  186. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -25
  187. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  188. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  189. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  190. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  191. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  192. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  193. data/lib/active_record/relation/predicate_builder.rb +112 -92
  194. data/lib/active_record/relation/query_attribute.rb +50 -0
  195. data/lib/active_record/relation/query_methods.rb +612 -392
  196. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  197. data/lib/active_record/relation/spawn_methods.rb +18 -17
  198. data/lib/active_record/relation/where_clause.rb +189 -0
  199. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  200. data/lib/active_record/relation.rb +533 -340
  201. data/lib/active_record/result.rb +79 -43
  202. data/lib/active_record/runtime_registry.rb +6 -4
  203. data/lib/active_record/sanitization.rb +144 -121
  204. data/lib/active_record/schema.rb +21 -24
  205. data/lib/active_record/schema_dumper.rb +112 -93
  206. data/lib/active_record/schema_migration.rb +24 -20
  207. data/lib/active_record/scoping/default.rb +98 -82
  208. data/lib/active_record/scoping/named.rb +91 -33
  209. data/lib/active_record/scoping.rb +45 -27
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +5 -5
  212. data/lib/active_record/statement_cache.rb +73 -36
  213. data/lib/active_record/store.rb +127 -42
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +90 -0
  216. data/lib/active_record/tasks/database_tasks.rb +309 -99
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +58 -89
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +81 -31
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +37 -16
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +243 -0
  222. data/lib/active_record/timestamp.rb +86 -41
  223. data/lib/active_record/touch_later.rb +65 -0
  224. data/lib/active_record/transactions.rb +222 -146
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type/adapter_specific_registry.rb +126 -0
  227. data/lib/active_record/type/date.rb +4 -41
  228. data/lib/active_record/type/date_time.rb +4 -38
  229. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  230. data/lib/active_record/type/hash_lookup_type_map.rb +12 -5
  231. data/lib/active_record/type/internal/timezone.rb +17 -0
  232. data/lib/active_record/type/json.rb +30 -0
  233. data/lib/active_record/type/serialized.rb +29 -15
  234. data/lib/active_record/type/text.rb +2 -2
  235. data/lib/active_record/type/time.rb +21 -16
  236. data/lib/active_record/type/type_map.rb +16 -19
  237. data/lib/active_record/type/unsigned_integer.rb +9 -8
  238. data/lib/active_record/type.rb +77 -23
  239. data/lib/active_record/type_caster/connection.rb +34 -0
  240. data/lib/active_record/type_caster/map.rb +20 -0
  241. data/lib/active_record/type_caster.rb +9 -0
  242. data/lib/active_record/validations/absence.rb +25 -0
  243. data/lib/active_record/validations/associated.rb +12 -4
  244. data/lib/active_record/validations/length.rb +26 -0
  245. data/lib/active_record/validations/presence.rb +14 -13
  246. data/lib/active_record/validations/uniqueness.rb +43 -46
  247. data/lib/active_record/validations.rb +38 -35
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/active_record.rb +44 -21
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes/attribute.rb +37 -0
  252. data/lib/arel/attributes.rb +22 -0
  253. data/lib/arel/collectors/bind.rb +24 -0
  254. data/lib/arel/collectors/composite.rb +31 -0
  255. data/lib/arel/collectors/plain_string.rb +20 -0
  256. data/lib/arel/collectors/sql_string.rb +20 -0
  257. data/lib/arel/collectors/substitute_binds.rb +28 -0
  258. data/lib/arel/crud.rb +42 -0
  259. data/lib/arel/delete_manager.rb +18 -0
  260. data/lib/arel/errors.rb +9 -0
  261. data/lib/arel/expressions.rb +29 -0
  262. data/lib/arel/factory_methods.rb +49 -0
  263. data/lib/arel/insert_manager.rb +49 -0
  264. data/lib/arel/math.rb +45 -0
  265. data/lib/arel/nodes/and.rb +32 -0
  266. data/lib/arel/nodes/ascending.rb +23 -0
  267. data/lib/arel/nodes/binary.rb +52 -0
  268. data/lib/arel/nodes/bind_param.rb +36 -0
  269. data/lib/arel/nodes/case.rb +55 -0
  270. data/lib/arel/nodes/casted.rb +50 -0
  271. data/lib/arel/nodes/comment.rb +29 -0
  272. data/lib/arel/nodes/count.rb +12 -0
  273. data/lib/arel/nodes/delete_statement.rb +45 -0
  274. data/lib/arel/nodes/descending.rb +23 -0
  275. data/lib/arel/nodes/equality.rb +18 -0
  276. data/lib/arel/nodes/extract.rb +24 -0
  277. data/lib/arel/nodes/false.rb +16 -0
  278. data/lib/arel/nodes/full_outer_join.rb +8 -0
  279. data/lib/arel/nodes/function.rb +44 -0
  280. data/lib/arel/nodes/grouping.rb +8 -0
  281. data/lib/arel/nodes/in.rb +8 -0
  282. data/lib/arel/nodes/infix_operation.rb +80 -0
  283. data/lib/arel/nodes/inner_join.rb +8 -0
  284. data/lib/arel/nodes/insert_statement.rb +37 -0
  285. data/lib/arel/nodes/join_source.rb +20 -0
  286. data/lib/arel/nodes/matches.rb +18 -0
  287. data/lib/arel/nodes/named_function.rb +23 -0
  288. data/lib/arel/nodes/node.rb +50 -0
  289. data/lib/arel/nodes/node_expression.rb +13 -0
  290. data/lib/arel/nodes/outer_join.rb +8 -0
  291. data/lib/arel/nodes/over.rb +15 -0
  292. data/lib/arel/nodes/regexp.rb +16 -0
  293. data/lib/arel/nodes/right_outer_join.rb +8 -0
  294. data/lib/arel/nodes/select_core.rb +67 -0
  295. data/lib/arel/nodes/select_statement.rb +41 -0
  296. data/lib/arel/nodes/sql_literal.rb +16 -0
  297. data/lib/arel/nodes/string_join.rb +11 -0
  298. data/lib/arel/nodes/table_alias.rb +27 -0
  299. data/lib/arel/nodes/terminal.rb +16 -0
  300. data/lib/arel/nodes/true.rb +16 -0
  301. data/lib/arel/nodes/unary.rb +45 -0
  302. data/lib/arel/nodes/unary_operation.rb +20 -0
  303. data/lib/arel/nodes/unqualified_column.rb +22 -0
  304. data/lib/arel/nodes/update_statement.rb +41 -0
  305. data/lib/arel/nodes/values_list.rb +9 -0
  306. data/lib/arel/nodes/window.rb +126 -0
  307. data/lib/arel/nodes/with.rb +11 -0
  308. data/lib/arel/nodes.rb +68 -0
  309. data/lib/arel/order_predications.rb +13 -0
  310. data/lib/arel/predications.rb +256 -0
  311. data/lib/arel/select_manager.rb +271 -0
  312. data/lib/arel/table.rb +110 -0
  313. data/lib/arel/tree_manager.rb +72 -0
  314. data/lib/arel/update_manager.rb +34 -0
  315. data/lib/arel/visitors/depth_first.rb +203 -0
  316. data/lib/arel/visitors/dot.rb +296 -0
  317. data/lib/arel/visitors/ibm_db.rb +34 -0
  318. data/lib/arel/visitors/informix.rb +62 -0
  319. data/lib/arel/visitors/mssql.rb +156 -0
  320. data/lib/arel/visitors/mysql.rb +83 -0
  321. data/lib/arel/visitors/oracle.rb +158 -0
  322. data/lib/arel/visitors/oracle12.rb +65 -0
  323. data/lib/arel/visitors/postgresql.rb +109 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +888 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/visitors/where_sql.rb +22 -0
  328. data/lib/arel/visitors.rb +20 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/arel.rb +62 -0
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
  334. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  335. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -8
  336. data/lib/rails/generators/active_record/migration.rb +30 -1
  337. data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record.rb +7 -5
  340. metadata +174 -63
  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 -149
  349. data/lib/active_record/attribute_set/builder.rb +0 -86
  350. data/lib/active_record/attribute_set.rb +0 -77
  351. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
  352. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  353. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  354. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  355. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  356. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  359. data/lib/active_record/type/big_integer.rb +0 -13
  360. data/lib/active_record/type/binary.rb +0 -50
  361. data/lib/active_record/type/boolean.rb +0 -30
  362. data/lib/active_record/type/decimal.rb +0 -40
  363. data/lib/active_record/type/decorator.rb +0 -14
  364. data/lib/active_record/type/float.rb +0 -19
  365. data/lib/active_record/type/integer.rb +0 -55
  366. data/lib/active_record/type/mutable.rb +0 -16
  367. data/lib/active_record/type/numeric.rb +0 -36
  368. data/lib/active_record/type/string.rb +0 -36
  369. data/lib/active_record/type/time_value.rb +0 -38
  370. data/lib/active_record/type/value.rb +0 -101
  371. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -22
  372. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
  373. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  # = Active Record Autosave Association
3
5
  #
4
- # +AutosaveAssociation+ is a module that takes care of automatically saving
6
+ # AutosaveAssociation is a module that takes care of automatically saving
5
7
  # associated records when their parent is saved. In addition to saving, it
6
8
  # also destroys any associated records that were marked for destruction.
7
- # (See +mark_for_destruction+ and <tt>marked_for_destruction?</tt>).
9
+ # (See #mark_for_destruction and #marked_for_destruction?).
8
10
  #
9
11
  # Saving of the parent, its associations, and the destruction of marked
10
12
  # associations, all happen inside a transaction. This should never leave the
@@ -22,12 +24,12 @@ module ActiveRecord
22
24
  #
23
25
  # == Validation
24
26
  #
25
- # Children records are validated unless <tt>:validate</tt> is +false+.
27
+ # Child records are validated unless <tt>:validate</tt> is +false+.
26
28
  #
27
29
  # == Callbacks
28
30
  #
29
31
  # Association with autosave option defines several callbacks on your
30
- # model (before_save, after_create, after_update). Please note that
32
+ # model (around_save, before_save, after_create, after_update). Please note that
31
33
  # callbacks are executed in the order they were defined in
32
34
  # model. You should avoid modifying the association content, before
33
35
  # autosave callbacks are executed. Placing your callbacks after
@@ -125,7 +127,6 @@ module ActiveRecord
125
127
  # Now it _is_ removed from the database:
126
128
  #
127
129
  # Comment.find_by(id: id).nil? # => true
128
-
129
130
  module AutosaveAssociation
130
131
  extend ActiveSupport::Concern
131
132
 
@@ -141,22 +142,22 @@ module ActiveRecord
141
142
 
142
143
  included do
143
144
  Associations::Builder::Association.extensions << AssociationBuilderExtension
145
+ mattr_accessor :index_nested_attribute_errors, instance_writer: false, default: false
144
146
  end
145
147
 
146
- module ClassMethods
148
+ module ClassMethods # :nodoc:
147
149
  private
148
-
149
150
  def define_non_cyclic_method(name, &block)
150
- return if method_defined?(name)
151
+ return if instance_methods(false).include?(name)
151
152
  define_method(name) do |*args|
152
153
  result = true; @_already_called ||= {}
153
154
  # Loop prevention for validation of associations
154
155
  unless @_already_called[name]
155
156
  begin
156
- @_already_called[name]=true
157
+ @_already_called[name] = true
157
158
  result = instance_eval(&block)
158
159
  ensure
159
- @_already_called[name]=false
160
+ @_already_called[name] = false
160
161
  end
161
162
  end
162
163
 
@@ -177,11 +178,9 @@ module ActiveRecord
177
178
  # before actually defining them.
178
179
  def add_autosave_association_callbacks(reflection)
179
180
  save_method = :"autosave_associated_records_for_#{reflection.name}"
180
- validation_method = :"validate_associated_records_for_#{reflection.name}"
181
- collection = reflection.collection?
182
181
 
183
- if collection
184
- before_save :before_save_collection_association
182
+ if reflection.collection?
183
+ around_save :around_save_collection_association
185
184
 
186
185
  define_non_cyclic_method(save_method) { save_collection_association(reflection) }
187
186
  # Doesn't use after_save as that would save associations added in after_create/after_update twice
@@ -200,14 +199,25 @@ module ActiveRecord
200
199
  after_create save_method
201
200
  after_update save_method
202
201
  else
203
- define_non_cyclic_method(save_method) { save_belongs_to_association(reflection) }
202
+ define_non_cyclic_method(save_method) { throw(:abort) if save_belongs_to_association(reflection) == false }
204
203
  before_save save_method
205
204
  end
206
205
 
206
+ define_autosave_validation_callbacks(reflection)
207
+ end
208
+
209
+ def define_autosave_validation_callbacks(reflection)
210
+ validation_method = :"validate_associated_records_for_#{reflection.name}"
207
211
  if reflection.validate? && !method_defined?(validation_method)
208
- method = (collection ? :validate_collection_association : :validate_single_association)
212
+ if reflection.collection?
213
+ method = :validate_collection_association
214
+ else
215
+ method = :validate_single_association
216
+ end
217
+
209
218
  define_non_cyclic_method(validation_method) { send(method, reflection) }
210
219
  validate validation_method
220
+ after_validation :_ensure_no_duplicate_errors
211
221
  end
212
222
  end
213
223
  end
@@ -219,7 +229,7 @@ module ActiveRecord
219
229
  super
220
230
  end
221
231
 
222
- # Marks this record to be destroyed as part of the parents save transaction.
232
+ # Marks this record to be destroyed as part of the parent's save transaction.
223
233
  # This does _not_ actually destroy the record instantly, rather child record will be destroyed
224
234
  # when <tt>parent.save</tt> is called.
225
235
  #
@@ -228,7 +238,7 @@ module ActiveRecord
228
238
  @marked_for_destruction = true
229
239
  end
230
240
 
231
- # Returns whether or not this record will be destroyed as part of the parents save transaction.
241
+ # Returns whether or not this record will be destroyed as part of the parent's save transaction.
232
242
  #
233
243
  # Only useful if the <tt>:autosave</tt> option on the parent is enabled for this associated model.
234
244
  def marked_for_destruction?
@@ -251,32 +261,38 @@ module ActiveRecord
251
261
  # Returns whether or not this record has been changed in any way (including whether
252
262
  # any of its nested autosave associations are likewise changed)
253
263
  def changed_for_autosave?
254
- new_record? || changed? || marked_for_destruction? || nested_records_changed_for_autosave?
264
+ new_record? || has_changes_to_save? || marked_for_destruction? || nested_records_changed_for_autosave?
255
265
  end
256
266
 
257
267
  private
258
-
259
268
  # Returns the record for an association collection that should be validated
260
269
  # or saved. If +autosave+ is +false+ only new records will be returned,
261
270
  # unless the parent is/was a new record itself.
262
271
  def associated_records_to_validate_or_save(association, new_record, autosave)
263
- if new_record
272
+ if new_record || custom_validation_context?
264
273
  association && association.target
265
274
  elsif autosave
266
- association.target.find_all { |record| record.changed_for_autosave? }
275
+ association.target.find_all(&:changed_for_autosave?)
267
276
  else
268
- association.target.find_all { |record| record.new_record? }
277
+ association.target.find_all(&:new_record?)
269
278
  end
270
279
  end
271
280
 
272
281
  # go through nested autosave associations that are loaded in memory (without loading
273
282
  # any new ones), and return true if is changed for autosave
274
283
  def nested_records_changed_for_autosave?
275
- self.class._reflections.values.any? do |reflection|
276
- if reflection.options[:autosave]
277
- association = association_instance_get(reflection.name)
278
- association && Array.wrap(association.target).any? { |a| a.changed_for_autosave? }
284
+ @_nested_records_changed_for_autosave_already_called ||= false
285
+ return false if @_nested_records_changed_for_autosave_already_called
286
+ begin
287
+ @_nested_records_changed_for_autosave_already_called = true
288
+ self.class._reflections.values.any? do |reflection|
289
+ if reflection.options[:autosave]
290
+ association = association_instance_get(reflection.name)
291
+ association && Array.wrap(association.target).any?(&:changed_for_autosave?)
292
+ end
279
293
  end
294
+ ensure
295
+ @_nested_records_changed_for_autosave_already_called = false
280
296
  end
281
297
  end
282
298
 
@@ -285,7 +301,7 @@ module ActiveRecord
285
301
  def validate_single_association(reflection)
286
302
  association = association_instance_get(reflection.name)
287
303
  record = association && association.reader
288
- association_valid?(reflection, record) if record
304
+ association_valid?(reflection, record) if record && (record.changed_for_autosave? || custom_validation_context?)
289
305
  end
290
306
 
291
307
  # Validate the associated records if <tt>:validate</tt> or
@@ -294,7 +310,7 @@ module ActiveRecord
294
310
  def validate_collection_association(reflection)
295
311
  if association = association_instance_get(reflection.name)
296
312
  if records = associated_records_to_validate_or_save(association, new_record?, reflection.options[:autosave])
297
- records.each { |record| association_valid?(reflection, record) }
313
+ records.each_with_index { |record, index| association_valid?(reflection, record, index) }
298
314
  end
299
315
  end
300
316
  end
@@ -302,17 +318,30 @@ module ActiveRecord
302
318
  # Returns whether or not the association is valid and applies any errors to
303
319
  # the parent, <tt>self</tt>, if it wasn't. Skips any <tt>:autosave</tt>
304
320
  # enabled records if they're marked_for_destruction? or destroyed.
305
- def association_valid?(reflection, record)
306
- return true if record.destroyed? || record.marked_for_destruction?
321
+ def association_valid?(reflection, record, index = nil)
322
+ return true if record.destroyed? || (reflection.options[:autosave] && record.marked_for_destruction?)
323
+
324
+ context = validation_context if custom_validation_context?
307
325
 
308
- validation_context = self.validation_context unless [:create, :update].include?(self.validation_context)
309
- unless valid = record.valid?(validation_context)
326
+ unless valid = record.valid?(context)
310
327
  if reflection.options[:autosave]
328
+ indexed_attribute = !index.nil? && (reflection.options[:index_errors] || ActiveRecord::Base.index_nested_attribute_errors)
329
+
311
330
  record.errors.each do |attribute, message|
312
- attribute = "#{reflection.name}.#{attribute}"
331
+ attribute = normalize_reflection_attribute(indexed_attribute, reflection, index, attribute)
313
332
  errors[attribute] << message
314
333
  errors[attribute].uniq!
315
334
  end
335
+
336
+ record.errors.details.each_key do |attribute|
337
+ reflection_attribute =
338
+ normalize_reflection_attribute(indexed_attribute, reflection, index, attribute).to_sym
339
+
340
+ record.errors.details[attribute].each do |error|
341
+ errors.details[reflection_attribute] << error
342
+ errors.details[reflection_attribute].uniq!
343
+ end
344
+ end
316
345
  else
317
346
  errors.add(reflection.name)
318
347
  end
@@ -320,18 +349,30 @@ module ActiveRecord
320
349
  valid
321
350
  end
322
351
 
323
- # Is used as a before_save callback to check while saving a collection
352
+ def normalize_reflection_attribute(indexed_attribute, reflection, index, attribute)
353
+ if indexed_attribute
354
+ "#{reflection.name}[#{index}].#{attribute}"
355
+ else
356
+ "#{reflection.name}.#{attribute}"
357
+ end
358
+ end
359
+
360
+ # Is used as an around_save callback to check while saving a collection
324
361
  # association whether or not the parent was a new record before saving.
325
- def before_save_collection_association
326
- @new_record_before_save = new_record?
327
- true
362
+ def around_save_collection_association
363
+ previously_new_record_before_save = (@new_record_before_save ||= false)
364
+ @new_record_before_save = !previously_new_record_before_save && new_record?
365
+
366
+ yield
367
+ ensure
368
+ @new_record_before_save = previously_new_record_before_save
328
369
  end
329
370
 
330
371
  # Saves any new associated records, or all loaded autosave associations if
331
372
  # <tt>:autosave</tt> is enabled on the association.
332
373
  #
333
374
  # In addition, it destroys all children that were marked for destruction
334
- # with mark_for_destruction.
375
+ # with #mark_for_destruction.
335
376
  #
336
377
  # This all happens inside a transaction, _if_ the Transactions module is included into
337
378
  # ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
@@ -339,7 +380,14 @@ module ActiveRecord
339
380
  if association = association_instance_get(reflection.name)
340
381
  autosave = reflection.options[:autosave]
341
382
 
342
- if records = associated_records_to_validate_or_save(association, @new_record_before_save, autosave)
383
+ # By saving the instance variable in a local variable,
384
+ # we make the whole callback re-entrant.
385
+ new_record_before_save = @new_record_before_save
386
+
387
+ # reconstruct the scope now that we know the owner's id
388
+ association.reset_scope
389
+
390
+ if records = associated_records_to_validate_or_save(association, new_record_before_save, autosave)
343
391
  if autosave
344
392
  records_to_destroy = records.select(&:marked_for_destruction?)
345
393
  records_to_destroy.each { |record| association.destroy(record) }
@@ -351,22 +399,24 @@ module ActiveRecord
351
399
 
352
400
  saved = true
353
401
 
354
- if autosave != false && (@new_record_before_save || record.new_record?)
402
+ if autosave != false && (new_record_before_save || record.new_record?)
355
403
  if autosave
356
404
  saved = association.insert_record(record, false)
357
- else
358
- association.insert_record(record) unless reflection.nested?
405
+ elsif !reflection.nested?
406
+ association_saved = association.insert_record(record)
407
+
408
+ if reflection.validate?
409
+ errors.add(reflection.name) unless association_saved
410
+ saved = association_saved
411
+ end
359
412
  end
360
413
  elsif autosave
361
- saved = record.save(:validate => false)
414
+ saved = record.save(validate: false)
362
415
  end
363
416
 
364
- raise ActiveRecord::Rollback unless saved
417
+ raise(RecordInvalid.new(association.owner)) unless saved
365
418
  end
366
419
  end
367
-
368
- # reconstruct the scope now that we know the owner's id
369
- association.reset_scope if association.respond_to?(:reset_scope)
370
420
  end
371
421
  end
372
422
 
@@ -374,7 +424,7 @@ module ActiveRecord
374
424
  # on the association.
375
425
  #
376
426
  # In addition, it will destroy the association if it was marked for
377
- # destruction with mark_for_destruction.
427
+ # destruction with #mark_for_destruction.
378
428
  #
379
429
  # This all happens inside a transaction, _if_ the Transactions module is included into
380
430
  # ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
@@ -393,9 +443,12 @@ module ActiveRecord
393
443
  if (autosave && record.changed_for_autosave?) || new_record? || record_changed?(reflection, record, key)
394
444
  unless reflection.through_reflection
395
445
  record[reflection.foreign_key] = key
446
+ if inverse_reflection = reflection.inverse_of
447
+ record.association(inverse_reflection.name).inversed_from(self)
448
+ end
396
449
  end
397
450
 
398
- saved = record.save(:validate => !autosave)
451
+ saved = record.save(validate: !autosave)
399
452
  raise ActiveRecord::Rollback if !saved && autosave
400
453
  saved
401
454
  end
@@ -406,8 +459,14 @@ module ActiveRecord
406
459
  # If the record is new or it has changed, returns true.
407
460
  def record_changed?(reflection, record, key)
408
461
  record.new_record? ||
409
- (record.has_attribute?(reflection.foreign_key) && record[reflection.foreign_key] != key) ||
410
- record.attribute_changed?(reflection.foreign_key)
462
+ association_foreign_key_changed?(reflection, record, key) ||
463
+ record.will_save_change_to_attribute?(reflection.foreign_key)
464
+ end
465
+
466
+ def association_foreign_key_changed?(reflection, record, key)
467
+ return false if reflection.through_reflection?
468
+
469
+ record.has_attribute?(reflection.foreign_key) && record[reflection.foreign_key] != key
411
470
  end
412
471
 
413
472
  # Saves the associated record if it's new or <tt>:autosave</tt> is enabled.
@@ -415,7 +474,9 @@ module ActiveRecord
415
474
  # In addition, it will destroy the association if it was marked for destruction.
416
475
  def save_belongs_to_association(reflection)
417
476
  association = association_instance_get(reflection.name)
418
- record = association && association.load_target
477
+ return unless association && association.loaded? && !association.stale_target?
478
+
479
+ record = association.load_target
419
480
  if record && !record.destroyed?
420
481
  autosave = reflection.options[:autosave]
421
482
 
@@ -423,7 +484,7 @@ module ActiveRecord
423
484
  self[reflection.foreign_key] = nil
424
485
  record.destroy
425
486
  elsif autosave != false
426
- saved = record.save(:validate => !autosave) if record.new_record? || (autosave && record.changed_for_autosave?)
487
+ saved = record.save(validate: !autosave) if record.new_record? || (autosave && record.changed_for_autosave?)
427
488
 
428
489
  if association.updated?
429
490
  association_id = record.send(reflection.options[:primary_key] || :id)
@@ -435,5 +496,15 @@ module ActiveRecord
435
496
  end
436
497
  end
437
498
  end
499
+
500
+ def custom_validation_context?
501
+ validation_context && [:create, :update].exclude?(validation_context)
502
+ end
503
+
504
+ def _ensure_no_duplicate_errors
505
+ errors.messages.each_key do |attribute|
506
+ errors[attribute].uniq!
507
+ end
508
+ end
438
509
  end
439
510
  end
@@ -1,27 +1,28 @@
1
- require 'yaml'
2
- require 'set'
3
- require 'active_support/benchmarkable'
4
- require 'active_support/dependencies'
5
- require 'active_support/descendants_tracker'
6
- require 'active_support/time'
7
- require 'active_support/core_ext/module/attribute_accessors'
8
- require 'active_support/core_ext/class/delegating_attributes'
9
- require 'active_support/core_ext/array/extract_options'
10
- require 'active_support/core_ext/hash/deep_merge'
11
- require 'active_support/core_ext/hash/slice'
12
- require 'active_support/core_ext/hash/transform_values'
13
- require 'active_support/core_ext/string/behavior'
14
- require 'active_support/core_ext/kernel/singleton_class'
15
- require 'active_support/core_ext/module/introspection'
16
- require 'active_support/core_ext/object/duplicable'
17
- require 'active_support/core_ext/class/subclasses'
18
- require 'arel'
19
- require 'active_record/attribute_decorators'
20
- require 'active_record/errors'
21
- require 'active_record/log_subscriber'
22
- require 'active_record/explain_subscriber'
23
- require 'active_record/relation/delegation'
24
- require 'active_record/attributes'
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+ require "active_support/benchmarkable"
5
+ require "active_support/dependencies"
6
+ require "active_support/descendants_tracker"
7
+ require "active_support/time"
8
+ require "active_support/core_ext/module/attribute_accessors"
9
+ require "active_support/core_ext/array/extract_options"
10
+ require "active_support/core_ext/hash/deep_merge"
11
+ require "active_support/core_ext/hash/slice"
12
+ require "active_support/core_ext/string/behavior"
13
+ require "active_support/core_ext/kernel/singleton_class"
14
+ require "active_support/core_ext/module/introspection"
15
+ require "active_support/core_ext/object/duplicable"
16
+ require "active_support/core_ext/class/subclasses"
17
+ require "active_record/attribute_decorators"
18
+ require "active_record/define_callbacks"
19
+ require "active_record/errors"
20
+ require "active_record/log_subscriber"
21
+ require "active_record/explain_subscriber"
22
+ require "active_record/relation/delegation"
23
+ require "active_record/attributes"
24
+ require "active_record/type_caster"
25
+ require "active_record/database_configurations"
25
26
 
26
27
  module ActiveRecord #:nodoc:
27
28
  # = Active Record
@@ -119,29 +120,25 @@ module ActiveRecord #:nodoc:
119
120
  # All column values are automatically available through basic accessors on the Active Record
120
121
  # object, but sometimes you want to specialize this behavior. This can be done by overwriting
121
122
  # the default accessors (using the same name as the attribute) and calling
122
- # <tt>read_attribute(attr_name)</tt> and <tt>write_attribute(attr_name, value)</tt> to actually
123
- # change things.
123
+ # +super+ to actually change things.
124
124
  #
125
125
  # class Song < ActiveRecord::Base
126
126
  # # Uses an integer of seconds to hold the length of the song
127
127
  #
128
128
  # def length=(minutes)
129
- # write_attribute(:length, minutes.to_i * 60)
129
+ # super(minutes.to_i * 60)
130
130
  # end
131
131
  #
132
132
  # def length
133
- # read_attribute(:length) / 60
133
+ # super / 60
134
134
  # end
135
135
  # end
136
136
  #
137
- # You can alternatively use <tt>self[:attribute]=(value)</tt> and <tt>self[:attribute]</tt>
138
- # instead of <tt>write_attribute(:attribute, value)</tt> and <tt>read_attribute(:attribute)</tt>.
139
- #
140
137
  # == Attribute query methods
141
138
  #
142
139
  # In addition to the basic accessors, query methods are also automatically available on the Active Record object.
143
140
  # Query methods allow you to test whether an attribute value is present.
144
- # For numeric values, present is defined as non-zero.
141
+ # Additionally, when dealing with numeric values, a query method will return false if the value is zero.
145
142
  #
146
143
  # For example, an Active Record User with the <tt>name</tt> attribute has a <tt>name?</tt> method that you can call
147
144
  # to determine whether the user has a name:
@@ -172,10 +169,11 @@ module ActiveRecord #:nodoc:
172
169
  # <tt>Person.find_by_user_name(user_name)</tt>.
173
170
  #
174
171
  # It's possible to add an exclamation point (!) on the end of the dynamic finders to get them to raise an
175
- # <tt>ActiveRecord::RecordNotFound</tt> error if they do not return any records,
172
+ # ActiveRecord::RecordNotFound error if they do not return any records,
176
173
  # like <tt>Person.find_by_last_name!</tt>.
177
174
  #
178
- # It's also possible to use multiple attributes in the same find by separating them with "_and_".
175
+ # It's also possible to use multiple attributes in the same <tt>find_by_</tt> by separating them with
176
+ # "_and_".
179
177
  #
180
178
  # Person.find_by(user_name: user_name, password: password)
181
179
  # Person.find_by_user_name_and_password(user_name, password) # with dynamic finder
@@ -187,7 +185,8 @@ module ActiveRecord #:nodoc:
187
185
  # == Saving arrays, hashes, and other non-mappable objects in text columns
188
186
  #
189
187
  # Active Record can serialize any object in text columns using YAML. To do so, you must
190
- # specify this with a call to the class method +serialize+.
188
+ # specify this with a call to the class method
189
+ # {serialize}[rdoc-ref:AttributeMethods::Serialization::ClassMethods#serialize].
191
190
  # This makes it possible to store arrays, hashes, and other non-mappable objects without doing
192
191
  # any additional work.
193
192
  #
@@ -227,39 +226,47 @@ module ActiveRecord #:nodoc:
227
226
  #
228
227
  # == Connection to multiple databases in different models
229
228
  #
230
- # Connections are usually created through ActiveRecord::Base.establish_connection and retrieved
229
+ # Connections are usually created through
230
+ # {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection] and retrieved
231
231
  # by ActiveRecord::Base.connection. All classes inheriting from ActiveRecord::Base will use this
232
232
  # connection. But you can also set a class-specific connection. For example, if Course is an
233
233
  # ActiveRecord::Base, but resides in a different database, you can just say <tt>Course.establish_connection</tt>
234
234
  # and Course and all of its subclasses will use this connection instead.
235
235
  #
236
236
  # This feature is implemented by keeping a connection pool in ActiveRecord::Base that is
237
- # a Hash indexed by the class. If a connection is requested, the retrieve_connection method
237
+ # a hash indexed by the class. If a connection is requested, the
238
+ # {ActiveRecord::Base.retrieve_connection}[rdoc-ref:ConnectionHandling#retrieve_connection] method
238
239
  # will go up the class-hierarchy until a connection is found in the connection pool.
239
240
  #
240
241
  # == Exceptions
241
242
  #
242
243
  # * ActiveRecordError - Generic error class and superclass of all other errors raised by Active Record.
243
- # * AdapterNotSpecified - The configuration hash used in <tt>establish_connection</tt> didn't include an
244
- # <tt>:adapter</tt> key.
245
- # * AdapterNotFound - The <tt>:adapter</tt> key used in <tt>establish_connection</tt> specified a
246
- # non-existent adapter
244
+ # * AdapterNotSpecified - The configuration hash used in
245
+ # {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection]
246
+ # didn't include an <tt>:adapter</tt> key.
247
+ # * AdapterNotFound - The <tt>:adapter</tt> key used in
248
+ # {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection]
249
+ # specified a non-existent adapter
247
250
  # (or a bad spelling of an existing one).
248
251
  # * AssociationTypeMismatch - The object assigned to the association wasn't of the type
249
252
  # specified in the association definition.
250
253
  # * AttributeAssignmentError - An error occurred while doing a mass assignment through the
251
- # <tt>attributes=</tt> method.
254
+ # {ActiveRecord::Base#attributes=}[rdoc-ref:AttributeAssignment#attributes=] method.
252
255
  # You can inspect the +attribute+ property of the exception object to determine which attribute
253
256
  # triggered the error.
254
- # * ConnectionNotEstablished - No connection has been established. Use <tt>establish_connection</tt>
255
- # before querying.
257
+ # * ConnectionNotEstablished - No connection has been established.
258
+ # Use {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection] before querying.
256
259
  # * MultiparameterAssignmentErrors - Collection of errors that occurred during a mass assignment using the
257
- # <tt>attributes=</tt> method. The +errors+ property of this exception contains an array of
260
+ # {ActiveRecord::Base#attributes=}[rdoc-ref:AttributeAssignment#attributes=] method.
261
+ # The +errors+ property of this exception contains an array of
258
262
  # AttributeAssignmentError
259
263
  # objects that should be inspected to determine which attributes triggered the errors.
260
- # * RecordInvalid - raised by save! and create! when the record is invalid.
261
- # * RecordNotFound - No record responded to the +find+ method. Either the row with the given ID doesn't exist
262
- # or the row didn't meet the additional restrictions. Some +find+ calls do not raise this exception to signal
264
+ # * RecordInvalid - raised by {ActiveRecord::Base#save!}[rdoc-ref:Persistence#save!] and
265
+ # {ActiveRecord::Base.create!}[rdoc-ref:Persistence::ClassMethods#create!]
266
+ # when the record is invalid.
267
+ # * RecordNotFound - No record responded to the {ActiveRecord::Base.find}[rdoc-ref:FinderMethods#find] method.
268
+ # Either the row with the given ID doesn't exist or the row didn't meet the additional restrictions.
269
+ # Some {ActiveRecord::Base.find}[rdoc-ref:FinderMethods#find] calls do not raise this exception to signal
263
270
  # nothing was found, please check its documentation for further details.
264
271
  # * SerializationTypeMismatch - The serialized object wasn't of the class specified as the second parameter.
265
272
  # * StatementInvalid - The database server rejected the SQL statement. The precise error is added in the message.
@@ -281,6 +288,7 @@ module ActiveRecord #:nodoc:
281
288
  extend Explain
282
289
  extend Enum
283
290
  extend Delegation::DelegateCache
291
+ extend Aggregations::ClassMethods
284
292
 
285
293
  include Core
286
294
  include Persistence
@@ -298,6 +306,7 @@ module ActiveRecord #:nodoc:
298
306
  include AttributeDecorators
299
307
  include Locking::Optimistic
300
308
  include Locking::Pessimistic
309
+ include DefineCallbacks
301
310
  include AttributeMethods
302
311
  include Callbacks
303
312
  include Timestamp
@@ -305,12 +314,14 @@ module ActiveRecord #:nodoc:
305
314
  include ActiveModel::SecurePassword
306
315
  include AutosaveAssociation
307
316
  include NestedAttributes
308
- include Aggregations
309
317
  include Transactions
318
+ include TouchLater
310
319
  include NoTouching
311
320
  include Reflection
312
321
  include Serialization
313
322
  include Store
323
+ include SecureToken
324
+ include Suppressor
314
325
  end
315
326
 
316
327
  ActiveSupport.run_load_hooks(:active_record, Base)