目前我有一个users和一个assets表(postgres后端),当用户创建一个新资产时,它会填充资产id,如预期的1、2、3等,根据我们当前的资产标记方法显示为###1。
作为资产管理系统的一部分,我们需要导入从当前系统导出的资产。我使用roo和find_by_or_initialize使用它们的当前id来创建这些资源。但是,当我添加一个新资产时,它使用第一个空闲的id,而不是序列中的下一个。这不是问题,但在现有的管理系统中有大约200个丢失的数字,目前除了手动添加它们之外,我想不出其他解决方案。
有没有办法让id不使用第一个空格,比如1,2,6,7,8,12?
这是资产的create方法
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编辑:这是当前行为的一个示例

发布于 2013-03-13 02:15:00
我对此进行了思考,并从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发布于 2013-03-13 10:22:27
如果拥有序列号是非常重要的,那么你可以用老式的方法来做。禁用自动递增,将最后一个数字存储在某个特殊的表中,然后在每次需要新的数字时递增并重新保存该数字。
或者,您可以只执行如下操作:从ASSETS中选择MAX(id) ...
不过要小心,有几个非常好的理由让DB自动递增,而不仅仅是滚动您自己的。
https://stackoverflow.com/questions/15360869
复制相似问题