2

現在、私はユーザーとアセット テーブル (postgres バックエンド) を持っています。ユーザーが新しいアセットを作成すると、アセット ID が予想通り 1、2、3 などに設定され、現在のアセットのタグ付けに基づいて ###1 として表示されます。方法。

資産管理システムの一部として、現在のシステムからエクスポートされた資産をインポートする必要があります。現在の ID を使用してこれらのアセットを作成するために、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

編集:これは現在の動作の例です アセット・マネージャー

4

2 に答える 2

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

連番を付けることが非常に重要な場合は、昔ながらの方法で行うことができます。自動インクリメントを無効にし、最後の番号をどこかの特別なテーブルに保存し、新しい番号が必要になるたびにその番号をインクリメントして再保存します。

または、SELECT MAX(id)FROMASSETS..のようなことを行うこともできます。

ただし、DBを自動インクリメントする理由はいくつかありますが、自分でロールするだけではありません。

于 2013-03-13T02:22:26.977 に答える