【发布时间】:2019-10-21 10:03:09
【问题描述】:
我正在尝试更新记录,但是如果由于唯一验证而失败, 那么我正在删除该记录,因为预期的记录已经存在。
def update_dependent_model(records, foreign_key, foreign_key_id)
records.each do |record|
begin
ActiveRecord::Base.transaction do
record.update_column(foreign_key.to_sym, foreign_key_id)
end
rescue ActiveRecord::RecordNotUnique, PG::UniqueViolation => e
ActiveRecord::Base.connection.execute 'ROLLBACK'
record.delete
end
end
end
我不确定这段代码有什么问题。 一些将被删除或不会被删除的记录。 日志也无济于事。显示没有错误。
另外,关于日志的奇怪之处在于:
SQL (2.4ms) UPDATE "records" SET "foriegn_key_id" = 220 WHERE "records"."id" = $1 [["id", 124080]]
SQL (0.6ms) UPDATE "records" SET "foriegn_key_id" = 220 WHERE "records"."id" = $1 [["id", 153032]]
SQL (0.2ms) UPDATE "records" SET "foriegn_key_id" = 220 WHERE "records"."id" = $1 [["id", 124099]]
SQL (0.4ms) UPDATE "records" SET "foriegn_key_id" = 220 WHERE "records"."id" = $1 [["id", 176549]]
SQL (0.5ms) UPDATE "records" SET "foriegn_key_id" = 220 WHERE "records"."id" = $1 [["id", 162725]]
SQL (0.8ms) UPDATE "records" SET "foriegn_key_id" = 220 WHERE "records"."id" = $1 [["id", 124109]]
(0.1ms) ROLLBACK
SQL (0.3ms) DELETE FROM "records" WHERE "records"."id" = $1 [["id", 124109]]
实际上,id为124080的记录已经更新,但奇怪的是在数据库中这条记录仍然存在。
【问题讨论】:
-
124080 has gotten updated, but strangely in DB this record is still present.为什么不应该这样?更新foriegn_key_id不会删除该行。 -
您不应该显式地执行回滚,因为让事务带有异常应该已经为您完成了。很难看出这里出了什么问题:从日志看来它似乎在工作,只有 id=124109 的记录引发了异常,所以只有该记录被删除?您确定您的验证定义正确吗? (它们是在哪里定义的:在数据库中还是在 Rails 中?)
-
一边?
foriegn_key_id?错字?foreign_key_id?
标签: ruby-on-rails postgresql activerecord