Rails 6.1 仅在 UPDATE 事务中创建记录结果

Rails 6.1 creating a record results only in UPDATE transactions

我正在尝试从 Rails 5.2 升级 -> Rails 6.1。我已经解决了所有的依赖关系,但现在 运行 遇到了一个问题,我的单元测试失败了,因为测试似乎无法在我们的测试 sqlite3 1.4 数据库中创建新记录。

依赖版本更新:

bundler: 1.3.5 -> 2.2.27
rails (and all immediate Rails dependencies): 5.2.4.1 -> 6.1.4.1
byebug: 10.0.2 -> 11.0.1
pry: 0.11.3 -> 0.13.1
pry-byebug: 3.6.0 -> 3.9.0
sqlite3: 1.3.13 -> 1.4.2
sass-rails: 5.0.6 -> 6.0.0
haml-rails: 1.0.0 -> 2.0.0
haml: 5.0.4 -> 5.1.4
responders: 2.4.0 -> 3.0.1
bullet: 5.8.1 -> 6.1.4
jasmine-rails: 0.14.7 -> 0.15.0
actionpack-action_caching: 1.2.1 -> 1.2.2
concurrent-ruby-ext: 1.0.5 -> 1.1.9
delayed_job_active_record: 4.1.4 -> 4.1.6

当我在测试中插入断点,并尝试在模型上进行简单创建时,我看到 .save.create returns true,但是,该记录没有 ID,并且该模型的计数保持不变。我在 运行ning 保存时有类似的经历,因为它 returns 是真的,即使记录实际上没有保存。奇怪的是运行ning.valid?也 returns 真。有没有人以前处理过类似的问题?

调试和展示 SQL 揭示以下内容

@b.save!
-- :   TRANSACTION (0.1ms)  SAVEPOINT active_record_1
-- :   P Load (0.1ms)  SELECT "p".* FROM "p" WHERE "p"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
-- :   B Update (0.1ms)  UPDATE "b" SET "c_id" = ?, "d" = ?, "e" = ?, "f" = ?, "g" = ? WHERE "b"."id" IS NULL  [["c_id", 3], ["d", 0], ["e", 7], ["f", 200], ["g", "Z"]]
-- :   P Update (0.2ms)  UPDATE "p" SET "c" = ? WHERE "p"."id" = ?  [["c", "F"], ["id", 2]]
-- :   TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1

需要重点关注的是,在新记录上调用 .save 会导致 UPDATE 交易到 table B 而不是 INSERT 手术。 before_save回调可以看到运行成功,但是before_create回调没有运行.

问题最终成为我们使用 protected_attributes_continued gem

的问题

https://github.com/westonganger/protected_attributes_continued/pull/18

从 1.5 升级 protected_attributes_continued -> 1.6 解决了这个问题