【发布时间】:2016-03-29 23:07:31
【问题描述】:
我正在尝试构建一个表,该表将作为批量同步到第三方服务的队列。
以下方法不言自明;但需要明确的是,它的目的是在delayed_syncs 表中添加一个带有status: :queued 的新可更新对象(多态关系)。
对多态关系 + status (updatable_id, updatable_type, status) 存在唯一性约束,这应该会导致队列中已经存在 :queued status 的可更新对象在此处失败并落入救援块。
我看到的问题是,每当find_by 生成的SELECT 被触发时,整个方法都会失败并显示:
ActiveRecord::StatementInvalid
错误。
我在这方面发现的信息表明在失败的INSERT 之后会出现ROLLBACK 或RELEASE SAVEPOINT,但我不确定如何在这里完成。
上述方法:
def self.enqueue(updatable:, action:)
DelayedSync.create(updatable: updatable, status: :queued, action: action)
rescue ActiveRecord::RecordNotUnique
queued_update = DelayedSync.find_by(updatable: updatable, status: :queued, action: :sync_update)
if action == :sync_delete && queued_update.present?
queued_update.sync_delete!
else
Rails.logger.debug "#{updatable.class.name} #{updatable.id} already queued for sync, skipping."
end
end
【问题讨论】:
-
错误信息是什么?
标签: sql ruby-on-rails ruby postgresql activerecord