0

私のモデルの一部にヌル以外の列unique_idを追加したいとします。これの実装は基本的にSecureRandom.hex(8)になります。マイグレーション自体でこれを指定する方法はありますか?より古いすべての値のデフォルト値を計算します。行。移行時にラムダのデフォルト値を指定する

このような多分何か:(一種の期待されている)

add_column :users, :unique_id, :string, null: false, default: proc { generate_unique_id }.call

問題があり、上記の方法は、一度だけunique_idを生成します。すべての行のデフォルトを生成するための指定方法はありますか?

答えて

2

これは直接add_columnではできません。一般的なアプローチは次のとおりです。

  • null可能な列を作成します。
  • 生成されたuidを入力してください。
  • 列定義を更新します。あなたのコードで

それはgenerate_unique_idの絶対equavalentであることから、proc { generate_unique_id }.callは、あまり意味があります。

add_column :users, :unique_id, :string, null: true 
# it’s still a plain ruby code! 
User.find_each do |u| 
    # or better use built-in SQL functoin to do this in batch 
    # inside your db, instead of performing a dozillion of updates 
    u.update_column(:unique_id, generate_unique_id) 
end 
change_column :users, :unique_id, :string, null: false # NOW! 
+0

hmm .. ok。意味をなさない – Vedanshu

関連する問題