【发布时间】:2016-09-23 17:51:35
【问题描述】:
在 Rails 5 应用程序中,我创建项目并增加它们的位置:
class ListItem < ActiveRecord::Base
belongs_to :list
before_validation :ensure_position
private
def ensure_position
self.position ||= self.class.where(list_id: list_id).maximum(:position).to_i + 1
end
end
导致重复违规的索引是:
t.index ["list_id", "position"]
我在 :position 列上发现 PG 重复键违规。每当同时触发多个 create 时,maximum 函数都会为多个记录返回相同的位置。
我是线程安全和 postgres 锁定在 ruby on rails 的新手。有没有办法在列表项记录的保存操作上锁定或创建互斥锁,以便安全地增加位置?
【问题讨论】:
-
为什么不像往常一样使用数据库中的序列?
-
对不起,我是新手,序列不是唯一的增量列吗?在我的场景中 :position 不是唯一的,唯一的是 [:list_id, :position]。
标签: ruby-on-rails postgresql model constraints