在RAILS中自动增加postgre数据库ID字段

时间:2016-11-11 09:50:15

标签: postgresql ruby-on-rails-3

我正在尝试将自动增量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

2 个答案:

答案 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适配器工作方式的全部内容。

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