我试图使一个自动增量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适配器工作的一部分。
如果您想要某种可以重置的顺序编号,请使用不同的新字段