2016-11-11 83 views
0

我想在rails中将一个自动增量id字段放入postgre数据库中。我正在尝试获取最大ID,然后添加+1并将其传递给创建方法。我不太确定我做错了什么,但是如果我有4个项目并添加第5个项目,即获得ID 5,但是如果我删除该项目并尝试添加另一个项目,则会获得ID 6,而不是5 。这里是我的代码:在RAILS中自动增量postgre数据库ID字段

# 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到新的,但像我明白了,.save只应在创建方法来完成。任何想法将不胜感激:D

回答

1

自动递增字段按顺序上升,如果已经采用了5的值(即使entre已经被删除,但5已经关联到记录)序列不会停止,它会给你第6个,等等......

谢天谢地,你可以通过2种方法重置序列。

1截断表,也截断复位序列1.

2-,你有here这个方法的官方文档和here就用一个例子这同一问题的另一个问题使用ALTER序列方法解决它。

至极是:

ALTER SEQUENCE ${table}_${column}_seq RESTART WITH 1453 

希望它能帮助。

更新1:

随着对评析,在awnser变化的更新信息。

需要创建一个处理该方法的自定义方法。

项目模型

before_create :check_max_value 

def check_max_value 
    self.project_id = Project.last.project_id + 1 
end 

你需要创建一个迁移到“PROJECT_ID”添加到表中,该字段是“你要ID”的名称。

你真的不应该使用由轨道默认创建的“ID”字段。

+0

如何使用第一种方法并截断表格?我需要运行迁移吗? –

+0

你应该使用一个或另一个,但它纯粹是在数据库上,而不是rails交互,转到sql编辑器,比如mysql的工作台,执行命令,rails迁移,不对数据做任何事情,只是结构,所以迁移不会在这里帮助(您可以通过运行rake db:schema:load来重置所有的数据库,但它的矫枉过正)。 –

+0

我希望能够在每次擦除项目时重置该序列,以便重置为表中的最大ID。这不仅仅是我想执行的一次操作 –

1

这里有几个问题,

首先,是:id字段实际上在一个隐藏字段的看法?如果不是,它不会在参数中返回。第二,如果你确实将:id设置为已删除记录的值,PostgreSQL将会抱怨重复的键值,无论如何。 id仍在使用中,您只能访问该记录。

第三,你不应该为:id分配一个值,永远。 :id只有一个目的,那就是为数据库中的记录提供一个唯一的密钥,它不应该有任何其他的辅助含义。它会自动增加,这是PostgreSQL适配器工作的一部分。

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