activerecord 4.2.11.1 → 6.0.3.5

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 +4 -4
  2. data/CHANGELOG.md +721 -1522
  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 +266 -251
  9. data/lib/active_record/association_relation.rb +20 -13
  10. data/lib/active_record/associations/alias_tracker.rb +29 -36
  11. data/lib/active_record/associations/association.rb +128 -57
  12. data/lib/active_record/associations/association_scope.rb +103 -132
  13. data/lib/active_record/associations/belongs_to_association.rb +65 -60
  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 -33
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +50 -66
  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 +136 -288
  23. data/lib/active_record/associations/collection_proxy.rb +241 -147
  24. data/lib/active_record/associations/foreign_association.rb +10 -1
  25. data/lib/active_record/associations/has_many_association.rb +34 -98
  26. data/lib/active_record/associations/has_many_through_association.rb +60 -87
  27. data/lib/active_record/associations/has_one_association.rb +61 -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 +38 -86
  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 +149 -166
  33. data/lib/active_record/associations/preloader/association.rb +90 -123
  34. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  35. data/lib/active_record/associations/preloader.rb +90 -93
  36. data/lib/active_record/associations/singular_association.rb +18 -39
  37. data/lib/active_record/associations/through_association.rb +38 -18
  38. data/lib/active_record/associations.rb +1737 -1597
  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 +13 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +174 -144
  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 +57 -37
  48. data/lib/active_record/attribute_methods/write.rb +32 -55
  49. data/lib/active_record/attribute_methods.rb +120 -135
  50. data/lib/active_record/attributes.rb +213 -82
  51. data/lib/active_record/autosave_association.rb +97 -41
  52. data/lib/active_record/base.rb +57 -45
  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 +23 -12
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +804 -297
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +240 -115
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +371 -242
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +694 -256
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -83
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +473 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +507 -639
  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 +264 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +58 -181
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -114
  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 +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 +9 -22
  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/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 +51 -34
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  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 +462 -296
  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 +558 -356
  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 -349
  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 +252 -230
  130. data/lib/active_record/counter_cache.rb +70 -49
  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 +163 -86
  138. data/lib/active_record/errors.rb +188 -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 +10 -5
  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 +227 -501
  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 +21 -3
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +86 -96
  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 +623 -305
  165. data/lib/active_record/model_schema.rb +313 -112
  166. data/lib/active_record/nested_attributes.rb +263 -223
  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 +557 -126
  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 +143 -44
  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 +331 -185
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +430 -281
  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 +268 -254
  182. data/lib/active_record/relation/delegation.rb +75 -84
  183. data/lib/active_record/relation/finder_methods.rb +285 -241
  184. data/lib/active_record/relation/from_clause.rb +30 -0
  185. data/lib/active_record/relation/merger.rb +78 -88
  186. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
  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 +110 -119
  194. data/lib/active_record/relation/query_attribute.rb +50 -0
  195. data/lib/active_record/relation/query_methods.rb +603 -397
  196. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  197. data/lib/active_record/relation/spawn_methods.rb +11 -14
  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 +530 -341
  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 -17
  207. data/lib/active_record/scoping/default.rb +98 -83
  208. data/lib/active_record/scoping/named.rb +86 -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 +307 -100
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +55 -100
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +80 -41
  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 +225 -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 +223 -157
  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 -45
  228. data/lib/active_record/type/date_time.rb +4 -49
  229. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  230. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  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 +23 -15
  234. data/lib/active_record/type/text.rb +2 -2
  235. data/lib/active_record/type/time.rb +11 -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 +42 -55
  247. data/lib/active_record/validations.rb +38 -35
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/active_record.rb +42 -22
  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 -2
  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/model/templates/{module.rb → module.rb.tt} +0 -0
  340. data/lib/rails/generators/active_record.rb +7 -5
  341. metadata +168 -59
  342. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  343. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  344. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  345. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  346. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  347. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  348. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  349. data/lib/active_record/attribute.rb +0 -163
  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/mysql_adapter.rb +0 -498
  353. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  354. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  355. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  356. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  357. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  358. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  359. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  360. data/lib/active_record/type/big_integer.rb +0 -13
  361. data/lib/active_record/type/binary.rb +0 -50
  362. data/lib/active_record/type/boolean.rb +0 -31
  363. data/lib/active_record/type/decimal.rb +0 -64
  364. data/lib/active_record/type/decorator.rb +0 -14
  365. data/lib/active_record/type/float.rb +0 -19
  366. data/lib/active_record/type/integer.rb +0 -59
  367. data/lib/active_record/type/mutable.rb +0 -16
  368. data/lib/active_record/type/numeric.rb +0 -36
  369. data/lib/active_record/type/string.rb +0 -40
  370. data/lib/active_record/type/time_value.rb +0 -38
  371. data/lib/active_record/type/value.rb +0 -110
  372. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  373. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -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,7 +24,7 @@ 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
  #
@@ -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
 
@@ -180,6 +181,7 @@ module ActiveRecord
180
181
 
181
182
  if reflection.collection?
182
183
  before_save :before_save_collection_association
184
+ after_save :after_save_collection_association
183
185
 
184
186
  define_non_cyclic_method(save_method) { save_collection_association(reflection) }
185
187
  # Doesn't use after_save as that would save associations added in after_create/after_update twice
@@ -198,7 +200,7 @@ module ActiveRecord
198
200
  after_create save_method
199
201
  after_update save_method
200
202
  else
201
- define_non_cyclic_method(save_method) { save_belongs_to_association(reflection) }
203
+ define_non_cyclic_method(save_method) { throw(:abort) if save_belongs_to_association(reflection) == false }
202
204
  before_save save_method
203
205
  end
204
206
 
@@ -216,6 +218,7 @@ module ActiveRecord
216
218
 
217
219
  define_non_cyclic_method(validation_method) { send(method, reflection) }
218
220
  validate validation_method
221
+ after_validation :_ensure_no_duplicate_errors
219
222
  end
220
223
  end
221
224
  end
@@ -227,7 +230,7 @@ module ActiveRecord
227
230
  super
228
231
  end
229
232
 
230
- # Marks this record to be destroyed as part of the parents save transaction.
233
+ # Marks this record to be destroyed as part of the parent's save transaction.
231
234
  # This does _not_ actually destroy the record instantly, rather child record will be destroyed
232
235
  # when <tt>parent.save</tt> is called.
233
236
  #
@@ -236,7 +239,7 @@ module ActiveRecord
236
239
  @marked_for_destruction = true
237
240
  end
238
241
 
239
- # Returns whether or not this record will be destroyed as part of the parents save transaction.
242
+ # Returns whether or not this record will be destroyed as part of the parent's save transaction.
240
243
  #
241
244
  # Only useful if the <tt>:autosave</tt> option on the parent is enabled for this associated model.
242
245
  def marked_for_destruction?
@@ -259,21 +262,20 @@ module ActiveRecord
259
262
  # Returns whether or not this record has been changed in any way (including whether
260
263
  # any of its nested autosave associations are likewise changed)
261
264
  def changed_for_autosave?
262
- new_record? || changed? || marked_for_destruction? || nested_records_changed_for_autosave?
265
+ new_record? || has_changes_to_save? || marked_for_destruction? || nested_records_changed_for_autosave?
263
266
  end
264
267
 
265
268
  private
266
-
267
269
  # Returns the record for an association collection that should be validated
268
270
  # or saved. If +autosave+ is +false+ only new records will be returned,
269
271
  # unless the parent is/was a new record itself.
270
272
  def associated_records_to_validate_or_save(association, new_record, autosave)
271
- if new_record
273
+ if new_record || custom_validation_context?
272
274
  association && association.target
273
275
  elsif autosave
274
- association.target.find_all { |record| record.changed_for_autosave? }
276
+ association.target.find_all(&:changed_for_autosave?)
275
277
  else
276
- association.target.find_all { |record| record.new_record? }
278
+ association.target.find_all(&:new_record?)
277
279
  end
278
280
  end
279
281
 
@@ -300,7 +302,7 @@ module ActiveRecord
300
302
  def validate_single_association(reflection)
301
303
  association = association_instance_get(reflection.name)
302
304
  record = association && association.reader
303
- association_valid?(reflection, record) if record
305
+ association_valid?(reflection, record) if record && (record.changed_for_autosave? || custom_validation_context?)
304
306
  end
305
307
 
306
308
  # Validate the associated records if <tt>:validate</tt> or
@@ -309,7 +311,7 @@ module ActiveRecord
309
311
  def validate_collection_association(reflection)
310
312
  if association = association_instance_get(reflection.name)
311
313
  if records = associated_records_to_validate_or_save(association, new_record?, reflection.options[:autosave])
312
- records.each { |record| association_valid?(reflection, record) }
314
+ records.each_with_index { |record, index| association_valid?(reflection, record, index) }
313
315
  end
314
316
  end
315
317
  end
@@ -317,17 +319,30 @@ module ActiveRecord
317
319
  # Returns whether or not the association is valid and applies any errors to
318
320
  # the parent, <tt>self</tt>, if it wasn't. Skips any <tt>:autosave</tt>
319
321
  # enabled records if they're marked_for_destruction? or destroyed.
320
- def association_valid?(reflection, record)
322
+ def association_valid?(reflection, record, index = nil)
321
323
  return true if record.destroyed? || (reflection.options[:autosave] && record.marked_for_destruction?)
322
324
 
323
- validation_context = self.validation_context unless [:create, :update].include?(self.validation_context)
324
- unless valid = record.valid?(validation_context)
325
+ context = validation_context if custom_validation_context?
326
+
327
+ unless valid = record.valid?(context)
325
328
  if reflection.options[:autosave]
329
+ indexed_attribute = !index.nil? && (reflection.options[:index_errors] || ActiveRecord::Base.index_nested_attribute_errors)
330
+
326
331
  record.errors.each do |attribute, message|
327
- attribute = "#{reflection.name}.#{attribute}"
332
+ attribute = normalize_reflection_attribute(indexed_attribute, reflection, index, attribute)
328
333
  errors[attribute] << message
329
334
  errors[attribute].uniq!
330
335
  end
336
+
337
+ record.errors.details.each_key do |attribute|
338
+ reflection_attribute =
339
+ normalize_reflection_attribute(indexed_attribute, reflection, index, attribute).to_sym
340
+
341
+ record.errors.details[attribute].each do |error|
342
+ errors.details[reflection_attribute] << error
343
+ errors.details[reflection_attribute].uniq!
344
+ end
345
+ end
331
346
  else
332
347
  errors.add(reflection.name)
333
348
  end
@@ -335,18 +350,29 @@ module ActiveRecord
335
350
  valid
336
351
  end
337
352
 
353
+ def normalize_reflection_attribute(indexed_attribute, reflection, index, attribute)
354
+ if indexed_attribute
355
+ "#{reflection.name}[#{index}].#{attribute}"
356
+ else
357
+ "#{reflection.name}.#{attribute}"
358
+ end
359
+ end
360
+
338
361
  # Is used as a before_save callback to check while saving a collection
339
362
  # association whether or not the parent was a new record before saving.
340
363
  def before_save_collection_association
341
- @new_record_before_save = new_record?
342
- true
364
+ @new_record_before_save ||= new_record?
365
+ end
366
+
367
+ def after_save_collection_association
368
+ @new_record_before_save = false
343
369
  end
344
370
 
345
371
  # Saves any new associated records, or all loaded autosave associations if
346
372
  # <tt>:autosave</tt> is enabled on the association.
347
373
  #
348
374
  # In addition, it destroys all children that were marked for destruction
349
- # with mark_for_destruction.
375
+ # with #mark_for_destruction.
350
376
  #
351
377
  # This all happens inside a transaction, _if_ the Transactions module is included into
352
378
  # ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
@@ -354,7 +380,14 @@ module ActiveRecord
354
380
  if association = association_instance_get(reflection.name)
355
381
  autosave = reflection.options[:autosave]
356
382
 
357
- 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)
358
391
  if autosave
359
392
  records_to_destroy = records.select(&:marked_for_destruction?)
360
393
  records_to_destroy.each { |record| association.destroy(record) }
@@ -366,22 +399,24 @@ module ActiveRecord
366
399
 
367
400
  saved = true
368
401
 
369
- if autosave != false && (@new_record_before_save || record.new_record?)
402
+ if autosave != false && (new_record_before_save || record.new_record?)
370
403
  if autosave
371
404
  saved = association.insert_record(record, false)
372
- else
373
- 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
374
412
  end
375
413
  elsif autosave
376
- saved = record.save(:validate => false)
414
+ saved = record.save(validate: false)
377
415
  end
378
416
 
379
- raise ActiveRecord::Rollback unless saved
417
+ raise(RecordInvalid.new(association.owner)) unless saved
380
418
  end
381
419
  end
382
-
383
- # reconstruct the scope now that we know the owner's id
384
- association.reset_scope if association.respond_to?(:reset_scope)
385
420
  end
386
421
  end
387
422
 
@@ -389,7 +424,7 @@ module ActiveRecord
389
424
  # on the association.
390
425
  #
391
426
  # In addition, it will destroy the association if it was marked for
392
- # destruction with mark_for_destruction.
427
+ # destruction with #mark_for_destruction.
393
428
  #
394
429
  # This all happens inside a transaction, _if_ the Transactions module is included into
395
430
  # ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
@@ -408,9 +443,12 @@ module ActiveRecord
408
443
  if (autosave && record.changed_for_autosave?) || new_record? || record_changed?(reflection, record, key)
409
444
  unless reflection.through_reflection
410
445
  record[reflection.foreign_key] = key
446
+ if inverse_reflection = reflection.inverse_of
447
+ record.association(inverse_reflection.name).loaded!
448
+ end
411
449
  end
412
450
 
413
- saved = record.save(:validate => !autosave)
451
+ saved = record.save(validate: !autosave)
414
452
  raise ActiveRecord::Rollback if !saved && autosave
415
453
  saved
416
454
  end
@@ -421,8 +459,14 @@ module ActiveRecord
421
459
  # If the record is new or it has changed, returns true.
422
460
  def record_changed?(reflection, record, key)
423
461
  record.new_record? ||
424
- (record.has_attribute?(reflection.foreign_key) && record[reflection.foreign_key] != key) ||
425
- 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
426
470
  end
427
471
 
428
472
  # Saves the associated record if it's new or <tt>:autosave</tt> is enabled.
@@ -430,7 +474,9 @@ module ActiveRecord
430
474
  # In addition, it will destroy the association if it was marked for destruction.
431
475
  def save_belongs_to_association(reflection)
432
476
  association = association_instance_get(reflection.name)
433
- record = association && association.load_target
477
+ return unless association && association.loaded? && !association.stale_target?
478
+
479
+ record = association.load_target
434
480
  if record && !record.destroyed?
435
481
  autosave = reflection.options[:autosave]
436
482
 
@@ -438,7 +484,7 @@ module ActiveRecord
438
484
  self[reflection.foreign_key] = nil
439
485
  record.destroy
440
486
  elsif autosave != false
441
- 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?)
442
488
 
443
489
  if association.updated?
444
490
  association_id = record.send(reflection.options[:primary_key] || :id)
@@ -450,5 +496,15 @@ module ActiveRecord
450
496
  end
451
497
  end
452
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
453
509
  end
454
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
@@ -133,14 +134,11 @@ module ActiveRecord #:nodoc:
133
134
  # end
134
135
  # end
135
136
  #
136
- # You can alternatively use <tt>self[:attribute]=(value)</tt> and <tt>self[:attribute]</tt>
137
- # or <tt>write_attribute(:attribute, value)</tt> and <tt>read_attribute(:attribute)</tt>.
138
- #
139
137
  # == Attribute query methods
140
138
  #
141
139
  # In addition to the basic accessors, query methods are also automatically available on the Active Record object.
142
140
  # Query methods allow you to test whether an attribute value is present.
143
- # 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.
144
142
  #
145
143
  # For example, an Active Record User with the <tt>name</tt> attribute has a <tt>name?</tt> method that you can call
146
144
  # to determine whether the user has a name:
@@ -171,10 +169,11 @@ module ActiveRecord #:nodoc:
171
169
  # <tt>Person.find_by_user_name(user_name)</tt>.
172
170
  #
173
171
  # It's possible to add an exclamation point (!) on the end of the dynamic finders to get them to raise an
174
- # <tt>ActiveRecord::RecordNotFound</tt> error if they do not return any records,
172
+ # ActiveRecord::RecordNotFound error if they do not return any records,
175
173
  # like <tt>Person.find_by_last_name!</tt>.
176
174
  #
177
- # 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_".
178
177
  #
179
178
  # Person.find_by(user_name: user_name, password: password)
180
179
  # Person.find_by_user_name_and_password(user_name, password) # with dynamic finder
@@ -186,7 +185,8 @@ module ActiveRecord #:nodoc:
186
185
  # == Saving arrays, hashes, and other non-mappable objects in text columns
187
186
  #
188
187
  # Active Record can serialize any object in text columns using YAML. To do so, you must
189
- # 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].
190
190
  # This makes it possible to store arrays, hashes, and other non-mappable objects without doing
191
191
  # any additional work.
192
192
  #
@@ -226,39 +226,47 @@ module ActiveRecord #:nodoc:
226
226
  #
227
227
  # == Connection to multiple databases in different models
228
228
  #
229
- # 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
230
231
  # by ActiveRecord::Base.connection. All classes inheriting from ActiveRecord::Base will use this
231
232
  # connection. But you can also set a class-specific connection. For example, if Course is an
232
233
  # ActiveRecord::Base, but resides in a different database, you can just say <tt>Course.establish_connection</tt>
233
234
  # and Course and all of its subclasses will use this connection instead.
234
235
  #
235
236
  # This feature is implemented by keeping a connection pool in ActiveRecord::Base that is
236
- # 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
237
239
  # will go up the class-hierarchy until a connection is found in the connection pool.
238
240
  #
239
241
  # == Exceptions
240
242
  #
241
243
  # * ActiveRecordError - Generic error class and superclass of all other errors raised by Active Record.
242
- # * AdapterNotSpecified - The configuration hash used in <tt>establish_connection</tt> didn't include an
243
- # <tt>:adapter</tt> key.
244
- # * AdapterNotFound - The <tt>:adapter</tt> key used in <tt>establish_connection</tt> specified a
245
- # 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
246
250
  # (or a bad spelling of an existing one).
247
251
  # * AssociationTypeMismatch - The object assigned to the association wasn't of the type
248
252
  # specified in the association definition.
249
253
  # * AttributeAssignmentError - An error occurred while doing a mass assignment through the
250
- # <tt>attributes=</tt> method.
254
+ # {ActiveRecord::Base#attributes=}[rdoc-ref:AttributeAssignment#attributes=] method.
251
255
  # You can inspect the +attribute+ property of the exception object to determine which attribute
252
256
  # triggered the error.
253
- # * ConnectionNotEstablished - No connection has been established. Use <tt>establish_connection</tt>
254
- # before querying.
257
+ # * ConnectionNotEstablished - No connection has been established.
258
+ # Use {ActiveRecord::Base.establish_connection}[rdoc-ref:ConnectionHandling#establish_connection] before querying.
255
259
  # * MultiparameterAssignmentErrors - Collection of errors that occurred during a mass assignment using the
256
- # <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
257
262
  # AttributeAssignmentError
258
263
  # objects that should be inspected to determine which attributes triggered the errors.
259
- # * RecordInvalid - raised by save! and create! when the record is invalid.
260
- # * RecordNotFound - No record responded to the +find+ method. Either the row with the given ID doesn't exist
261
- # 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
262
270
  # nothing was found, please check its documentation for further details.
263
271
  # * SerializationTypeMismatch - The serialized object wasn't of the class specified as the second parameter.
264
272
  # * StatementInvalid - The database server rejected the SQL statement. The precise error is added in the message.
@@ -280,6 +288,7 @@ module ActiveRecord #:nodoc:
280
288
  extend Explain
281
289
  extend Enum
282
290
  extend Delegation::DelegateCache
291
+ extend Aggregations::ClassMethods
283
292
 
284
293
  include Core
285
294
  include Persistence
@@ -297,6 +306,7 @@ module ActiveRecord #:nodoc:
297
306
  include AttributeDecorators
298
307
  include Locking::Optimistic
299
308
  include Locking::Pessimistic
309
+ include DefineCallbacks
300
310
  include AttributeMethods
301
311
  include Callbacks
302
312
  include Timestamp
@@ -304,12 +314,14 @@ module ActiveRecord #:nodoc:
304
314
  include ActiveModel::SecurePassword
305
315
  include AutosaveAssociation
306
316
  include NestedAttributes
307
- include Aggregations
308
317
  include Transactions
318
+ include TouchLater
309
319
  include NoTouching
310
320
  include Reflection
311
321
  include Serialization
312
322
  include Store
323
+ include SecureToken
324
+ include Suppressor
313
325
  end
314
326
 
315
327
  ActiveSupport.run_load_hooks(:active_record, Base)