2

目前我有一个用户和一个资产表(postgres 后端),当用户创建一个新资产时,它会按预期填充资产 ID 1、2、3 等,根据我们当前的资产标记显示为 ###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

编辑:这是当前行为的一个例子 资产经理

4

2 回答 2

1

我已经考虑过了,并从 reddit 上的一些人那里得到了一些建议,并且已经意识到合乎逻辑的解决方案是重新启动 postgres 序列,asset_id_seq直到现有管理系统中的最后一个值。

我已经包含了这种情况的相关命令;

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
于 2013-03-12T18:15:00.483 回答
0

如果序列号非常重要,那么你可以用老式的方式来做。禁用自动递增,将最后一个数字存储在某个特殊表中的某个地方,然后在每次需要新数字时递增并重新保存该数字。

或者,您可以执行类似 SELECT MAX(id) FROM ASSETS ...

不过要小心,有一些非常好的理由让数据库自动递增,而不仅仅是自己滚动。

于 2013-03-13T02:22:26.977 回答