2013-03-12 27 views
2

當前我有一個用戶和一個資產表(postgres後端),當用戶創建一個新資產時,它會按預期填充資產ID 1,2,3等。根據我們當前的資產標記方法顯示爲### 1。根據最後一次輸入而不是第一次空白自動遞增ID

作爲資產管理系統的一部分,我們需要導入從當前系統導出的資產。我正在使用roo和find_by_or_initialize使用其當前ID創建這些資產。但是,當我添加新資產時,它使用第一個空閒ID並使用它來代替序列中的下一個。這不是問題,但現有管理系統中有大約200個缺失的數字,除了手動添加它們之外,我想不出一個解決方案。

有沒有辦法使id不使用第一個空白; 1,2,6,7,8,12?

這是資產

def create 
    @asset = current_user.assets.build(params[:asset]) 
    if @asset.save 
    redirect_to root_path 
    flash.now[:success] = "Asset created!" 
    else 
    render 'static_pages/home' 
    end 
end 

create方法這是用於導入現有資產

def self.import(file) 
    spreadsheet = open_spreadsheet(file) 
    header = spreadsheet.row(1) 
    (2..spreadsheet.last_row).each do |i| 
    row = Hash[[header, spreadsheet.row(i)].transpose] 
    asset = find_or_initialize_by_id(spreadsheet.cell(i, 'A')) || new 
    asset.attributes = row.to_hash.slice(*accessible_attributes) 
    asset.save! 
    end 
end 

編輯方法: 這是當前的行爲的一個例子 Asset Manager

+0

我沒有得到你的問題 – beck03076 2013-03-12 13:14:03

+0

我已經更新了問題以顯示當前行爲,因爲沒有id設置爲1的資產,它會自動使用它而不是像我所希望的那樣移動到11 – RyanMacG 2013-03-12 13:34:01

+1

如果你在'postgre'中創建一個序列,然後你可以嘗試在你的Assest模型中使用'set_sequence_name「your_postgree_seq_here」'。 – fmendez 2013-03-12 13:44:51

回答

1

我已經有了一個想法,並採取了一些人對reddit的建議,並已意識到d合乎邏輯的解決方案是將asset_id_seq的postgres序列重新啓動到現有管理系統中的最後一個值。

我已經包含了這種情況的相關命令;

asset_development=# alter sequence assets_id_seq restart with 1479; 
ALTER SEQUENCE 
asset_development=# \d assets_id_seq 
     Sequence "public.assets_id_seq" 
    Column  | Type |  Value 
---------------+---------+--------------------- 
sequence_name | name | assets_id_seq 
last_value | bigint | 1479 
start_value | bigint | 1 
increment_by | bigint | 1 
max_value  | bigint | 9223372036854775807 
min_value  | bigint | 1 
cache_value | bigint | 1 
log_cnt  | bigint | 0 
is_cycled  | boolean | f 
is_called  | boolean | f 
Owned by: public.assets.id 
0

如果具有連續數字是至關重要的,那麼你可以用老式的方式來做。禁用自動遞增功能,將最後一個號碼存儲在某個特定的表格中,然後在每次需要新號碼時遞增並重新保存該號碼。

或者,你可能只是做類似SELECT MAX(ID)從資產...

不過要小心,有幾個真正的好理由有DB自動遞增,而不僅僅是推出自己。

相關問題