RAILS 中的自动增量 postgre DB id 字段

Autoincrement postgre DB id field in RAILS

我正在尝试在 rails 中将一个自动增量 id 字段放入 postgre 数据库中。我正在尝试获取最大 id,然后只需添加 +1 并将其传递给 create 方法。我不太确定我做错了什么,但如果我有 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已经被取值了(即使之后entre被删除了,但是5已经关联了一条记录)这个顺序不会停止,它会给你第6个等等...

谢天谢地,您可以通过两种方法重置序列。

1- 截断 table,截断还会将序列重置为 1。

2- 使用 Alter sequence 方法,你有 here the official documentation for this method and here 另一个关于同样问题的问题,并有一个例子来解决它。

即:

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" 添加到 table,该字段是 "id you want" 的名称。

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

这里有几个问题,

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

其次,如果您明确地将 :id 设置为已删除记录的值,则 PostgreSQL 无论如何都会抱怨重复的键值。 id 仍在使用中,您只是无法访问该记录。

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

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