activerecord 5.0.7.2 → 6.0.6.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 (359) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +844 -1944
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +9 -7
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +18 -14
  10. data/lib/active_record/associations/alias_tracker.rb +24 -34
  11. data/lib/active_record/associations/association.rb +113 -55
  12. data/lib/active_record/associations/association_scope.rb +102 -96
  13. data/lib/active_record/associations/belongs_to_association.rb +58 -42
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +18 -25
  16. data/lib/active_record/associations/builder/belongs_to.rb +43 -54
  17. data/lib/active_record/associations/builder/collection_association.rb +7 -18
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
  19. data/lib/active_record/associations/builder/has_many.rb +4 -0
  20. data/lib/active_record/associations/builder/has_one.rb +37 -1
  21. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  22. data/lib/active_record/associations/collection_association.rb +93 -254
  23. data/lib/active_record/associations/collection_proxy.rb +159 -122
  24. data/lib/active_record/associations/foreign_association.rb +9 -0
  25. data/lib/active_record/associations/has_many_association.rb +23 -30
  26. data/lib/active_record/associations/has_many_through_association.rb +58 -44
  27. data/lib/active_record/associations/has_one_association.rb +59 -54
  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 -85
  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 +152 -177
  33. data/lib/active_record/associations/preloader/association.rb +101 -97
  34. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  35. data/lib/active_record/associations/preloader.rb +94 -103
  36. data/lib/active_record/associations/singular_association.rb +12 -45
  37. data/lib/active_record/associations/through_association.rb +27 -15
  38. data/lib/active_record/associations.rb +1603 -1592
  39. data/lib/active_record/attribute_assignment.rb +54 -61
  40. data/lib/active_record/attribute_decorators.rb +38 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
  42. data/lib/active_record/attribute_methods/dirty.rb +179 -109
  43. data/lib/active_record/attribute_methods/primary_key.rb +85 -92
  44. data/lib/active_record/attribute_methods/query.rb +4 -3
  45. data/lib/active_record/attribute_methods/read.rb +20 -49
  46. data/lib/active_record/attribute_methods/serialization.rb +29 -7
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
  48. data/lib/active_record/attribute_methods/write.rb +34 -33
  49. data/lib/active_record/attribute_methods.rb +66 -106
  50. data/lib/active_record/attributes.rb +38 -25
  51. data/lib/active_record/autosave_association.rb +58 -39
  52. data/lib/active_record/base.rb +27 -24
  53. data/lib/active_record/callbacks.rb +64 -35
  54. data/lib/active_record/coders/json.rb +2 -0
  55. data/lib/active_record/coders/yaml_column.rb +34 -13
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -323
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +128 -75
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +233 -147
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +373 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -562
  69. data/lib/active_record/connection_adapters/column.rb +41 -13
  70. data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  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 +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +12 -2
  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 +19 -18
  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 -5
  99. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  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 +58 -54
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
  117. data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
  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 +3 -1
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
  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 +261 -267
  127. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  128. data/lib/active_record/connection_handling.rb +143 -40
  129. data/lib/active_record/core.rb +207 -160
  130. data/lib/active_record/counter_cache.rb +60 -28
  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 -87
  137. data/lib/active_record/enum.rb +67 -23
  138. data/lib/active_record/errors.rb +114 -18
  139. data/lib/active_record/explain.rb +4 -4
  140. data/lib/active_record/explain_registry.rb +3 -1
  141. data/lib/active_record/explain_subscriber.rb +9 -4
  142. data/lib/active_record/fixture_set/file.rb +13 -8
  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 +194 -504
  148. data/lib/active_record/gem_version.rb +5 -3
  149. data/lib/active_record/inheritance.rb +150 -99
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +116 -25
  152. data/lib/active_record/internal_metadata.rb +16 -19
  153. data/lib/active_record/legacy_yaml_adapter.rb +4 -2
  154. data/lib/active_record/locking/optimistic.rb +85 -86
  155. data/lib/active_record/locking/pessimistic.rb +18 -6
  156. data/lib/active_record/log_subscriber.rb +48 -29
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  159. data/lib/active_record/middleware/database_selector.rb +74 -0
  160. data/lib/active_record/migration/command_recorder.rb +134 -100
  161. data/lib/active_record/migration/compatibility.rb +174 -56
  162. data/lib/active_record/migration/join_table.rb +8 -7
  163. data/lib/active_record/migration.rb +369 -302
  164. data/lib/active_record/model_schema.rb +160 -127
  165. data/lib/active_record/nested_attributes.rb +213 -202
  166. data/lib/active_record/no_touching.rb +12 -3
  167. data/lib/active_record/null_relation.rb +12 -34
  168. data/lib/active_record/persistence.rb +446 -77
  169. data/lib/active_record/query_cache.rb +13 -12
  170. data/lib/active_record/querying.rb +37 -24
  171. data/lib/active_record/railtie.rb +128 -36
  172. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  173. data/lib/active_record/railties/console_sandbox.rb +2 -0
  174. data/lib/active_record/railties/controller_runtime.rb +34 -33
  175. data/lib/active_record/railties/databases.rake +312 -177
  176. data/lib/active_record/readonly_attributes.rb +5 -4
  177. data/lib/active_record/reflection.rb +214 -254
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
  179. data/lib/active_record/relation/batches.rb +98 -52
  180. data/lib/active_record/relation/calculations.rb +212 -173
  181. data/lib/active_record/relation/delegation.rb +73 -69
  182. data/lib/active_record/relation/finder_methods.rb +207 -247
  183. data/lib/active_record/relation/from_clause.rb +6 -8
  184. data/lib/active_record/relation/merger.rb +82 -61
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
  186. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  187. data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  189. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  190. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  192. data/lib/active_record/relation/predicate_builder.rb +83 -105
  193. data/lib/active_record/relation/query_attribute.rb +33 -2
  194. data/lib/active_record/relation/query_methods.rb +488 -332
  195. data/lib/active_record/relation/record_fetch_warning.rb +5 -3
  196. data/lib/active_record/relation/spawn_methods.rb +8 -8
  197. data/lib/active_record/relation/where_clause.rb +111 -96
  198. data/lib/active_record/relation/where_clause_factory.rb +6 -11
  199. data/lib/active_record/relation.rb +443 -318
  200. data/lib/active_record/result.rb +69 -40
  201. data/lib/active_record/runtime_registry.rb +5 -3
  202. data/lib/active_record/sanitization.rb +83 -99
  203. data/lib/active_record/schema.rb +7 -14
  204. data/lib/active_record/schema_dumper.rb +71 -69
  205. data/lib/active_record/schema_migration.rb +16 -6
  206. data/lib/active_record/scoping/default.rb +92 -95
  207. data/lib/active_record/scoping/named.rb +51 -26
  208. data/lib/active_record/scoping.rb +20 -20
  209. data/lib/active_record/secure_token.rb +4 -2
  210. data/lib/active_record/serialization.rb +2 -0
  211. data/lib/active_record/statement_cache.rb +63 -28
  212. data/lib/active_record/store.rb +121 -41
  213. data/lib/active_record/suppressor.rb +6 -3
  214. data/lib/active_record/table_metadata.rb +39 -18
  215. data/lib/active_record/tasks/database_tasks.rb +271 -81
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +243 -0
  221. data/lib/active_record/timestamp.rb +70 -36
  222. data/lib/active_record/touch_later.rb +8 -6
  223. data/lib/active_record/transactions.rb +141 -157
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  226. data/lib/active_record/type/date.rb +2 -0
  227. data/lib/active_record/type/date_time.rb +2 -0
  228. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  229. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  230. data/lib/active_record/type/internal/timezone.rb +2 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +16 -9
  233. data/lib/active_record/type/text.rb +11 -0
  234. data/lib/active_record/type/time.rb +12 -1
  235. data/lib/active_record/type/type_map.rb +14 -17
  236. data/lib/active_record/type/unsigned_integer.rb +16 -0
  237. data/lib/active_record/type.rb +23 -18
  238. data/lib/active_record/type_caster/connection.rb +17 -12
  239. data/lib/active_record/type_caster/map.rb +5 -4
  240. data/lib/active_record/type_caster.rb +4 -2
  241. data/lib/active_record/validations/absence.rb +2 -0
  242. data/lib/active_record/validations/associated.rb +3 -2
  243. data/lib/active_record/validations/length.rb +2 -0
  244. data/lib/active_record/validations/presence.rb +4 -2
  245. data/lib/active_record/validations/uniqueness.rb +29 -42
  246. data/lib/active_record/validations.rb +7 -5
  247. data/lib/active_record/version.rb +3 -1
  248. data/lib/active_record.rb +37 -22
  249. data/lib/arel/alias_predication.rb +9 -0
  250. data/lib/arel/attributes/attribute.rb +37 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/collectors/bind.rb +24 -0
  253. data/lib/arel/collectors/composite.rb +31 -0
  254. data/lib/arel/collectors/plain_string.rb +20 -0
  255. data/lib/arel/collectors/sql_string.rb +20 -0
  256. data/lib/arel/collectors/substitute_binds.rb +28 -0
  257. data/lib/arel/crud.rb +42 -0
  258. data/lib/arel/delete_manager.rb +18 -0
  259. data/lib/arel/errors.rb +9 -0
  260. data/lib/arel/expressions.rb +29 -0
  261. data/lib/arel/factory_methods.rb +49 -0
  262. data/lib/arel/insert_manager.rb +49 -0
  263. data/lib/arel/math.rb +45 -0
  264. data/lib/arel/nodes/and.rb +32 -0
  265. data/lib/arel/nodes/ascending.rb +23 -0
  266. data/lib/arel/nodes/binary.rb +52 -0
  267. data/lib/arel/nodes/bind_param.rb +36 -0
  268. data/lib/arel/nodes/case.rb +55 -0
  269. data/lib/arel/nodes/casted.rb +50 -0
  270. data/lib/arel/nodes/comment.rb +29 -0
  271. data/lib/arel/nodes/count.rb +12 -0
  272. data/lib/arel/nodes/delete_statement.rb +45 -0
  273. data/lib/arel/nodes/descending.rb +23 -0
  274. data/lib/arel/nodes/equality.rb +18 -0
  275. data/lib/arel/nodes/extract.rb +24 -0
  276. data/lib/arel/nodes/false.rb +16 -0
  277. data/lib/arel/nodes/full_outer_join.rb +8 -0
  278. data/lib/arel/nodes/function.rb +44 -0
  279. data/lib/arel/nodes/grouping.rb +8 -0
  280. data/lib/arel/nodes/in.rb +8 -0
  281. data/lib/arel/nodes/infix_operation.rb +80 -0
  282. data/lib/arel/nodes/inner_join.rb +8 -0
  283. data/lib/arel/nodes/insert_statement.rb +37 -0
  284. data/lib/arel/nodes/join_source.rb +20 -0
  285. data/lib/arel/nodes/matches.rb +18 -0
  286. data/lib/arel/nodes/named_function.rb +23 -0
  287. data/lib/arel/nodes/node.rb +50 -0
  288. data/lib/arel/nodes/node_expression.rb +13 -0
  289. data/lib/arel/nodes/outer_join.rb +8 -0
  290. data/lib/arel/nodes/over.rb +15 -0
  291. data/lib/arel/nodes/regexp.rb +16 -0
  292. data/lib/arel/nodes/right_outer_join.rb +8 -0
  293. data/lib/arel/nodes/select_core.rb +67 -0
  294. data/lib/arel/nodes/select_statement.rb +41 -0
  295. data/lib/arel/nodes/sql_literal.rb +16 -0
  296. data/lib/arel/nodes/string_join.rb +11 -0
  297. data/lib/arel/nodes/table_alias.rb +27 -0
  298. data/lib/arel/nodes/terminal.rb +16 -0
  299. data/lib/arel/nodes/true.rb +16 -0
  300. data/lib/arel/nodes/unary.rb +45 -0
  301. data/lib/arel/nodes/unary_operation.rb +20 -0
  302. data/lib/arel/nodes/unqualified_column.rb +22 -0
  303. data/lib/arel/nodes/update_statement.rb +41 -0
  304. data/lib/arel/nodes/values_list.rb +9 -0
  305. data/lib/arel/nodes/window.rb +126 -0
  306. data/lib/arel/nodes/with.rb +11 -0
  307. data/lib/arel/nodes.rb +68 -0
  308. data/lib/arel/order_predications.rb +13 -0
  309. data/lib/arel/predications.rb +256 -0
  310. data/lib/arel/select_manager.rb +271 -0
  311. data/lib/arel/table.rb +110 -0
  312. data/lib/arel/tree_manager.rb +72 -0
  313. data/lib/arel/update_manager.rb +34 -0
  314. data/lib/arel/visitors/depth_first.rb +203 -0
  315. data/lib/arel/visitors/dot.rb +296 -0
  316. data/lib/arel/visitors/ibm_db.rb +34 -0
  317. data/lib/arel/visitors/informix.rb +62 -0
  318. data/lib/arel/visitors/mssql.rb +156 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +158 -0
  321. data/lib/arel/visitors/oracle12.rb +65 -0
  322. data/lib/arel/visitors/postgresql.rb +109 -0
  323. data/lib/arel/visitors/sqlite.rb +38 -0
  324. data/lib/arel/visitors/to_sql.rb +888 -0
  325. data/lib/arel/visitors/visitor.rb +45 -0
  326. data/lib/arel/visitors/where_sql.rb +22 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +62 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  331. data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
  332. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
  333. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
  334. data/lib/rails/generators/active_record/migration.rb +17 -3
  335. data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
  336. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  337. data/lib/rails/generators/active_record.rb +7 -5
  338. metadata +138 -52
  339. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  340. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  341. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  343. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  344. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  345. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  346. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  347. data/lib/active_record/attribute.rb +0 -213
  348. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  349. data/lib/active_record/attribute_set/builder.rb +0 -132
  350. data/lib/active_record/attribute_set.rb +0 -110
  351. data/lib/active_record/collection_cache_key.rb +0 -50
  352. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  353. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  354. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  355. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  356. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  357. data/lib/active_record/type/internal/abstract_json.rb +0 -33
  358. /data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  359. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,7 +1,9 @@
1
- require 'thread'
2
- require 'active_support/core_ext/hash/indifferent_access'
3
- require 'active_support/core_ext/object/duplicable'
4
- require 'active_support/core_ext/string/filters'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/hash/indifferent_access"
4
+ require "active_support/core_ext/string/filters"
5
+ require "active_support/parameter_filter"
6
+ require "concurrent/map"
5
7
 
6
8
  module ActiveRecord
7
9
  module Core
@@ -16,9 +18,16 @@ module ActiveRecord
16
18
  # retrieved on both a class and instance level by calling +logger+.
17
19
  mattr_accessor :logger, instance_writer: false
18
20
 
21
+ ##
22
+ # :singleton-method:
23
+ #
24
+ # Specifies if the methods calling database queries should be logged below
25
+ # their relevant queries. Defaults to false.
26
+ mattr_accessor :verbose_query_logs, instance_writer: false, default: false
27
+
19
28
  ##
20
29
  # Contains the database configuration - as is typically stored in config/database.yml -
21
- # as a Hash.
30
+ # as an ActiveRecord::DatabaseConfigurations object.
22
31
  #
23
32
  # For example, the following database.yml...
24
33
  #
@@ -32,22 +41,18 @@ module ActiveRecord
32
41
  #
33
42
  # ...would result in ActiveRecord::Base.configurations to look like this:
34
43
  #
35
- # {
36
- # 'development' => {
37
- # 'adapter' => 'sqlite3',
38
- # 'database' => 'db/development.sqlite3'
39
- # },
40
- # 'production' => {
41
- # 'adapter' => 'sqlite3',
42
- # 'database' => 'db/production.sqlite3'
43
- # }
44
- # }
44
+ # #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
45
+ # #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
46
+ # @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>,
47
+ # #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbdea90 @env_name="production",
48
+ # @spec_name="primary", @config={"adapter"=>"mysql2", "database"=>"db/production.sqlite3"}>
49
+ # ]>
45
50
  def self.configurations=(config)
46
- @@configurations = ActiveRecord::ConnectionHandling::MergeAndResolveDefaultUrlConfig.new(config).resolve
51
+ @@configurations = ActiveRecord::DatabaseConfigurations.new(config)
47
52
  end
48
53
  self.configurations = {}
49
54
 
50
- # Returns fully resolved configurations hash
55
+ # Returns fully resolved ActiveRecord::DatabaseConfigurations object
51
56
  def self.configurations
52
57
  @@configurations
53
58
  end
@@ -56,8 +61,7 @@ module ActiveRecord
56
61
  # :singleton-method:
57
62
  # Determines whether to use Time.utc (using :utc) or Time.local (using :local) when pulling
58
63
  # dates and times from the database. This is set to :utc by default.
59
- mattr_accessor :default_timezone, instance_writer: false
60
- self.default_timezone = :utc
64
+ mattr_accessor :default_timezone, instance_writer: false, default: :utc
61
65
 
62
66
  ##
63
67
  # :singleton-method:
@@ -67,31 +71,35 @@ module ActiveRecord
67
71
  # ActiveRecord::Schema file which can be loaded into any database that
68
72
  # supports migrations. Use :ruby if you want to have different database
69
73
  # adapters for, e.g., your development and test environments.
70
- mattr_accessor :schema_format, instance_writer: false
71
- self.schema_format = :ruby
74
+ mattr_accessor :schema_format, instance_writer: false, default: :ruby
72
75
 
73
76
  ##
74
77
  # :singleton-method:
75
- # Specifies if an error should be raised on query limit or order being
78
+ # Specifies if an error should be raised if the query has an order being
76
79
  # ignored when doing batch queries. Useful in applications where the
77
- # limit or scope being ignored is error-worthy, rather than a warning.
78
- mattr_accessor :error_on_ignored_order_or_limit, instance_writer: false
79
- self.error_on_ignored_order_or_limit = false
80
+ # scope being ignored is error-worthy, rather than a warning.
81
+ mattr_accessor :error_on_ignored_order, instance_writer: false, default: false
82
+
83
+ # :singleton-method:
84
+ # Specify the behavior for unsafe raw query methods. Values are as follows
85
+ # deprecated - Warnings are logged when unsafe raw SQL is passed to
86
+ # query methods.
87
+ # disabled - Unsafe raw SQL passed to query methods results in
88
+ # UnknownAttributeReference exception.
89
+ mattr_accessor :allow_unsafe_raw_sql, instance_writer: false, default: :deprecated
80
90
 
81
91
  ##
82
92
  # :singleton-method:
83
93
  # Specify whether or not to use timestamps for migration versions
84
- mattr_accessor :timestamped_migrations, instance_writer: false
85
- self.timestamped_migrations = true
94
+ mattr_accessor :timestamped_migrations, instance_writer: false, default: true
86
95
 
87
96
  ##
88
97
  # :singleton-method:
89
98
  # Specify whether schema dump should happen at the end of the
90
- # db:migrate rake task. This is true by default, which is useful for the
99
+ # db:migrate rails command. This is true by default, which is useful for the
91
100
  # development environment. This should ideally be false in the production
92
101
  # environment where dumping schema is rarely needed.
93
- mattr_accessor :dump_schema_after_migration, instance_writer: false
94
- self.dump_schema_after_migration = true
102
+ mattr_accessor :dump_schema_after_migration, instance_writer: false, default: true
95
103
 
96
104
  ##
97
105
  # :singleton-method:
@@ -100,8 +108,7 @@ module ActiveRecord
100
108
  # schema_search_path are dumped. Use :all to dump all schemas regardless
101
109
  # of schema_search_path, or a string of comma separated schemas for a
102
110
  # custom list.
103
- mattr_accessor :dump_schemas, instance_writer: false
104
- self.dump_schemas = :schema_search_path
111
+ mattr_accessor :dump_schemas, instance_writer: false, default: :schema_search_path
105
112
 
106
113
  ##
107
114
  # :singleton-method:
@@ -110,33 +117,45 @@ module ActiveRecord
110
117
  # be used to identify queries which load thousands of records and
111
118
  # potentially cause memory bloat.
112
119
  mattr_accessor :warn_on_records_fetched_greater_than, instance_writer: false
113
- self.warn_on_records_fetched_greater_than = nil
114
120
 
115
121
  mattr_accessor :maintain_test_schema, instance_accessor: false
116
122
 
117
123
  mattr_accessor :belongs_to_required_by_default, instance_accessor: false
118
124
 
125
+ mattr_accessor :connection_handlers, instance_accessor: false, default: {}
126
+
127
+ mattr_accessor :writing_role, instance_accessor: false, default: :writing
128
+
129
+ mattr_accessor :reading_role, instance_accessor: false, default: :reading
130
+
131
+ ##
132
+ # :singleton-method:
133
+ # Application configurable boolean that instructs the YAML Coder to use
134
+ # an unsafe load if set to true.
135
+ mattr_accessor :use_yaml_unsafe_load, instance_writer: false, default: false
136
+
137
+ # Application configurable array that provides additional permitted classes
138
+ # to Psych safe_load in the YAML Coder
139
+ mattr_accessor :yaml_column_permitted_classes, instance_writer: false, default: [Symbol]
140
+
119
141
  class_attribute :default_connection_handler, instance_writer: false
120
142
 
143
+ self.filter_attributes = []
144
+
121
145
  def self.connection_handler
122
- ActiveRecord::RuntimeRegistry.connection_handler || default_connection_handler
146
+ Thread.current.thread_variable_get("ar_connection_handler") || default_connection_handler
123
147
  end
124
148
 
125
149
  def self.connection_handler=(handler)
126
- ActiveRecord::RuntimeRegistry.connection_handler = handler
150
+ Thread.current.thread_variable_set("ar_connection_handler", handler)
127
151
  end
128
152
 
129
153
  self.default_connection_handler = ConnectionAdapters::ConnectionHandler.new
130
154
  end
131
155
 
132
156
  module ClassMethods
133
- def allocate
134
- define_attribute_methods
135
- super
136
- end
137
-
138
157
  def initialize_find_by_cache # :nodoc:
139
- @find_by_statement_cache = { true => {}.extend(Mutex_m), false => {}.extend(Mutex_m) }
158
+ @find_by_statement_cache = { true => Concurrent::Map.new, false => Concurrent::Map.new }
140
159
  end
141
160
 
142
161
  def inherited(child_class) # :nodoc:
@@ -151,41 +170,33 @@ module ActiveRecord
151
170
  return super if block_given? ||
152
171
  primary_key.nil? ||
153
172
  scope_attributes? ||
154
- columns_hash.include?(inheritance_column) ||
155
- ids.first.kind_of?(Array)
156
-
157
- id = ids.first
158
- if ActiveRecord::Base === id
159
- id = id.id
160
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
161
- You are passing an instance of ActiveRecord::Base to `find`.
162
- Please pass the id of the object by calling `.id`.
163
- MSG
164
- end
173
+ columns_hash.key?(inheritance_column) && !base_class?
174
+
175
+ id = ids.first
176
+
177
+ return super if StatementCache.unsupported_value?(id)
165
178
 
166
179
  key = primary_key
167
180
 
168
181
  statement = cached_find_by_statement(key) { |params|
169
182
  where(key => params.bind).limit(1)
170
183
  }
171
- record = statement.execute([id], self, connection).first
184
+
185
+ record = statement.execute([id], connection)&.first
172
186
  unless record
173
- raise RecordNotFound.new("Couldn't find #{name} with '#{primary_key}'=#{id}",
174
- name, primary_key, id)
187
+ raise RecordNotFound.new("Couldn't find #{name} with '#{key}'=#{id}", name, key, id)
175
188
  end
176
189
  record
177
- rescue RangeError
178
- raise RecordNotFound.new("Couldn't find #{name} with an out of range value for '#{primary_key}'",
179
- name, primary_key)
180
190
  end
181
191
 
182
192
  def find_by(*args) # :nodoc:
183
- return super if scope_attributes? || reflect_on_all_aggregations.any?
193
+ return super if scope_attributes? || reflect_on_all_aggregations.any? ||
194
+ columns_hash.key?(inheritance_column) && !base_class?
184
195
 
185
196
  hash = args.first
186
197
 
187
198
  return super if !(Hash === hash) || hash.values.any? { |v|
188
- v.nil? || Array === v || Hash === v || Relation === v || Base === v
199
+ StatementCache.unsupported_value?(v)
189
200
  }
190
201
 
191
202
  # We can't cache Post.find_by(author: david) ...yet
@@ -200,32 +211,44 @@ module ActiveRecord
200
211
  where(wheres).limit(1)
201
212
  }
202
213
  begin
203
- statement.execute(hash.values, self, connection).first
214
+ statement.execute(hash.values, connection)&.first
204
215
  rescue TypeError
205
216
  raise ActiveRecord::StatementInvalid
206
- rescue RangeError
207
- nil
208
217
  end
209
218
  end
210
219
 
211
220
  def find_by!(*args) # :nodoc:
212
- find_by(*args) or raise RecordNotFound.new("Couldn't find #{name}", name)
221
+ find_by(*args) || raise(RecordNotFound.new("Couldn't find #{name}", name))
213
222
  end
214
223
 
215
224
  def initialize_generated_modules # :nodoc:
216
225
  generated_association_methods
217
226
  end
218
227
 
219
- def generated_association_methods
228
+ def generated_association_methods # :nodoc:
220
229
  @generated_association_methods ||= begin
221
230
  mod = const_set(:GeneratedAssociationMethods, Module.new)
231
+ private_constant :GeneratedAssociationMethods
222
232
  include mod
233
+
223
234
  mod
224
235
  end
225
236
  end
226
237
 
238
+ # Returns columns which shouldn't be exposed while calling +#inspect+.
239
+ def filter_attributes
240
+ if defined?(@filter_attributes)
241
+ @filter_attributes
242
+ else
243
+ superclass.filter_attributes
244
+ end
245
+ end
246
+
247
+ # Specifies columns which shouldn't be exposed while calling +#inspect+.
248
+ attr_writer :filter_attributes
249
+
227
250
  # Returns a string like 'Post(id:integer, title:string, body:text)'
228
- def inspect
251
+ def inspect # :nodoc:
229
252
  if self == Base
230
253
  super
231
254
  elsif abstract_class?
@@ -233,39 +256,30 @@ module ActiveRecord
233
256
  elsif !connected?
234
257
  "#{super} (call '#{super}.connection' to establish a connection)"
235
258
  elsif table_exists?
236
- attr_list = attribute_types.map { |name, type| "#{name}: #{type.type}" } * ', '
259
+ attr_list = attribute_types.map { |name, type| "#{name}: #{type.type}" } * ", "
237
260
  "#{super}(#{attr_list})"
238
261
  else
239
262
  "#{super}(Table doesn't exist)"
240
263
  end
241
264
  end
242
265
 
243
- # Overwrite the default class equality method to provide support for association proxies.
244
- def ===(object)
266
+ # Overwrite the default class equality method to provide support for decorated models.
267
+ def ===(object) # :nodoc:
245
268
  object.is_a?(self)
246
269
  end
247
270
 
248
271
  # Returns an instance of <tt>Arel::Table</tt> loaded with the current table name.
249
272
  #
250
273
  # class Post < ActiveRecord::Base
251
- # scope :published_and_commented, -> { published.and(self.arel_table[:comments_count].gt(0)) }
274
+ # scope :published_and_commented, -> { published.and(arel_table[:comments_count].gt(0)) }
252
275
  # end
253
276
  def arel_table # :nodoc:
254
277
  @arel_table ||= Arel::Table.new(table_name, type_caster: type_caster)
255
278
  end
256
279
 
257
- # Returns the Arel engine.
258
- def arel_engine # :nodoc:
259
- @arel_engine ||=
260
- if Base == self || connection_handler.retrieve_connection_pool(connection_specification_name)
261
- self
262
- else
263
- superclass.arel_engine
264
- end
265
- end
266
-
267
280
  def arel_attribute(name, table = arel_table) # :nodoc:
268
- name = attribute_alias(name) if attribute_alias?(name)
281
+ name = name.to_s
282
+ name = attribute_aliases[name] || name
269
283
  table[name]
270
284
  end
271
285
 
@@ -277,28 +291,29 @@ module ActiveRecord
277
291
  TypeCaster::Map.new(self)
278
292
  end
279
293
 
280
- private
294
+ def _internal? # :nodoc:
295
+ false
296
+ end
281
297
 
282
298
  def cached_find_by_statement(key, &block) # :nodoc:
283
299
  cache = @find_by_statement_cache[connection.prepared_statements]
284
- cache[key] || cache.synchronize {
285
- cache[key] ||= StatementCache.create(connection, &block)
286
- }
300
+ cache.compute_if_absent(key) { StatementCache.create(connection, &block) }
287
301
  end
288
302
 
289
- def relation # :nodoc:
290
- relation = Relation.create(self, arel_table, predicate_builder)
303
+ private
304
+ def relation
305
+ relation = Relation.create(self)
291
306
 
292
- if finder_needs_type_condition? && !ignore_default_scope?
293
- relation.where(type_condition).create_with(inheritance_column.to_sym => sti_name)
294
- else
295
- relation
307
+ if finder_needs_type_condition? && !ignore_default_scope?
308
+ relation.where!(type_condition)
309
+ else
310
+ relation
311
+ end
296
312
  end
297
- end
298
313
 
299
- def table_metadata # :nodoc:
300
- TableMetadata.new(self, arel_table)
301
- end
314
+ def table_metadata
315
+ TableMetadata.new(self, arel_table)
316
+ end
302
317
  end
303
318
 
304
319
  # New objects can be instantiated as either empty (pass no construction parameter) or pre-set with
@@ -310,7 +325,7 @@ module ActiveRecord
310
325
  # # Instantiates a single new object
311
326
  # User.new(first_name: 'Jamie')
312
327
  def initialize(attributes = nil)
313
- self.class.define_attribute_methods
328
+ @new_record = true
314
329
  @attributes = self.class._default_attributes.deep_dup
315
330
 
316
331
  init_internals
@@ -336,15 +351,21 @@ module ActiveRecord
336
351
  # post = Post.allocate
337
352
  # post.init_with(coder)
338
353
  # post.title # => 'hello world'
339
- def init_with(coder)
354
+ def init_with(coder, &block)
340
355
  coder = LegacyYamlAdapter.convert(self.class, coder)
341
- @attributes = coder['attributes']
342
-
343
- init_internals
356
+ attributes = self.class.yaml_encoder.decode(coder)
357
+ init_with_attributes(attributes, coder["new_record"], &block)
358
+ end
344
359
 
345
- @new_record = coder['new_record']
360
+ ##
361
+ # Initialize an empty model object from +attributes+.
362
+ # +attributes+ should be an attributes object, and unlike the
363
+ # `initialize` method, no assignment calls are made per attribute.
364
+ def init_with_attributes(attributes, new_record = false) # :nodoc:
365
+ @new_record = new_record
366
+ @attributes = attributes
346
367
 
347
- self.class.define_attribute_methods
368
+ init_internals
348
369
 
349
370
  yield self if block_given?
350
371
 
@@ -383,12 +404,14 @@ module ActiveRecord
383
404
  ##
384
405
  def initialize_dup(other) # :nodoc:
385
406
  @attributes = @attributes.deep_dup
386
- @attributes.reset(self.class.primary_key)
407
+ @attributes.reset(@primary_key)
387
408
 
388
409
  _run_initialize_callbacks
389
410
 
390
- @new_record = true
391
- @destroyed = false
411
+ @new_record = true
412
+ @destroyed = false
413
+ @_start_transaction_state = nil
414
+ @transaction_state = nil
392
415
 
393
416
  super
394
417
  end
@@ -406,11 +429,9 @@ module ActiveRecord
406
429
  # Post.new.encode_with(coder)
407
430
  # coder # => {"attributes" => {"id" => nil, ... }}
408
431
  def encode_with(coder)
409
- # FIXME: Remove this when we better serialize attributes
410
- coder['raw_attributes'] = attributes_before_type_cast
411
- coder['attributes'] = @attributes
412
- coder['new_record'] = new_record?
413
- coder['active_record_yaml_version'] = 1
432
+ self.class.yaml_encoder.encode(@attributes, coder)
433
+ coder["new_record"] = new_record?
434
+ coder["active_record_yaml_version"] = 2
414
435
  end
415
436
 
416
437
  # Returns true if +comparison_object+ is the same exact object, or +comparison_object+
@@ -434,7 +455,7 @@ module ActiveRecord
434
455
  # [ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
435
456
  def hash
436
457
  if id
437
- id.hash
458
+ self.class.hash ^ id.hash
438
459
  else
439
460
  super
440
461
  end
@@ -450,18 +471,27 @@ module ActiveRecord
450
471
 
451
472
  # Returns +true+ if the attributes hash has been frozen.
452
473
  def frozen?
474
+ sync_with_transaction_state if @transaction_state&.finalized?
453
475
  @attributes.frozen?
454
476
  end
455
477
 
456
478
  # Allows sort on objects
457
479
  def <=>(other_object)
458
480
  if other_object.is_a?(self.class)
459
- self.to_key <=> other_object.to_key
481
+ to_key <=> other_object.to_key
460
482
  else
461
483
  super
462
484
  end
463
485
  end
464
486
 
487
+ def present? # :nodoc:
488
+ true
489
+ end
490
+
491
+ def blank? # :nodoc:
492
+ false
493
+ end
494
+
465
495
  # Returns +true+ if the record is read only. Records loaded through joins with piggy-back
466
496
  # attributes will be marked as read only since they cannot be saved.
467
497
  def readonly?
@@ -482,14 +512,22 @@ module ActiveRecord
482
512
  # We check defined?(@attributes) not to issue warnings if the object is
483
513
  # allocated but not initialized.
484
514
  inspection = if defined?(@attributes) && @attributes
485
- self.class.column_names.collect { |name|
486
- if has_attribute?(name)
487
- "#{name}: #{attribute_for_inspect(name)}"
488
- end
489
- }.compact.join(", ")
490
- else
491
- "not initialized"
492
- end
515
+ self.class.attribute_names.collect do |name|
516
+ if has_attribute?(name)
517
+ attr = _read_attribute(name)
518
+ value = if attr.nil?
519
+ attr.inspect
520
+ else
521
+ attr = format_for_inspect(attr)
522
+ inspection_filter.filter_param(name, attr)
523
+ end
524
+ "#{name}: #{value}"
525
+ end
526
+ end.compact.join(", ")
527
+ else
528
+ "not initialized"
529
+ end
530
+
493
531
  "#<#{self.class} #{inspection}>"
494
532
  end
495
533
 
@@ -499,65 +537,74 @@ module ActiveRecord
499
537
  return super if custom_inspect_method_defined?
500
538
  pp.object_address_group(self) do
501
539
  if defined?(@attributes) && @attributes
502
- column_names = self.class.column_names.select { |name| has_attribute?(name) || new_record? }
503
- pp.seplist(column_names, proc { pp.text ',' }) do |column_name|
504
- column_value = read_attribute(column_name)
505
- pp.breakable ' '
540
+ attr_names = self.class.attribute_names.select { |name| has_attribute?(name) }
541
+ pp.seplist(attr_names, proc { pp.text "," }) do |attr_name|
542
+ pp.breakable " "
506
543
  pp.group(1) do
507
- pp.text column_name
508
- pp.text ':'
544
+ pp.text attr_name
545
+ pp.text ":"
509
546
  pp.breakable
510
- pp.pp column_value
547
+ value = _read_attribute(attr_name)
548
+ value = inspection_filter.filter_param(attr_name, value) unless value.nil?
549
+ pp.pp value
511
550
  end
512
551
  end
513
552
  else
514
- pp.breakable ' '
515
- pp.text 'not initialized'
553
+ pp.breakable " "
554
+ pp.text "not initialized"
516
555
  end
517
556
  end
518
557
  end
519
558
 
520
559
  # Returns a hash of the given methods with their names as keys and returned values as values.
521
560
  def slice(*methods)
522
- Hash[methods.map! { |method| [method, public_send(method)] }].with_indifferent_access
561
+ Hash[methods.flatten.map! { |method| [method, public_send(method)] }].with_indifferent_access
523
562
  end
524
563
 
525
564
  private
565
+ # +Array#flatten+ will call +#to_ary+ (recursively) on each of the elements of
566
+ # the array, and then rescues from the possible +NoMethodError+. If those elements are
567
+ # +ActiveRecord::Base+'s, then this triggers the various +method_missing+'s that we have,
568
+ # which significantly impacts upon performance.
569
+ #
570
+ # So we can avoid the +method_missing+ hit by explicitly defining +#to_ary+ as +nil+ here.
571
+ #
572
+ # See also https://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary.html
573
+ def to_ary
574
+ nil
575
+ end
526
576
 
527
- # Under Ruby 1.9, Array#flatten will call #to_ary (recursively) on each of the elements
528
- # of the array, and then rescues from the possible NoMethodError. If those elements are
529
- # ActiveRecord::Base's, then this triggers the various method_missing's that we have,
530
- # which significantly impacts upon performance.
531
- #
532
- # So we can avoid the method_missing hit by explicitly defining #to_ary as nil here.
533
- #
534
- # See also http://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary.html
535
- def to_ary # :nodoc:
536
- nil
537
- end
577
+ def init_internals
578
+ @primary_key = self.class.primary_key
579
+ @readonly = false
580
+ @destroyed = false
581
+ @marked_for_destruction = false
582
+ @destroyed_by_association = nil
583
+ @_start_transaction_state = nil
584
+ @transaction_state = nil
538
585
 
539
- def init_internals
540
- @readonly = false
541
- @destroyed = false
542
- @marked_for_destruction = false
543
- @destroyed_by_association = nil
544
- @new_record = true
545
- @txn = nil
546
- @_start_transaction_state = {}
547
- @transaction_state = nil
548
- end
586
+ self.class.define_attribute_methods
587
+ end
549
588
 
550
- def initialize_internals_callback
551
- end
589
+ def initialize_internals_callback
590
+ end
552
591
 
553
- def thaw
554
- if frozen?
555
- @attributes = @attributes.dup
592
+ def custom_inspect_method_defined?
593
+ self.class.instance_method(:inspect).owner != ActiveRecord::Base.instance_method(:inspect).owner
556
594
  end
557
- end
558
595
 
559
- def custom_inspect_method_defined?
560
- self.class.instance_method(:inspect).owner != ActiveRecord::Base.instance_method(:inspect).owner
561
- end
596
+ class InspectionMask < DelegateClass(::String)
597
+ def pretty_print(pp)
598
+ pp.text __getobj__
599
+ end
600
+ end
601
+ private_constant :InspectionMask
602
+
603
+ def inspection_filter
604
+ @inspection_filter ||= begin
605
+ mask = InspectionMask.new(ActiveSupport::ParameterFilter::FILTERED)
606
+ ActiveSupport::ParameterFilter.new(self.class.filter_attributes, mask: mask)
607
+ end
608
+ end
562
609
  end
563
610
  end