【发布时间】:2018-12-04 17:12:46
【问题描述】:
我有两个 Rails 模型/表,我想将它们作为事务的一部分插入。
例如,这里大致是我的表格:
- 帖子:(id)
- 评论:(id、post_id、comment_text、user_id)
- 评论者:(id,post_id,user_id),对(post_id, user_id)
现在我正在尝试大约相当于:
ActiveRecord::Base.transaction do
Comment.create!(post: post, user: user, comment_text: '...')
begin
Commenters.find_or_create_by!(post: post, user: user)
rescue PG::UniqueViolation
end
end
这在 99.9% 的时间都有效,但有时两个并发的 cmets 会触发 PG::UniqueViolation。
即使我正在捕获并抑制 PG::UniqueViolation,整个事务仍因以下原因而失败:
错误:当前事务被中止,命令被忽略,直到事务块结束
我意识到我已经可以通过加入 Post 和 Comment 表来实现这一点,但这是一个简化的示例。
有没有更简单的方法来确保两个插入都作为事务的一部分发生,同时仍然忽略唯一的违规,因为我们可以假设记录已经存在?
【问题讨论】:
标签: ruby-on-rails ruby postgresql