在RAILS中自动增加postgre DB id字段



我试图使一个自动增量id字段在rails中的postgre DB。我试图获得最大id,然后只是添加+1,并将其传递给创建方法。我不太确定我做错了什么,但如果我有4个项目,并添加第5个,这是得到id 5,但如果我删除这一个,并试图添加另一个,这是得到id 6,而不是5。下面是我的代码:

 # GET /admin/projects/new
  def new
    @project = Project.new
    @project.id = Project.maximum(:id).next.to_i
    respond_to do |format|
      format.html # new.html.erb
    end
  end
  # GET /admin/projects/1/edit
  def edit
    @project = Project.find(params[:id])
  end
  # POST /admin/projects
  def create
    @project = Project.create(params[:project])
    respond_to do |format|
      if @project.save
        format.html { redirect_to projects_path, notice: 'Project was successfully created.' }
      else
        format.html { render action: "new" }
      end
    end
  end

我试图将@project.save添加到new,但据我所知,.save应该只在create方法中完成。D

自动递增字段按照顺序递增,如果值5已经被取走了(即使这个值已经被删除了,但是5已经被关联到一个记录),这个序列不会停止,它会给你第6个,以此类推…

值得庆幸的是,您可以通过两种方法重置顺序。

1-截断表,截断也将序列重置为1。

2-使用Alter sequence方法,这里有该方法的官方文档,这里有关于同一问题的另一个问题,并附有解决它的示例。

隔层:

ALTER SEQUENCE ${table}_${column}_seq RESTART WITH 1453

希望有帮助。

更新1:

随着评论信息的更新,用户改变了。

需要创建一个自定义方法来处理它。

项目模型

before_create :check_max_value
def check_max_value
  self.project_id = Project.last.project_id + 1
end

您需要创建一个迁移,将"project_id"添加到表中,该字段是您想要的"id "的名称。

你真的不应该使用rails默认创建的"ID"字段

这里有几个问题,

首先,:id字段实际上是视图中的隐藏字段吗?如果不是,它不会在参数中返回。

第二,如果你显式地将:id设置为已删除记录的值,PostgreSQL无论如何都会抱怨重复的键值。id仍在使用,您只是无法访问记录。

第三,永远不要给:id赋值。:id只有一个目的,那就是为数据库中的记录提供一个唯一的键,它不应该有任何其他辅助意义。它是自动递增的,这是PostgreSQL适配器工作的一部分。

如果您想要某种可以重置的顺序编号,请使用不同的新字段

最新更新