基于最后一个条目而不是第一个空白自动增加id

时间:2013-03-12 12:11:56

标签: ruby-on-rails ruby-on-rails-3

目前我有一个用户和一个资产表(postgres后端),当用户创建一个新资产时,它会按照预期的1,2,3等填充资产ID,根据我们的显示为### 1当前的资产标记方法。

作为资产管理系统的一部分,我们需要导入从当前系统导出的资产。我正在使用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

这是用于导入现有资产的方法

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

2 个答案:

答案 0 :(得分:1)

我已经考虑过这个问题,并从reddit上的一些人那里得到了一些建议,并且已经意识到逻辑解决方案是将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

答案 1 :(得分:0)

如果拥有连续数字至关重要,那么你可以用老式的方式来做。禁用自动增量,将最后一个数字存储在某个特殊的某个表中,然后在每次需要新数字时增加并重新保存该数字。

或者,你可以做一些像SELECT MAX(id)FROM ASSETS ......

这样的事情

但是要小心,有一些非常好的理由让数据库自动增加,而不只是自己动手。