2016-11-11 51 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適配器工作的一部分。

如果您想要某種可重置的順序編號,請使用不同的新字段。