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