Rails 5 Postgres创建时重复密钥冲突

时间:2016-09-23 17:51:35

标签: ruby-on-rails postgresql model constraints

在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时,最大函数会为多个记录返回相同的位置。

我是新手,可以在轨道上安装线程中的ruby和postgres锁定。有没有办法在列表项记录的保存操作中锁定或创建互斥锁,以便位置安全递增?

1 个答案:

答案 0 :(得分:0)

您需要Rails不支持的复合primary_key。

但是,使用gem有composite_primary_keys gemblog post