activerecord 5.2.8.1 → 6.1.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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1255 -596
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +7 -5
  5. data/examples/performance.rb +1 -1
  6. data/lib/active_record/aggregations.rb +9 -8
  7. data/lib/active_record/association_relation.rb +30 -10
  8. data/lib/active_record/associations/alias_tracker.rb +19 -16
  9. data/lib/active_record/associations/association.rb +100 -41
  10. data/lib/active_record/associations/association_scope.rb +23 -21
  11. data/lib/active_record/associations/belongs_to_association.rb +55 -48
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +7 -6
  13. data/lib/active_record/associations/builder/association.rb +45 -22
  14. data/lib/active_record/associations/builder/belongs_to.rb +29 -59
  15. data/lib/active_record/associations/builder/collection_association.rb +8 -17
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -41
  17. data/lib/active_record/associations/builder/has_many.rb +8 -2
  18. data/lib/active_record/associations/builder/has_one.rb +33 -2
  19. data/lib/active_record/associations/builder/singular_association.rb +3 -1
  20. data/lib/active_record/associations/collection_association.rb +44 -34
  21. data/lib/active_record/associations/collection_proxy.rb +25 -21
  22. data/lib/active_record/associations/foreign_association.rb +20 -0
  23. data/lib/active_record/associations/has_many_association.rb +26 -13
  24. data/lib/active_record/associations/has_many_through_association.rb +24 -18
  25. data/lib/active_record/associations/has_one_association.rb +43 -31
  26. data/lib/active_record/associations/has_one_through_association.rb +5 -5
  27. data/lib/active_record/associations/join_dependency/join_association.rb +44 -22
  28. data/lib/active_record/associations/join_dependency/join_part.rb +5 -5
  29. data/lib/active_record/associations/join_dependency.rb +91 -60
  30. data/lib/active_record/associations/preloader/association.rb +69 -43
  31. data/lib/active_record/associations/preloader/through_association.rb +49 -40
  32. data/lib/active_record/associations/preloader.rb +47 -34
  33. data/lib/active_record/associations/singular_association.rb +3 -17
  34. data/lib/active_record/associations/through_association.rb +1 -1
  35. data/lib/active_record/associations.rb +137 -25
  36. data/lib/active_record/attribute_assignment.rb +17 -19
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -7
  38. data/lib/active_record/attribute_methods/dirty.rb +101 -40
  39. data/lib/active_record/attribute_methods/primary_key.rb +20 -25
  40. data/lib/active_record/attribute_methods/query.rb +4 -8
  41. data/lib/active_record/attribute_methods/read.rb +14 -56
  42. data/lib/active_record/attribute_methods/serialization.rb +12 -7
  43. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -15
  44. data/lib/active_record/attribute_methods/write.rb +18 -34
  45. data/lib/active_record/attribute_methods.rb +81 -143
  46. data/lib/active_record/attributes.rb +46 -9
  47. data/lib/active_record/autosave_association.rb +57 -42
  48. data/lib/active_record/base.rb +4 -17
  49. data/lib/active_record/callbacks.rb +158 -43
  50. data/lib/active_record/coders/yaml_column.rb +1 -2
  51. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +272 -130
  52. data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -36
  53. data/lib/active_record/connection_adapters/abstract/database_statements.rb +167 -146
  54. data/lib/active_record/connection_adapters/abstract/query_cache.rb +18 -14
  55. data/lib/active_record/connection_adapters/abstract/quoting.rb +98 -47
  56. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  57. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -110
  58. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +211 -90
  59. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +2 -4
  60. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +385 -144
  61. data/lib/active_record/connection_adapters/abstract/transaction.rb +167 -69
  62. data/lib/active_record/connection_adapters/abstract_adapter.rb +229 -99
  63. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +243 -275
  64. data/lib/active_record/connection_adapters/column.rb +30 -12
  65. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  66. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
  67. data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
  68. data/lib/active_record/connection_adapters/mysql/database_statements.rb +88 -32
  69. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
  70. data/lib/active_record/connection_adapters/mysql/quoting.rb +59 -7
  71. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +34 -10
  72. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +48 -32
  73. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +18 -7
  74. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +142 -19
  75. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +14 -9
  76. data/lib/active_record/connection_adapters/mysql2_adapter.rb +53 -18
  77. data/lib/active_record/connection_adapters/pool_config.rb +73 -0
  78. data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
  79. data/lib/active_record/connection_adapters/postgresql/column.rb +37 -28
  80. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +40 -54
  81. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
  82. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
  83. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  84. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  85. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
  86. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  87. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +3 -4
  90. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +3 -4
  93. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +25 -7
  94. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  95. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
  96. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +15 -3
  97. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  98. data/lib/active_record/connection_adapters/postgresql/quoting.rb +47 -10
  99. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
  100. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +19 -4
  101. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
  102. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
  103. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +120 -100
  104. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +31 -26
  105. data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
  106. data/lib/active_record/connection_adapters/postgresql_adapter.rb +224 -120
  107. data/lib/active_record/connection_adapters/schema_cache.rb +159 -21
  108. data/lib/active_record/connection_adapters/sql_type_metadata.rb +17 -6
  109. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +146 -0
  110. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -7
  111. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  112. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +77 -13
  113. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +174 -186
  114. data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
  115. data/lib/active_record/connection_adapters.rb +52 -0
  116. data/lib/active_record/connection_handling.rb +293 -33
  117. data/lib/active_record/core.rb +333 -98
  118. data/lib/active_record/counter_cache.rb +8 -30
  119. data/lib/active_record/database_configurations/connection_url_resolver.rb +99 -0
  120. data/lib/active_record/database_configurations/database_config.rb +80 -0
  121. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  122. data/lib/active_record/database_configurations/url_config.rb +53 -0
  123. data/lib/active_record/database_configurations.rb +273 -0
  124. data/lib/active_record/delegated_type.rb +209 -0
  125. data/lib/active_record/destroy_association_async_job.rb +36 -0
  126. data/lib/active_record/dynamic_matchers.rb +3 -4
  127. data/lib/active_record/enum.rb +108 -36
  128. data/lib/active_record/errors.rb +62 -19
  129. data/lib/active_record/explain.rb +10 -6
  130. data/lib/active_record/explain_subscriber.rb +1 -1
  131. data/lib/active_record/fixture_set/file.rb +10 -17
  132. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  133. data/lib/active_record/fixture_set/render_context.rb +17 -0
  134. data/lib/active_record/fixture_set/table_row.rb +152 -0
  135. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  136. data/lib/active_record/fixtures.rb +200 -481
  137. data/lib/active_record/gem_version.rb +3 -3
  138. data/lib/active_record/inheritance.rb +53 -24
  139. data/lib/active_record/insert_all.rb +212 -0
  140. data/lib/active_record/integration.rb +67 -17
  141. data/lib/active_record/internal_metadata.rb +28 -9
  142. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  143. data/lib/active_record/locking/optimistic.rb +37 -23
  144. data/lib/active_record/locking/pessimistic.rb +9 -5
  145. data/lib/active_record/log_subscriber.rb +35 -35
  146. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  147. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  148. data/lib/active_record/middleware/database_selector.rb +77 -0
  149. data/lib/active_record/migration/command_recorder.rb +96 -44
  150. data/lib/active_record/migration/compatibility.rb +145 -64
  151. data/lib/active_record/migration/join_table.rb +0 -1
  152. data/lib/active_record/migration.rb +206 -157
  153. data/lib/active_record/model_schema.rb +148 -22
  154. data/lib/active_record/nested_attributes.rb +4 -7
  155. data/lib/active_record/no_touching.rb +8 -1
  156. data/lib/active_record/null_relation.rb +0 -1
  157. data/lib/active_record/persistence.rb +267 -59
  158. data/lib/active_record/query_cache.rb +21 -4
  159. data/lib/active_record/querying.rb +40 -23
  160. data/lib/active_record/railtie.rb +116 -59
  161. data/lib/active_record/railties/console_sandbox.rb +2 -4
  162. data/lib/active_record/railties/controller_runtime.rb +30 -35
  163. data/lib/active_record/railties/databases.rake +411 -80
  164. data/lib/active_record/readonly_attributes.rb +4 -0
  165. data/lib/active_record/reflection.rb +109 -93
  166. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  167. data/lib/active_record/relation/batches.rb +44 -35
  168. data/lib/active_record/relation/calculations.rb +157 -90
  169. data/lib/active_record/relation/delegation.rb +35 -50
  170. data/lib/active_record/relation/finder_methods.rb +64 -39
  171. data/lib/active_record/relation/from_clause.rb +5 -1
  172. data/lib/active_record/relation/merger.rb +32 -40
  173. data/lib/active_record/relation/predicate_builder/array_handler.rb +13 -13
  174. data/lib/active_record/relation/predicate_builder/association_query_value.rb +5 -9
  175. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
  176. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +11 -10
  177. data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
  178. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  179. data/lib/active_record/relation/predicate_builder.rb +62 -45
  180. data/lib/active_record/relation/query_attribute.rb +13 -8
  181. data/lib/active_record/relation/query_methods.rb +476 -187
  182. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  183. data/lib/active_record/relation/spawn_methods.rb +9 -9
  184. data/lib/active_record/relation/where_clause.rb +115 -62
  185. data/lib/active_record/relation.rb +379 -115
  186. data/lib/active_record/result.rb +64 -38
  187. data/lib/active_record/runtime_registry.rb +2 -2
  188. data/lib/active_record/sanitization.rb +22 -41
  189. data/lib/active_record/schema.rb +2 -11
  190. data/lib/active_record/schema_dumper.rb +54 -9
  191. data/lib/active_record/schema_migration.rb +7 -9
  192. data/lib/active_record/scoping/default.rb +4 -8
  193. data/lib/active_record/scoping/named.rb +17 -24
  194. data/lib/active_record/scoping.rb +8 -9
  195. data/lib/active_record/secure_token.rb +16 -8
  196. data/lib/active_record/serialization.rb +5 -3
  197. data/lib/active_record/signed_id.rb +116 -0
  198. data/lib/active_record/statement_cache.rb +49 -6
  199. data/lib/active_record/store.rb +88 -9
  200. data/lib/active_record/suppressor.rb +2 -2
  201. data/lib/active_record/table_metadata.rb +42 -43
  202. data/lib/active_record/tasks/database_tasks.rb +277 -81
  203. data/lib/active_record/tasks/mysql_database_tasks.rb +37 -39
  204. data/lib/active_record/tasks/postgresql_database_tasks.rb +27 -32
  205. data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -17
  206. data/lib/active_record/test_databases.rb +24 -0
  207. data/lib/active_record/test_fixtures.rb +287 -0
  208. data/lib/active_record/timestamp.rb +43 -32
  209. data/lib/active_record/touch_later.rb +23 -22
  210. data/lib/active_record/transactions.rb +62 -118
  211. data/lib/active_record/translation.rb +1 -1
  212. data/lib/active_record/type/adapter_specific_registry.rb +3 -13
  213. data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
  214. data/lib/active_record/type/serialized.rb +6 -3
  215. data/lib/active_record/type/time.rb +10 -0
  216. data/lib/active_record/type/type_map.rb +0 -1
  217. data/lib/active_record/type/unsigned_integer.rb +0 -1
  218. data/lib/active_record/type.rb +10 -5
  219. data/lib/active_record/type_caster/connection.rb +15 -15
  220. data/lib/active_record/type_caster/map.rb +8 -8
  221. data/lib/active_record/validations/associated.rb +1 -2
  222. data/lib/active_record/validations/numericality.rb +35 -0
  223. data/lib/active_record/validations/uniqueness.rb +38 -30
  224. data/lib/active_record/validations.rb +4 -3
  225. data/lib/active_record.rb +13 -12
  226. data/lib/arel/alias_predication.rb +9 -0
  227. data/lib/arel/attributes/attribute.rb +41 -0
  228. data/lib/arel/collectors/bind.rb +29 -0
  229. data/lib/arel/collectors/composite.rb +39 -0
  230. data/lib/arel/collectors/plain_string.rb +20 -0
  231. data/lib/arel/collectors/sql_string.rb +27 -0
  232. data/lib/arel/collectors/substitute_binds.rb +35 -0
  233. data/lib/arel/crud.rb +42 -0
  234. data/lib/arel/delete_manager.rb +18 -0
  235. data/lib/arel/errors.rb +9 -0
  236. data/lib/arel/expressions.rb +29 -0
  237. data/lib/arel/factory_methods.rb +49 -0
  238. data/lib/arel/insert_manager.rb +49 -0
  239. data/lib/arel/math.rb +45 -0
  240. data/lib/arel/nodes/and.rb +32 -0
  241. data/lib/arel/nodes/ascending.rb +23 -0
  242. data/lib/arel/nodes/binary.rb +126 -0
  243. data/lib/arel/nodes/bind_param.rb +44 -0
  244. data/lib/arel/nodes/case.rb +55 -0
  245. data/lib/arel/nodes/casted.rb +62 -0
  246. data/lib/arel/nodes/comment.rb +29 -0
  247. data/lib/arel/nodes/count.rb +12 -0
  248. data/lib/arel/nodes/delete_statement.rb +45 -0
  249. data/lib/arel/nodes/descending.rb +23 -0
  250. data/lib/arel/nodes/equality.rb +15 -0
  251. data/lib/arel/nodes/extract.rb +24 -0
  252. data/lib/arel/nodes/false.rb +16 -0
  253. data/lib/arel/nodes/full_outer_join.rb +8 -0
  254. data/lib/arel/nodes/function.rb +44 -0
  255. data/lib/arel/nodes/grouping.rb +11 -0
  256. data/lib/arel/nodes/homogeneous_in.rb +76 -0
  257. data/lib/arel/nodes/in.rb +15 -0
  258. data/lib/arel/nodes/infix_operation.rb +92 -0
  259. data/lib/arel/nodes/inner_join.rb +8 -0
  260. data/lib/arel/nodes/insert_statement.rb +37 -0
  261. data/lib/arel/nodes/join_source.rb +20 -0
  262. data/lib/arel/nodes/matches.rb +18 -0
  263. data/lib/arel/nodes/named_function.rb +23 -0
  264. data/lib/arel/nodes/node.rb +51 -0
  265. data/lib/arel/nodes/node_expression.rb +13 -0
  266. data/lib/arel/nodes/ordering.rb +27 -0
  267. data/lib/arel/nodes/outer_join.rb +8 -0
  268. data/lib/arel/nodes/over.rb +15 -0
  269. data/lib/arel/nodes/regexp.rb +16 -0
  270. data/lib/arel/nodes/right_outer_join.rb +8 -0
  271. data/lib/arel/nodes/select_core.rb +67 -0
  272. data/lib/arel/nodes/select_statement.rb +41 -0
  273. data/lib/arel/nodes/sql_literal.rb +19 -0
  274. data/lib/arel/nodes/string_join.rb +11 -0
  275. data/lib/arel/nodes/table_alias.rb +31 -0
  276. data/lib/arel/nodes/terminal.rb +16 -0
  277. data/lib/arel/nodes/true.rb +16 -0
  278. data/lib/arel/nodes/unary.rb +44 -0
  279. data/lib/arel/nodes/unary_operation.rb +20 -0
  280. data/lib/arel/nodes/unqualified_column.rb +22 -0
  281. data/lib/arel/nodes/update_statement.rb +41 -0
  282. data/lib/arel/nodes/values_list.rb +9 -0
  283. data/lib/arel/nodes/window.rb +126 -0
  284. data/lib/arel/nodes/with.rb +11 -0
  285. data/lib/arel/nodes.rb +70 -0
  286. data/lib/arel/order_predications.rb +13 -0
  287. data/lib/arel/predications.rb +250 -0
  288. data/lib/arel/select_manager.rb +270 -0
  289. data/lib/arel/table.rb +118 -0
  290. data/lib/arel/tree_manager.rb +72 -0
  291. data/lib/arel/update_manager.rb +34 -0
  292. data/lib/arel/visitors/dot.rb +308 -0
  293. data/lib/arel/visitors/mysql.rb +93 -0
  294. data/lib/arel/visitors/postgresql.rb +120 -0
  295. data/lib/arel/visitors/sqlite.rb +38 -0
  296. data/lib/arel/visitors/to_sql.rb +899 -0
  297. data/lib/arel/visitors/visitor.rb +45 -0
  298. data/lib/arel/visitors.rb +13 -0
  299. data/lib/arel/window_predications.rb +9 -0
  300. data/lib/arel.rb +54 -0
  301. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  302. data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -5
  303. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +3 -1
  304. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +7 -5
  305. data/lib/rails/generators/active_record/migration.rb +19 -2
  306. data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
  307. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  308. data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
  309. metadata +116 -30
  310. data/lib/active_record/attribute_decorators.rb +0 -90
  311. data/lib/active_record/collection_cache_key.rb +0 -53
  312. data/lib/active_record/connection_adapters/connection_specification.rb +0 -287
  313. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -33
  314. data/lib/active_record/define_callbacks.rb +0 -22
  315. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -19
  316. data/lib/active_record/relation/where_clause_factory.rb +0 -34
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/core_ext/enumerable"
3
4
  require "active_support/core_ext/hash/indifferent_access"
4
5
  require "active_support/core_ext/string/filters"
6
+ require "active_support/parameter_filter"
5
7
  require "concurrent/map"
6
8
 
7
9
  module ActiveRecord
@@ -24,9 +26,21 @@ module ActiveRecord
24
26
  # their relevant queries. Defaults to false.
25
27
  mattr_accessor :verbose_query_logs, instance_writer: false, default: false
26
28
 
29
+ ##
30
+ # :singleton-method:
31
+ #
32
+ # Specifies the names of the queues used by background jobs.
33
+ mattr_accessor :queues, instance_accessor: false, default: {}
34
+
35
+ ##
36
+ # :singleton-method:
37
+ #
38
+ # Specifies the job used to destroy associations in the background
39
+ class_attribute :destroy_association_async_job, instance_writer: false, instance_predicate: false, default: false
40
+
27
41
  ##
28
42
  # Contains the database configuration - as is typically stored in config/database.yml -
29
- # as a Hash.
43
+ # as an ActiveRecord::DatabaseConfigurations object.
30
44
  #
31
45
  # For example, the following database.yml...
32
46
  #
@@ -40,22 +54,18 @@ module ActiveRecord
40
54
  #
41
55
  # ...would result in ActiveRecord::Base.configurations to look like this:
42
56
  #
43
- # {
44
- # 'development' => {
45
- # 'adapter' => 'sqlite3',
46
- # 'database' => 'db/development.sqlite3'
47
- # },
48
- # 'production' => {
49
- # 'adapter' => 'sqlite3',
50
- # 'database' => 'db/production.sqlite3'
51
- # }
52
- # }
57
+ # #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
58
+ # #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
59
+ # @name="primary", @config={adapter: "sqlite3", database: "db/development.sqlite3"}>,
60
+ # #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbdea90 @env_name="production",
61
+ # @name="primary", @config={adapter: "sqlite3", database: "db/production.sqlite3"}>
62
+ # ]>
53
63
  def self.configurations=(config)
54
- @@configurations = ActiveRecord::ConnectionHandling::MergeAndResolveDefaultUrlConfig.new(config).resolve
64
+ @@configurations = ActiveRecord::DatabaseConfigurations.new(config)
55
65
  end
56
66
  self.configurations = {}
57
67
 
58
- # Returns fully resolved configurations hash
68
+ # Returns fully resolved ActiveRecord::DatabaseConfigurations object
59
69
  def self.configurations
60
70
  @@configurations
61
71
  end
@@ -83,14 +93,6 @@ module ActiveRecord
83
93
  # scope being ignored is error-worthy, rather than a warning.
84
94
  mattr_accessor :error_on_ignored_order, instance_writer: false, default: false
85
95
 
86
- # :singleton-method:
87
- # Specify the behavior for unsafe raw query methods. Values are as follows
88
- # deprecated - Warnings are logged when unsafe raw SQL is passed to
89
- # query methods.
90
- # disabled - Unsafe raw SQL passed to query methods results in
91
- # UnknownAttributeReference exception.
92
- mattr_accessor :allow_unsafe_raw_sql, instance_writer: false, default: :deprecated
93
-
94
96
  ##
95
97
  # :singleton-method:
96
98
  # Specify whether or not to use timestamps for migration versions
@@ -99,14 +101,14 @@ module ActiveRecord
99
101
  ##
100
102
  # :singleton-method:
101
103
  # Specify whether schema dump should happen at the end of the
102
- # db:migrate rake task. This is true by default, which is useful for the
104
+ # db:migrate rails command. This is true by default, which is useful for the
103
105
  # development environment. This should ideally be false in the production
104
106
  # environment where dumping schema is rarely needed.
105
107
  mattr_accessor :dump_schema_after_migration, instance_writer: false, default: true
106
108
 
107
109
  ##
108
110
  # :singleton-method:
109
- # Specifies which database schemas to dump when calling db:structure:dump.
111
+ # Specifies which database schemas to dump when calling db:schema:dump.
110
112
  # If the value is :schema_search_path (the default), any schemas listed in
111
113
  # schema_search_path are dumped. Use :all to dump all schemas regardless
112
114
  # of schema_search_path, or a string of comma separated schemas for a
@@ -121,12 +123,38 @@ module ActiveRecord
121
123
  # potentially cause memory bloat.
122
124
  mattr_accessor :warn_on_records_fetched_greater_than, instance_writer: false
123
125
 
126
+ ##
127
+ # :singleton-method:
128
+ # Show a warning when Rails couldn't parse your database.yml
129
+ # for multiple databases.
130
+ mattr_accessor :suppress_multiple_database_warning, instance_writer: false, default: false
131
+
124
132
  mattr_accessor :maintain_test_schema, instance_accessor: false
125
133
 
126
- mattr_accessor :belongs_to_required_by_default, instance_accessor: false
134
+ class_attribute :belongs_to_required_by_default, instance_accessor: false
127
135
 
128
136
  ##
129
137
  # :singleton-method:
138
+ # Set the application to log or raise when an association violates strict loading.
139
+ # Defaults to :raise.
140
+ mattr_accessor :action_on_strict_loading_violation, instance_accessor: false, default: :raise
141
+
142
+ class_attribute :strict_loading_by_default, instance_accessor: false, default: false
143
+
144
+ mattr_accessor :writing_role, instance_accessor: false, default: :writing
145
+
146
+ mattr_accessor :reading_role, instance_accessor: false, default: :reading
147
+
148
+ mattr_accessor :has_many_inversing, instance_accessor: false, default: false
149
+
150
+ class_attribute :default_connection_handler, instance_writer: false
151
+
152
+ class_attribute :default_role, instance_writer: false
153
+
154
+ class_attribute :default_shard, instance_writer: false
155
+
156
+ mattr_accessor :legacy_connection_handling, instance_writer: false, default: true
157
+
130
158
  # Application configurable boolean that instructs the YAML Coder to use
131
159
  # an unsafe load if set to true.
132
160
  mattr_accessor :use_yaml_unsafe_load, instance_writer: false, default: false
@@ -135,25 +163,153 @@ module ActiveRecord
135
163
  # to Psych safe_load in the YAML Coder
136
164
  mattr_accessor :yaml_column_permitted_classes, instance_writer: false, default: []
137
165
 
138
- class_attribute :default_connection_handler, instance_writer: false
166
+ self.filter_attributes = []
139
167
 
140
168
  def self.connection_handler
141
- ActiveRecord::RuntimeRegistry.connection_handler || default_connection_handler
169
+ Thread.current.thread_variable_get(:ar_connection_handler) || default_connection_handler
142
170
  end
143
171
 
144
172
  def self.connection_handler=(handler)
145
- ActiveRecord::RuntimeRegistry.connection_handler = handler
173
+ Thread.current.thread_variable_set(:ar_connection_handler, handler)
146
174
  end
147
175
 
148
- self.default_connection_handler = ConnectionAdapters::ConnectionHandler.new
149
- end
176
+ def self.connection_handlers
177
+ unless legacy_connection_handling
178
+ raise NotImplementedError, "The new connection handling does not support accessing multiple connection handlers."
179
+ end
150
180
 
151
- module ClassMethods # :nodoc:
152
- def allocate
153
- define_attribute_methods
154
- super
181
+ @@connection_handlers ||= {}
182
+ end
183
+
184
+ def self.connection_handlers=(handlers)
185
+ unless legacy_connection_handling
186
+ raise NotImplementedError, "The new connection handling does not setting support multiple connection handlers."
187
+ end
188
+
189
+ @@connection_handlers = handlers
190
+ end
191
+
192
+ # Returns the symbol representing the current connected role.
193
+ #
194
+ # ActiveRecord::Base.connected_to(role: :writing) do
195
+ # ActiveRecord::Base.current_role #=> :writing
196
+ # end
197
+ #
198
+ # ActiveRecord::Base.connected_to(role: :reading) do
199
+ # ActiveRecord::Base.current_role #=> :reading
200
+ # end
201
+ def self.current_role
202
+ if ActiveRecord::Base.legacy_connection_handling
203
+ connection_handlers.key(connection_handler) || default_role
204
+ else
205
+ connected_to_stack.reverse_each do |hash|
206
+ return hash[:role] if hash[:role] && hash[:klasses].include?(Base)
207
+ return hash[:role] if hash[:role] && hash[:klasses].include?(connection_classes)
208
+ end
209
+
210
+ default_role
211
+ end
212
+ end
213
+
214
+ # Returns the symbol representing the current connected shard.
215
+ #
216
+ # ActiveRecord::Base.connected_to(role: :reading) do
217
+ # ActiveRecord::Base.current_shard #=> :default
218
+ # end
219
+ #
220
+ # ActiveRecord::Base.connected_to(role: :writing, shard: :one) do
221
+ # ActiveRecord::Base.current_shard #=> :one
222
+ # end
223
+ def self.current_shard
224
+ connected_to_stack.reverse_each do |hash|
225
+ return hash[:shard] if hash[:shard] && hash[:klasses].include?(Base)
226
+ return hash[:shard] if hash[:shard] && hash[:klasses].include?(connection_classes)
227
+ end
228
+
229
+ default_shard
230
+ end
231
+
232
+ # Returns the symbol representing the current setting for
233
+ # preventing writes.
234
+ #
235
+ # ActiveRecord::Base.connected_to(role: :reading) do
236
+ # ActiveRecord::Base.current_preventing_writes #=> true
237
+ # end
238
+ #
239
+ # ActiveRecord::Base.connected_to(role: :writing) do
240
+ # ActiveRecord::Base.current_preventing_writes #=> false
241
+ # end
242
+ def self.current_preventing_writes
243
+ if legacy_connection_handling
244
+ connection_handler.prevent_writes
245
+ else
246
+ connected_to_stack.reverse_each do |hash|
247
+ return hash[:prevent_writes] if !hash[:prevent_writes].nil? && hash[:klasses].include?(Base)
248
+ return hash[:prevent_writes] if !hash[:prevent_writes].nil? && hash[:klasses].include?(connection_classes)
249
+ end
250
+
251
+ false
252
+ end
253
+ end
254
+
255
+ def self.connected_to_stack # :nodoc:
256
+ if connected_to_stack = Thread.current.thread_variable_get(:ar_connected_to_stack)
257
+ connected_to_stack
258
+ else
259
+ connected_to_stack = Concurrent::Array.new
260
+ Thread.current.thread_variable_set(:ar_connected_to_stack, connected_to_stack)
261
+ connected_to_stack
262
+ end
263
+ end
264
+
265
+ def self.connection_class=(b) # :nodoc:
266
+ @connection_class = b
267
+ end
268
+
269
+ def self.connection_class # :nodoc
270
+ @connection_class ||= false
271
+ end
272
+
273
+ def self.connection_class? # :nodoc:
274
+ self.connection_class
275
+ end
276
+
277
+ def self.connection_classes # :nodoc:
278
+ klass = self
279
+
280
+ until klass == Base
281
+ break if klass.connection_class?
282
+ klass = klass.superclass
283
+ end
284
+
285
+ klass
286
+ end
287
+
288
+ def self.allow_unsafe_raw_sql # :nodoc:
289
+ ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql is deprecated and will be removed in Rails 7.0")
290
+ end
291
+
292
+ def self.allow_unsafe_raw_sql=(value) # :nodoc:
293
+ ActiveSupport::Deprecation.warn("ActiveRecord::Base.allow_unsafe_raw_sql= is deprecated and will be removed in Rails 7.0")
155
294
  end
156
295
 
296
+ self.default_connection_handler = ConnectionAdapters::ConnectionHandler.new
297
+ self.default_role = writing_role
298
+ self.default_shard = :default
299
+
300
+ def self.strict_loading_violation!(owner:, reflection:) # :nodoc:
301
+ case action_on_strict_loading_violation
302
+ when :raise
303
+ message = "`#{owner}` is marked for strict_loading. The `#{reflection.klass}` association named `:#{reflection.name}` cannot be lazily loaded."
304
+ raise ActiveRecord::StrictLoadingViolationError.new(message)
305
+ when :log
306
+ name = "strict_loading_violation.active_record"
307
+ ActiveSupport::Notifications.instrument(name, owner: owner, reflection: reflection)
308
+ end
309
+ end
310
+ end
311
+
312
+ module ClassMethods
157
313
  def initialize_find_by_cache # :nodoc:
158
314
  @find_by_statement_cache = { true => Concurrent::Map.new, false => Concurrent::Map.new }
159
315
  end
@@ -161,16 +317,20 @@ module ActiveRecord
161
317
  def inherited(child_class) # :nodoc:
162
318
  # initialize cache at class definition for thread safety
163
319
  child_class.initialize_find_by_cache
320
+ unless child_class.base_class?
321
+ klass = self
322
+ until klass.base_class?
323
+ klass.initialize_find_by_cache
324
+ klass = klass.superclass
325
+ end
326
+ end
164
327
  super
165
328
  end
166
329
 
167
330
  def find(*ids) # :nodoc:
168
331
  # We don't have cache keys for this stuff yet
169
332
  return super unless ids.length == 1
170
- return super if block_given? ||
171
- primary_key.nil? ||
172
- scope_attributes? ||
173
- columns_hash.include?(inheritance_column)
333
+ return super if block_given? || primary_key.nil? || scope_attributes?
174
334
 
175
335
  id = ids.first
176
336
 
@@ -182,44 +342,49 @@ module ActiveRecord
182
342
  where(key => params.bind).limit(1)
183
343
  }
184
344
 
185
- record = statement.execute([id], connection).first
186
- unless record
187
- raise RecordNotFound.new("Couldn't find #{name} with '#{primary_key}'=#{id}",
188
- name, primary_key, id)
189
- end
190
- record
191
- rescue ::RangeError
192
- raise RecordNotFound.new("Couldn't find #{name} with an out of range value for '#{primary_key}'",
193
- name, primary_key)
345
+ statement.execute([id], connection).first ||
346
+ raise(RecordNotFound.new("Couldn't find #{name} with '#{key}'=#{id}", name, key, id))
194
347
  end
195
348
 
196
349
  def find_by(*args) # :nodoc:
197
- return super if scope_attributes? || reflect_on_all_aggregations.any? ||
198
- columns_hash.key?(inheritance_column) && base_class != self
350
+ return super if scope_attributes?
199
351
 
200
352
  hash = args.first
353
+ return super unless Hash === hash
201
354
 
202
- return super if !(Hash === hash) || hash.values.any? { |v|
203
- StatementCache.unsupported_value?(v)
204
- }
355
+ hash = hash.each_with_object({}) do |(key, value), h|
356
+ key = key.to_s
357
+ key = attribute_aliases[key] || key
205
358
 
206
- # We can't cache Post.find_by(author: david) ...yet
207
- return super unless hash.keys.all? { |k| columns_hash.has_key?(k.to_s) }
359
+ return super if reflect_on_aggregation(key)
208
360
 
209
- keys = hash.keys
361
+ reflection = _reflect_on_association(key)
210
362
 
363
+ if !reflection
364
+ value = value.id if value.respond_to?(:id)
365
+ elsif reflection.belongs_to? && !reflection.polymorphic?
366
+ key = reflection.join_foreign_key
367
+ pkey = reflection.join_primary_key
368
+ value = value.public_send(pkey) if value.respond_to?(pkey)
369
+ end
370
+
371
+ if !columns_hash.key?(key) || StatementCache.unsupported_value?(value)
372
+ return super
373
+ end
374
+
375
+ h[key] = value
376
+ end
377
+
378
+ keys = hash.keys
211
379
  statement = cached_find_by_statement(keys) { |params|
212
- wheres = keys.each_with_object({}) { |param, o|
213
- o[param] = params.bind
214
- }
380
+ wheres = keys.index_with { params.bind }
215
381
  where(wheres).limit(1)
216
382
  }
383
+
217
384
  begin
218
385
  statement.execute(hash.values, connection).first
219
386
  rescue TypeError
220
387
  raise ActiveRecord::StatementInvalid
221
- rescue ::RangeError
222
- nil
223
388
  end
224
389
  end
225
390
 
@@ -231,7 +396,7 @@ module ActiveRecord
231
396
  generated_association_methods
232
397
  end
233
398
 
234
- def generated_association_methods
399
+ def generated_association_methods # :nodoc:
235
400
  @generated_association_methods ||= begin
236
401
  mod = const_set(:GeneratedAssociationMethods, Module.new)
237
402
  private_constant :GeneratedAssociationMethods
@@ -241,8 +406,34 @@ module ActiveRecord
241
406
  end
242
407
  end
243
408
 
409
+ # Returns columns which shouldn't be exposed while calling +#inspect+.
410
+ def filter_attributes
411
+ if defined?(@filter_attributes)
412
+ @filter_attributes
413
+ else
414
+ superclass.filter_attributes
415
+ end
416
+ end
417
+
418
+ # Specifies columns which shouldn't be exposed while calling +#inspect+.
419
+ def filter_attributes=(filter_attributes)
420
+ @inspection_filter = nil
421
+ @filter_attributes = filter_attributes
422
+ end
423
+
424
+ def inspection_filter # :nodoc:
425
+ if defined?(@filter_attributes)
426
+ @inspection_filter ||= begin
427
+ mask = InspectionMask.new(ActiveSupport::ParameterFilter::FILTERED)
428
+ ActiveSupport::ParameterFilter.new(@filter_attributes, mask: mask)
429
+ end
430
+ else
431
+ superclass.inspection_filter
432
+ end
433
+ end
434
+
244
435
  # Returns a string like 'Post(id:integer, title:string, body:text)'
245
- def inspect
436
+ def inspect # :nodoc:
246
437
  if self == Base
247
438
  super
248
439
  elsif abstract_class?
@@ -258,7 +449,7 @@ module ActiveRecord
258
449
  end
259
450
 
260
451
  # Overwrite the default class equality method to provide support for decorated models.
261
- def ===(object)
452
+ def ===(object) # :nodoc:
262
453
  object.is_a?(self)
263
454
  end
264
455
 
@@ -268,13 +459,13 @@ module ActiveRecord
268
459
  # scope :published_and_commented, -> { published.and(arel_table[:comments_count].gt(0)) }
269
460
  # end
270
461
  def arel_table # :nodoc:
271
- @arel_table ||= Arel::Table.new(table_name, type_caster: type_caster)
462
+ @arel_table ||= Arel::Table.new(table_name, klass: self)
272
463
  end
273
464
 
274
465
  def arel_attribute(name, table = arel_table) # :nodoc:
275
- name = attribute_alias(name) if attribute_alias?(name)
276
466
  table[name]
277
467
  end
468
+ deprecate :arel_attribute
278
469
 
279
470
  def predicate_builder # :nodoc:
280
471
  @predicate_builder ||= PredicateBuilder.new(table_metadata)
@@ -284,19 +475,21 @@ module ActiveRecord
284
475
  TypeCaster::Map.new(self)
285
476
  end
286
477
 
287
- private
478
+ def _internal? # :nodoc:
479
+ false
480
+ end
288
481
 
289
- def cached_find_by_statement(key, &block)
290
- cache = @find_by_statement_cache[connection.prepared_statements]
291
- cache.compute_if_absent(key) { StatementCache.create(connection, &block) }
292
- end
482
+ def cached_find_by_statement(key, &block) # :nodoc:
483
+ cache = @find_by_statement_cache[connection.prepared_statements]
484
+ cache.compute_if_absent(key) { StatementCache.create(connection, &block) }
485
+ end
293
486
 
487
+ private
294
488
  def relation
295
489
  relation = Relation.create(self)
296
490
 
297
491
  if finder_needs_type_condition? && !ignore_default_scope?
298
492
  relation.where!(type_condition)
299
- relation.create_with!(inheritance_column.to_s => sti_name)
300
493
  else
301
494
  relation
302
495
  end
@@ -316,7 +509,7 @@ module ActiveRecord
316
509
  # # Instantiates a single new object
317
510
  # User.new(first_name: 'Jamie')
318
511
  def initialize(attributes = nil)
319
- self.class.define_attribute_methods
512
+ @new_record = true
320
513
  @attributes = self.class._default_attributes.deep_dup
321
514
 
322
515
  init_internals
@@ -342,15 +535,21 @@ module ActiveRecord
342
535
  # post = Post.allocate
343
536
  # post.init_with(coder)
344
537
  # post.title # => 'hello world'
345
- def init_with(coder)
538
+ def init_with(coder, &block)
346
539
  coder = LegacyYamlAdapter.convert(self.class, coder)
347
- @attributes = self.class.yaml_encoder.decode(coder)
348
-
349
- init_internals
540
+ attributes = self.class.yaml_encoder.decode(coder)
541
+ init_with_attributes(attributes, coder["new_record"], &block)
542
+ end
350
543
 
351
- @new_record = coder["new_record"]
544
+ ##
545
+ # Initialize an empty model object from +attributes+.
546
+ # +attributes+ should be an attributes object, and unlike the
547
+ # `initialize` method, no assignment calls are made per attribute.
548
+ def init_with_attributes(attributes, new_record = false) # :nodoc:
549
+ @new_record = new_record
550
+ @attributes = attributes
352
551
 
353
- self.class.define_attribute_methods
552
+ init_internals
354
553
 
355
554
  yield self if block_given?
356
555
 
@@ -389,14 +588,14 @@ module ActiveRecord
389
588
  ##
390
589
  def initialize_dup(other) # :nodoc:
391
590
  @attributes = @attributes.deep_dup
392
- @attributes.reset(self.class.primary_key)
591
+ @attributes.reset(@primary_key)
393
592
 
394
593
  _run_initialize_callbacks
395
594
 
396
595
  @new_record = true
596
+ @previously_new_record = false
397
597
  @destroyed = false
398
- @_start_transaction_state = {}
399
- @transaction_state = nil
598
+ @_start_transaction_state = nil
400
599
 
401
600
  super
402
601
  end
@@ -468,12 +667,35 @@ module ActiveRecord
468
667
  end
469
668
  end
470
669
 
471
- # Returns +true+ if the record is read only. Records loaded through joins with piggy-back
472
- # attributes will be marked as read only since they cannot be saved.
670
+ def present? # :nodoc:
671
+ true
672
+ end
673
+
674
+ def blank? # :nodoc:
675
+ false
676
+ end
677
+
678
+ # Returns +true+ if the record is read only.
473
679
  def readonly?
474
680
  @readonly
475
681
  end
476
682
 
683
+ # Returns +true+ if the record is in strict_loading mode.
684
+ def strict_loading?
685
+ @strict_loading
686
+ end
687
+
688
+ # Sets the record to strict_loading mode. This will raise an error
689
+ # if the record tries to lazily load an association.
690
+ #
691
+ # user = User.first
692
+ # user.strict_loading!
693
+ # user.comments.to_a
694
+ # => ActiveRecord::StrictLoadingViolationError
695
+ def strict_loading!
696
+ @strict_loading = true
697
+ end
698
+
477
699
  # Marks this record as read only.
478
700
  def readonly!
479
701
  @readonly = true
@@ -489,7 +711,7 @@ module ActiveRecord
489
711
  # allocated but not initialized.
490
712
  inspection = if defined?(@attributes) && @attributes
491
713
  self.class.attribute_names.collect do |name|
492
- if has_attribute?(name)
714
+ if _has_attribute?(name)
493
715
  "#{name}: #{attribute_for_inspect(name)}"
494
716
  end
495
717
  end.compact.join(", ")
@@ -506,15 +728,16 @@ module ActiveRecord
506
728
  return super if custom_inspect_method_defined?
507
729
  pp.object_address_group(self) do
508
730
  if defined?(@attributes) && @attributes
509
- column_names = self.class.column_names.select { |name| has_attribute?(name) || new_record? }
510
- pp.seplist(column_names, proc { pp.text "," }) do |column_name|
511
- column_value = read_attribute(column_name)
731
+ attr_names = self.class.attribute_names.select { |name| _has_attribute?(name) }
732
+ pp.seplist(attr_names, proc { pp.text "," }) do |attr_name|
512
733
  pp.breakable " "
513
734
  pp.group(1) do
514
- pp.text column_name
735
+ pp.text attr_name
515
736
  pp.text ":"
516
737
  pp.breakable
517
- pp.pp column_value
738
+ value = _read_attribute(attr_name)
739
+ value = inspection_filter.filter_param(attr_name, value) unless value.nil?
740
+ pp.pp value
518
741
  end
519
742
  end
520
743
  else
@@ -526,11 +749,15 @@ module ActiveRecord
526
749
 
527
750
  # Returns a hash of the given methods with their names as keys and returned values as values.
528
751
  def slice(*methods)
529
- Hash[methods.flatten.map! { |method| [method, public_send(method)] }].with_indifferent_access
752
+ methods.flatten.index_with { |method| public_send(method) }.with_indifferent_access
530
753
  end
531
754
 
532
- private
755
+ # Returns an array of the values returned by the given methods.
756
+ def values_at(*methods)
757
+ methods.flatten.map! { |method| public_send(method) }
758
+ end
533
759
 
760
+ private
534
761
  # +Array#flatten+ will call +#to_ary+ (recursively) on each of the elements of
535
762
  # the array, and then rescues from the possible +NoMethodError+. If those elements are
536
763
  # +ActiveRecord::Base+'s, then this triggers the various +method_missing+'s that we have,
@@ -544,26 +771,34 @@ module ActiveRecord
544
771
  end
545
772
 
546
773
  def init_internals
774
+ @primary_key = self.class.primary_key
547
775
  @readonly = false
776
+ @previously_new_record = false
548
777
  @destroyed = false
549
778
  @marked_for_destruction = false
550
779
  @destroyed_by_association = nil
551
- @new_record = true
552
- @_start_transaction_state = {}
553
- @transaction_state = nil
780
+ @_start_transaction_state = nil
781
+ @strict_loading = self.class.strict_loading_by_default
782
+
783
+ self.class.define_attribute_methods
554
784
  end
555
785
 
556
786
  def initialize_internals_callback
557
787
  end
558
788
 
559
- def thaw
560
- if frozen?
561
- @attributes = @attributes.dup
789
+ def custom_inspect_method_defined?
790
+ self.class.instance_method(:inspect).owner != ActiveRecord::Base.instance_method(:inspect).owner
791
+ end
792
+
793
+ class InspectionMask < DelegateClass(::String)
794
+ def pretty_print(pp)
795
+ pp.text __getobj__
562
796
  end
563
797
  end
798
+ private_constant :InspectionMask
564
799
 
565
- def custom_inspect_method_defined?
566
- self.class.instance_method(:inspect).owner != ActiveRecord::Base.instance_method(:inspect).owner
800
+ def inspection_filter
801
+ self.class.inspection_filter
567
802
  end
568
803
  end
569
804
  end