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. Общий подход будет заключаться в следующем:

  • создать столбец с нулевым значением;
  • заполнить его с помощью генерируемых uids;
  • обновите определение столбца.

В вашем коде proc { generate_unique_id }.call не имеет большого смысла, поскольку это абсолютный эквивалент generate_unique_id.

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

 Смежные вопросы

  • Нет связанных вопросов^_^