Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql RAILS中的自动增量postgre DB id字段_Postgresql_Ruby On Rails 3 - Fatal编程技术网

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

Postgresql RAILS中的自动增量postgre DB id字段,postgresql,ruby-on-rails-3,Postgresql,Ruby On Rails 3,我正在尝试在rails中将自动增量id字段转换为postgre DB。我试图获得最大id,然后只添加+1并将其传递给create方法。我不太确定我做错了什么,但是如果我有4个项目并且添加了第5个项目,那就是id 5,但是如果我删除了那个项目并尝试添加另一个项目,那就是id 6,而不是5。这是我的密码: # GET /admin/projects/new def new @project = Project.new @project.id = Project.maximum(

我正在尝试在rails中将自动增量id字段转换为postgre DB。我试图获得最大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-截断表,Truncate也会将序列重置为1

2-使用Alter sequence方法,您有该方法的官方文档以及关于同一问题的另一个问题,并有一个示例来解决

这是:

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默认创建的“ID”字段。

自动递增字段按照一个序列递增,如果值5已经被取下(即使entre已经被删除,但5已经与一个记录关联),序列不会停止,它将给你第6个,依此类推

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

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

2-使用Alter sequence方法,您有该方法的官方文档以及关于同一问题的另一个问题,并有一个示例来解决

这是:

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默认创建的“ID”字段。

这里有一些问题

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

第二,如果您明确地将
:id
设置为已删除记录的值,PostgreSQL将抱怨键值重复。
id
仍在使用中,您无法访问该记录

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

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

这里有一些问题

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

第二,如果您明确地将
:id
设置为已删除记录的值,PostgreSQL将抱怨键值重复。
id
仍在使用中,您无法访问该记录

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


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

如何使用第一种方法并截断表?我需要运行迁移吗?您应该使用一个或另一个,但它纯粹是在数据库上,而不是在rails交互上,转到sql编辑器,就像mysql的工作台一样,执行命令,rails迁移,不对数据做任何事,只对结构做任何事,所以迁移在这里没有帮助(您可以通过运行rake db:schema:load重置所有数据库,但其杀伤力过大)。我希望能够在每次删除项目时重置该序列,以便重置为表中的最大id。我希望执行的不仅仅是一次操作。哦,在这种情况下,不要使用id字段,并在模型中创建自定义方法,以查看该字段的最大值,并执行+1,您不应该使用id fie用于此目的的ld。类似于…在创建之前:check_max_value def check_max_value self.autincrement=Model.max(自动增量)+1 endI尝试了这个方法,但我得到了一个错误,当我在self上调用它时,
id
不是一个方法。我如何使用第一个方法并截断表?我需要运行迁移吗?您应该使用一个或另一个,但它完全是在数据库上,而不是在rails交互上,转到sql编辑器,就像mysql的工作台一样,并执行逗号nds,rails迁移,对数据不做任何事情,只对结构做任何事情,因此迁移在这里没有帮助(您可以通过运行rake db:schema:load重置所有数据库,但它的杀伤力太大了)。我希望能够在每次删除项目时重置该序列,以便重置为表中的最大id。我希望执行的不仅仅是一次操作。哦,在这种情况下,不要使用id字段,并在模型中创建自定义方法,以查看该字段的最大值,并执行+1,您不应该使用id fie用于此目的的ld。类似于…在创建之前:检查最大值d