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 解决了这个问题
我正在尝试从 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 解决了这个问题