我正在尝试将自动增量id字段转换为rails中的postgre数据库。我试图获得最大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
答案 0 :(得分:1)
自动增量字段按顺序上升,如果已经取值5(即使已经删除了entre,但是5已经与记录相关联)序列不停止,它将给出你是第6个等等......
谢天谢地,您可以通过2种方法重置序列。
1-截断表格,truncate也会将序列重置为1。
2-使用Alter序列方法,您有here此方法的官方文档和here关于同一事项的另一个问题,并附有一个示例来解决它。
是:
ALTER SEQUENCE ${table}_${column}_seq RESTART WITH 1453
希望它有所帮助。
更新1:
通过关于coments的更新信息,awnser会发生变化。
需要创建一个处理它的自定义方法。
项目模型
before_create :check_max_value
def check_max_value
self.project_id = Project.last.project_id + 1
end
您需要创建一个迁移来添加" project_id"在表格中,该字段是您想要的名称"。
你真的不想使用" ID"默认情况下由rails创建的字段。
答案 1 :(得分:1)
这里有一些问题,
首先,:id
字段实际上是隐藏字段中的视图吗?如果没有,它不会在参数中返回。
其次,如果你明确地将:id
设置为已删除记录的值,则PostgreSQL会抱怨重复的键值。 id
仍在使用中,您无法访问该记录。
第三,您不应该为:id
分配值。 :id
只有一个目的,那就是为数据库中的记录提供唯一的密钥,它不应该有任何其他辅助含义。它自动递增,这是PostgreSQL适配器工作方式的全部内容。
如果您想要某种可重置的顺序编号,请使用其他新字段。