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,4 +1,6 @@
1
- require 'set'
1
+ # frozen_string_literal: true
2
+
3
+ require "set"
2
4
 
3
5
  module ActiveRecord
4
6
  module AttributeMethods
@@ -8,134 +10,125 @@ module ActiveRecord
8
10
  # Returns this record's primary key value wrapped in an array if one is
9
11
  # available.
10
12
  def to_key
11
- sync_with_transaction_state
12
- key = self.id
13
+ key = id
13
14
  [key] if key
14
15
  end
15
16
 
16
- # Returns the primary key value.
17
+ # Returns the primary key column's value.
17
18
  def id
18
- if pk = self.class.primary_key
19
- sync_with_transaction_state
20
- _read_attribute(pk)
21
- end
19
+ _read_attribute(@primary_key)
22
20
  end
23
21
 
24
- # Sets the primary key value.
22
+ # Sets the primary key column's value.
25
23
  def id=(value)
26
- sync_with_transaction_state
27
- write_attribute(self.class.primary_key, value) if self.class.primary_key
24
+ _write_attribute(@primary_key, value)
28
25
  end
29
26
 
30
- # Queries the primary key value.
27
+ # Queries the primary key column's value.
31
28
  def id?
32
- sync_with_transaction_state
33
- query_attribute(self.class.primary_key)
29
+ query_attribute(@primary_key)
34
30
  end
35
31
 
36
- # Returns the primary key value before type cast.
32
+ # Returns the primary key column's value before type cast.
37
33
  def id_before_type_cast
38
- sync_with_transaction_state
39
- read_attribute_before_type_cast(self.class.primary_key)
34
+ read_attribute_before_type_cast(@primary_key)
40
35
  end
41
36
 
42
- # Returns the primary key previous value.
37
+ # Returns the primary key column's previous value.
43
38
  def id_was
44
- sync_with_transaction_state
45
- attribute_was(self.class.primary_key)
39
+ attribute_was(@primary_key)
46
40
  end
47
41
 
48
- protected
49
-
50
- def attribute_method?(attr_name)
51
- attr_name == 'id' || super
42
+ # Returns the primary key column's value from the database.
43
+ def id_in_database
44
+ attribute_in_database(@primary_key)
52
45
  end
53
46
 
54
- module ClassMethods
55
- def define_method_attribute(attr_name)
56
- super
57
-
58
- if attr_name == primary_key && attr_name != 'id'
59
- generated_attribute_methods.send(:alias_method, :id, primary_key)
60
- end
47
+ private
48
+ def attribute_method?(attr_name)
49
+ attr_name == "id" || super
61
50
  end
62
51
 
63
- ID_ATTRIBUTE_METHODS = %w(id id= id? id_before_type_cast id_was).to_set
52
+ module ClassMethods
53
+ ID_ATTRIBUTE_METHODS = %w(id id= id? id_before_type_cast id_was id_in_database).to_set
64
54
 
65
- def dangerous_attribute_method?(method_name)
66
- super && !ID_ATTRIBUTE_METHODS.include?(method_name)
67
- end
55
+ def instance_method_already_implemented?(method_name)
56
+ super || primary_key && ID_ATTRIBUTE_METHODS.include?(method_name)
57
+ end
68
58
 
69
- # Defines the primary key field -- can be overridden in subclasses.
70
- # Overwriting will negate any effect of the +primary_key_prefix_type+
71
- # setting, though.
72
- def primary_key
73
- @primary_key = reset_primary_key unless defined? @primary_key
74
- @primary_key
75
- end
59
+ def dangerous_attribute_method?(method_name)
60
+ super && !ID_ATTRIBUTE_METHODS.include?(method_name)
61
+ end
76
62
 
77
- # Returns a quoted version of the primary key name, used to construct
78
- # SQL statements.
79
- def quoted_primary_key
80
- @quoted_primary_key ||= connection.quote_column_name(primary_key)
81
- end
63
+ # Defines the primary key field -- can be overridden in subclasses.
64
+ # Overwriting will negate any effect of the +primary_key_prefix_type+
65
+ # setting, though.
66
+ def primary_key
67
+ @primary_key = reset_primary_key unless defined? @primary_key
68
+ @primary_key
69
+ end
82
70
 
83
- def reset_primary_key #:nodoc:
84
- if self == base_class
85
- self.primary_key = get_primary_key(base_class.name)
86
- else
87
- self.primary_key = base_class.primary_key
71
+ # Returns a quoted version of the primary key name, used to construct
72
+ # SQL statements.
73
+ def quoted_primary_key
74
+ @quoted_primary_key ||= connection.quote_column_name(primary_key)
88
75
  end
89
- end
90
76
 
91
- def get_primary_key(base_name) #:nodoc:
92
- if base_name && primary_key_prefix_type == :table_name
93
- base_name.foreign_key(false)
94
- elsif base_name && primary_key_prefix_type == :table_name_with_underscore
95
- base_name.foreign_key
96
- else
97
- if ActiveRecord::Base != self && table_exists?
98
- pk = connection.schema_cache.primary_keys(table_name)
99
- suppress_composite_primary_key(pk)
77
+ def reset_primary_key #:nodoc:
78
+ if base_class?
79
+ self.primary_key = get_primary_key(base_class.name)
100
80
  else
101
- 'id'
81
+ self.primary_key = base_class.primary_key
102
82
  end
103
83
  end
104
- end
105
84
 
106
- # Sets the name of the primary key column.
107
- #
108
- # class Project < ActiveRecord::Base
109
- # self.primary_key = 'sysid'
110
- # end
111
- #
112
- # You can also define the #primary_key method yourself:
113
- #
114
- # class Project < ActiveRecord::Base
115
- # def self.primary_key
116
- # 'foo_' + super
117
- # end
118
- # end
119
- #
120
- # Project.primary_key # => "foo_id"
121
- def primary_key=(value)
122
- @primary_key = value && value.to_s
123
- @quoted_primary_key = nil
124
- @attributes_builder = nil
125
- end
85
+ def get_primary_key(base_name) #:nodoc:
86
+ if base_name && primary_key_prefix_type == :table_name
87
+ base_name.foreign_key(false)
88
+ elsif base_name && primary_key_prefix_type == :table_name_with_underscore
89
+ base_name.foreign_key
90
+ else
91
+ if ActiveRecord::Base != self && table_exists?
92
+ pk = connection.schema_cache.primary_keys(table_name)
93
+ suppress_composite_primary_key(pk)
94
+ else
95
+ "id"
96
+ end
97
+ end
98
+ end
126
99
 
127
- private
100
+ # Sets the name of the primary key column.
101
+ #
102
+ # class Project < ActiveRecord::Base
103
+ # self.primary_key = 'sysid'
104
+ # end
105
+ #
106
+ # You can also define the #primary_key method yourself:
107
+ #
108
+ # class Project < ActiveRecord::Base
109
+ # def self.primary_key
110
+ # 'foo_' + super
111
+ # end
112
+ # end
113
+ #
114
+ # Project.primary_key # => "foo_id"
115
+ def primary_key=(value)
116
+ @primary_key = value && -value.to_s
117
+ @quoted_primary_key = nil
118
+ @attributes_builder = nil
119
+ end
128
120
 
129
- def suppress_composite_primary_key(pk)
130
- return pk unless pk.is_a?(Array)
121
+ private
122
+ def suppress_composite_primary_key(pk)
123
+ return pk unless pk.is_a?(Array)
131
124
 
132
- warn <<-WARNING.strip_heredoc
133
- WARNING: Active Record does not support composite primary key.
125
+ warn <<~WARNING
126
+ WARNING: Active Record does not support composite primary key.
134
127
 
135
- #{table_name} has composite primary key. Composite primary key is ignored.
136
- WARNING
128
+ #{table_name} has composite primary key. Composite primary key is ignored.
129
+ WARNING
130
+ end
137
131
  end
138
- end
139
132
  end
140
133
  end
141
134
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module AttributeMethods
3
5
  module Query
@@ -14,8 +16,7 @@ module ActiveRecord
14
16
  when true then true
15
17
  when false, nil then false
16
18
  else
17
- column = self.class.columns_hash[attr_name]
18
- if column.nil?
19
+ if !type_for_attribute(attr_name) { false }
19
20
  if Numeric === value || value !~ /[^0-9]/
20
21
  !value.to_i.zero?
21
22
  else
@@ -31,7 +32,7 @@ module ActiveRecord
31
32
  end
32
33
 
33
34
  private
34
- # Handle *? for method_missing.
35
+ # Dispatch target for <tt>*?</tt> attribute methods.
35
36
  def attribute?(attribute_name)
36
37
  query_attribute(attribute_name)
37
38
  end
@@ -1,47 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module AttributeMethods
3
5
  module Read
4
6
  extend ActiveSupport::Concern
5
7
 
6
- module ClassMethods
7
- protected
8
-
9
- # We want to generate the methods via module_eval rather than
10
- # define_method, because define_method is slower on dispatch.
11
- # Evaluating many similar methods may use more memory as the instruction
12
- # sequences are duplicated and cached (in MRI). define_method may
13
- # be slower on dispatch, but if you're careful about the closure
14
- # created, then define_method will consume much less memory.
15
- #
16
- # But sometimes the database might return columns with
17
- # characters that are not allowed in normal method names (like
18
- # 'my_column(omg)'. So to work around this we first define with
19
- # the __temp__ identifier, and then use alias method to rename
20
- # it to what we want.
21
- #
22
- # We are also defining a constant to hold the frozen string of
23
- # the attribute name. Using a constant means that we do not have
24
- # to allocate an object on each call to the attribute method.
25
- # Making it frozen means that it doesn't get duped when used to
26
- # key the @attributes in read_attribute.
27
- def define_method_attribute(name)
28
- safe_name = name.unpack('h*'.freeze).first
29
- temp_method = "__temp__#{safe_name}"
30
-
31
- ActiveRecord::AttributeMethods::AttrNames.set_name_cache safe_name, name
32
-
33
- generated_attribute_methods.module_eval <<-STR, __FILE__, __LINE__ + 1
34
- def #{temp_method}
35
- name = ::ActiveRecord::AttributeMethods::AttrNames::ATTR_#{safe_name}
36
- _read_attribute(name) { |n| missing_attribute(n, caller) }
8
+ module ClassMethods # :nodoc:
9
+ private
10
+ def define_method_attribute(name)
11
+ ActiveModel::AttributeMethods::AttrNames.define_attribute_accessor_method(
12
+ generated_attribute_methods, name
13
+ ) do |temp_method_name, attr_name_expr|
14
+ generated_attribute_methods.module_eval <<-RUBY, __FILE__, __LINE__ + 1
15
+ def #{temp_method_name}
16
+ name = #{attr_name_expr}
17
+ _read_attribute(name) { |n| missing_attribute(n, caller) }
18
+ end
19
+ RUBY
37
20
  end
38
- STR
39
-
40
- generated_attribute_methods.module_eval do
41
- alias_method name, temp_method
42
- undef_method temp_method
43
21
  end
44
- end
45
22
  end
46
23
 
47
24
  # Returns the value of the attribute identified by <tt>attr_name</tt> after
@@ -49,27 +26,21 @@ module ActiveRecord
49
26
  # to a date object, like Date.new(2004, 12, 12)).
50
27
  def read_attribute(attr_name, &block)
51
28
  name = attr_name.to_s
52
- name = self.class.primary_key if name == "id".freeze && self.class.primary_key
29
+ name = self.class.attribute_aliases[name] || name
30
+
31
+ name = @primary_key if name == "id" && @primary_key
53
32
  _read_attribute(name, &block)
54
33
  end
55
34
 
56
35
  # This method exists to avoid the expensive primary_key check internally, without
57
36
  # breaking compatibility with the read_attribute API
58
- if defined?(JRUBY_VERSION)
59
- # This form is significantly faster on JRuby, and this is one of our biggest hotspots.
60
- # https://github.com/jruby/jruby/pull/2562
61
- def _read_attribute(attr_name, &block) # :nodoc
62
- @attributes.fetch_value(attr_name.to_s, &block)
63
- end
64
- else
65
- def _read_attribute(attr_name) # :nodoc:
66
- @attributes.fetch_value(attr_name.to_s) { |n| yield n if block_given? }
67
- end
37
+ def _read_attribute(attr_name, &block) # :nodoc
38
+ sync_with_transaction_state if @transaction_state&.finalized?
39
+ @attributes.fetch_value(attr_name.to_s, &block)
68
40
  end
69
41
 
70
42
  alias :attribute :_read_attribute
71
43
  private :attribute
72
-
73
44
  end
74
45
  end
75
46
  end
@@ -1,8 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module AttributeMethods
3
5
  module Serialization
4
6
  extend ActiveSupport::Concern
5
7
 
8
+ class ColumnNotSerializableError < StandardError
9
+ def initialize(name, type)
10
+ super <<~EOS
11
+ Column `#{name}` of type #{type.class} does not support `serialize` feature.
12
+ Usually it means that you are trying to use `serialize`
13
+ on a column that already implements serialization natively.
14
+ EOS
15
+ end
16
+ end
17
+
6
18
  module ClassMethods
7
19
  # If you have an attribute that needs to be saved to the database as an
8
20
  # object, and retrieved as the same object, then specify the name of that
@@ -26,7 +38,7 @@ module ActiveRecord
26
38
  # ==== Parameters
27
39
  #
28
40
  # * +attr_name+ - The field name that should be serialized.
29
- # * +class_name_or_coder+ - Optional, a coder object, which responds to `.load` / `.dump`
41
+ # * +class_name_or_coder+ - Optional, a coder object, which responds to +.load+ and +.dump+
30
42
  # or a class name that the object type should be equal to.
31
43
  #
32
44
  # ==== Example
@@ -50,17 +62,27 @@ module ActiveRecord
50
62
  # to ensure special objects (e.g. Active Record models) are dumped correctly
51
63
  # using the #as_json hook.
52
64
  coder = if class_name_or_coder == ::JSON
53
- Coders::JSON
54
- elsif [:load, :dump].all? { |x| class_name_or_coder.respond_to?(x) }
55
- class_name_or_coder
56
- else
57
- Coders::YAMLColumn.new(class_name_or_coder)
58
- end
65
+ Coders::JSON
66
+ elsif [:load, :dump].all? { |x| class_name_or_coder.respond_to?(x) }
67
+ class_name_or_coder
68
+ else
69
+ Coders::YAMLColumn.new(attr_name, class_name_or_coder)
70
+ end
59
71
 
60
72
  decorate_attribute_type(attr_name, :serialize) do |type|
73
+ if type_incompatible_with_serialize?(type, class_name_or_coder)
74
+ raise ColumnNotSerializableError.new(attr_name, type)
75
+ end
76
+
61
77
  Type::Serialized.new(type, coder)
62
78
  end
63
79
  end
80
+
81
+ private
82
+ def type_incompatible_with_serialize?(type, class_name)
83
+ type.is_a?(ActiveRecord::Type::Json) && class_name == ::JSON ||
84
+ type.respond_to?(:type_cast_array, true) && class_name == ::Array
85
+ end
64
86
  end
65
87
  end
66
88
  end
@@ -1,4 +1,4 @@
1
- require 'active_support/core_ext/string/strip'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecord
4
4
  module AttributeMethods
@@ -25,91 +25,64 @@ module ActiveRecord
25
25
  end
26
26
 
27
27
  private
28
+ def convert_time_to_time_zone(value)
29
+ return if value.nil?
28
30
 
29
- def convert_time_to_time_zone(value)
30
- return if value.nil?
31
-
32
- if value.acts_like?(:time)
33
- value.in_time_zone
34
- elsif value.is_a?(::Float)
35
- value
36
- else
37
- map_avoiding_infinite_recursion(value) { |v| convert_time_to_time_zone(v) }
31
+ if value.acts_like?(:time)
32
+ value.in_time_zone
33
+ elsif value.is_a?(::Float)
34
+ value
35
+ else
36
+ map_avoiding_infinite_recursion(value) { |v| convert_time_to_time_zone(v) }
37
+ end
38
38
  end
39
- end
40
39
 
41
- def set_time_zone_without_conversion(value)
42
- ::Time.zone.local_to_utc(value).in_time_zone if value
43
- end
40
+ def set_time_zone_without_conversion(value)
41
+ ::Time.zone.local_to_utc(value).try(:in_time_zone) if value
42
+ end
44
43
 
45
- def map_avoiding_infinite_recursion(value)
46
- map(value) do |v|
47
- if value.equal?(v)
48
- nil
49
- else
50
- yield(v)
44
+ def map_avoiding_infinite_recursion(value)
45
+ map(value) do |v|
46
+ if value.equal?(v)
47
+ nil
48
+ else
49
+ yield(v)
50
+ end
51
51
  end
52
52
  end
53
- end
54
53
  end
55
54
 
56
55
  extend ActiveSupport::Concern
57
56
 
58
57
  included do
59
- mattr_accessor :time_zone_aware_attributes, instance_writer: false
60
- self.time_zone_aware_attributes = false
61
-
62
- class_attribute :skip_time_zone_conversion_for_attributes, instance_writer: false
63
- self.skip_time_zone_conversion_for_attributes = []
58
+ mattr_accessor :time_zone_aware_attributes, instance_writer: false, default: false
64
59
 
65
- class_attribute :time_zone_aware_types, instance_writer: false
66
- self.time_zone_aware_types = [:datetime, :not_explicitly_configured]
60
+ class_attribute :skip_time_zone_conversion_for_attributes, instance_writer: false, default: []
61
+ class_attribute :time_zone_aware_types, instance_writer: false, default: [ :datetime, :time ]
67
62
  end
68
63
 
69
- module ClassMethods
64
+ module ClassMethods # :nodoc:
70
65
  private
71
-
72
- def inherited(subclass)
73
- # We need to apply this decorator here, rather than on module inclusion. The closure
74
- # created by the matcher would otherwise evaluate for `ActiveRecord::Base`, not the
75
- # sub class being decorated. As such, changes to `time_zone_aware_attributes`, or
76
- # `skip_time_zone_conversion_for_attributes` would not be picked up.
77
- subclass.class_eval do
78
- matcher = ->(name, type) { create_time_zone_conversion_attribute?(name, type) }
79
- decorate_matching_attribute_types(matcher, :_time_zone_conversion) do |type|
80
- TimeZoneConverter.new(type)
66
+ def inherited(subclass)
67
+ super
68
+ # We need to apply this decorator here, rather than on module inclusion. The closure
69
+ # created by the matcher would otherwise evaluate for `ActiveRecord::Base`, not the
70
+ # sub class being decorated. As such, changes to `time_zone_aware_attributes`, or
71
+ # `skip_time_zone_conversion_for_attributes` would not be picked up.
72
+ subclass.class_eval do
73
+ matcher = ->(name, type) { create_time_zone_conversion_attribute?(name, type) }
74
+ decorate_matching_attribute_types(matcher, "_time_zone_conversion") do |type|
75
+ TimeZoneConverter.new(type)
76
+ end
81
77
  end
82
78
  end
83
- super
84
- end
85
-
86
- def create_time_zone_conversion_attribute?(name, cast_type)
87
- enabled_for_column = time_zone_aware_attributes &&
88
- !self.skip_time_zone_conversion_for_attributes.include?(name.to_sym)
89
- result = enabled_for_column &&
90
- time_zone_aware_types.include?(cast_type.type)
91
79
 
92
- if enabled_for_column &&
93
- !result &&
94
- cast_type.type == :time &&
95
- time_zone_aware_types.include?(:not_explicitly_configured)
96
- ActiveSupport::Deprecation.warn(<<-MESSAGE.strip_heredoc)
97
- Time columns will become time zone aware in Rails 5.1. This
98
- still causes `String`s to be parsed as if they were in `Time.zone`,
99
- and `Time`s to be converted to `Time.zone`.
80
+ def create_time_zone_conversion_attribute?(name, cast_type)
81
+ enabled_for_column = time_zone_aware_attributes &&
82
+ !skip_time_zone_conversion_for_attributes.include?(name.to_sym)
100
83
 
101
- To keep the old behavior, you must add the following to your initializer:
102
-
103
- config.active_record.time_zone_aware_types = [:datetime]
104
-
105
- To use the new behavior, add the following:
106
-
107
- config.active_record.time_zone_aware_types = [:datetime, :time]
108
- MESSAGE
84
+ enabled_for_column && time_zone_aware_types.include?(cast_type.type)
109
85
  end
110
-
111
- result
112
- end
113
86
  end
114
87
  end
115
88
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module AttributeMethods
3
5
  module Write
@@ -7,53 +9,52 @@ module ActiveRecord
7
9
  attribute_method_suffix "="
8
10
  end
9
11
 
10
- module ClassMethods
11
- protected
12
-
13
- def define_method_attribute=(name)
14
- safe_name = name.unpack('h*'.freeze).first
15
- ActiveRecord::AttributeMethods::AttrNames.set_name_cache safe_name, name
16
-
17
- generated_attribute_methods.module_eval <<-STR, __FILE__, __LINE__ + 1
18
- def __temp__#{safe_name}=(value)
19
- name = ::ActiveRecord::AttributeMethods::AttrNames::ATTR_#{safe_name}
20
- write_attribute(name, value)
12
+ module ClassMethods # :nodoc:
13
+ private
14
+ def define_method_attribute=(name)
15
+ ActiveModel::AttributeMethods::AttrNames.define_attribute_accessor_method(
16
+ generated_attribute_methods, name, writer: true,
17
+ ) do |temp_method_name, attr_name_expr|
18
+ generated_attribute_methods.module_eval <<-RUBY, __FILE__, __LINE__ + 1
19
+ def #{temp_method_name}(value)
20
+ name = #{attr_name_expr}
21
+ _write_attribute(name, value)
22
+ end
23
+ RUBY
21
24
  end
22
- alias_method #{(name + '=').inspect}, :__temp__#{safe_name}=
23
- undef_method :__temp__#{safe_name}=
24
- STR
25
- end
25
+ end
26
26
  end
27
27
 
28
28
  # Updates the attribute identified by <tt>attr_name</tt> with the
29
29
  # specified +value+. Empty strings for Integer and Float columns are
30
30
  # turned into +nil+.
31
31
  def write_attribute(attr_name, value)
32
- write_attribute_with_type_cast(attr_name, value, true)
33
- end
32
+ name = attr_name.to_s
33
+ name = self.class.attribute_aliases[name] || name
34
34
 
35
- def raw_write_attribute(attr_name, value) # :nodoc:
36
- write_attribute_with_type_cast(attr_name, value, false)
35
+ name = @primary_key if name == "id" && @primary_key
36
+ _write_attribute(name, value)
37
37
  end
38
38
 
39
- private
40
- # Handle *= for method_missing.
41
- def attribute=(attribute_name, value)
42
- write_attribute(attribute_name, value)
39
+ # This method exists to avoid the expensive primary_key check internally, without
40
+ # breaking compatibility with the write_attribute API
41
+ def _write_attribute(attr_name, value) # :nodoc:
42
+ sync_with_transaction_state if @transaction_state&.finalized?
43
+ @attributes.write_from_user(attr_name.to_s, value)
44
+ value
43
45
  end
44
46
 
45
- def write_attribute_with_type_cast(attr_name, value, should_type_cast)
46
- attr_name = attr_name.to_s
47
- attr_name = self.class.primary_key if attr_name == 'id' && self.class.primary_key
48
-
49
- if should_type_cast
50
- @attributes.write_from_user(attr_name, value)
51
- else
52
- @attributes.write_cast_value(attr_name, value)
47
+ private
48
+ def write_attribute_without_type_cast(attr_name, value)
49
+ sync_with_transaction_state if @transaction_state&.finalized?
50
+ @attributes.write_cast_value(attr_name.to_s, value)
51
+ value
53
52
  end
54
53
 
55
- value
56
- end
54
+ # Dispatch target for <tt>*=</tt> attribute methods.
55
+ def attribute=(attribute_name, value)
56
+ _write_attribute(attribute_name, value)
57
+ end
57
58
  end
58
59
  end
59
60
  end