目前我有一个用户和一个资产表(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
编辑: 这是当前行为的一个例子
答案 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 ......
这样的事情但是要小心,有一些非常好的理由让数据库自动增加,而不只是自己动手。