Почему установка значения по умолчанию для существующего столбца в миграции ActiveRecord не распространяется на существующие ассоциации на производстве? - PullRequest
0 голосов
/ 07 апреля 2019

Если я добавлю значение по умолчанию к существующему столбцу через миграцию ActiveRecord, при развертывании моих изменений в производство существующие ассоциации не будут затронуты.

Я могу перейти на рабочую консоль rails и выполнять итерации по каждомузапишите и установите значение в новом столбце в ложное значение для каждой записи, однако это утомительно и плохо масштабируется.

class AddDefaultValuesToAFewColumns < ActiveRecord::Migration[5.2]
  def change
    change_column :downloads, :is_deleted, :boolean, :default => false
  end
end
create_table "downloads", force: :cascade do |t|
    t.string "version"
    t.string "comment"
    t.string "contributors"
    t.string "release_date"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "download_url"
    t.boolean "is_deleted", default: false
  end

Ожидаемый результат будет для ассоциаций при запросе с консоли rails наверните false для is_deleted, скорее он вернет nil.Почему это так и какие есть альтернативные решения?

1 Ответ

1 голос
/ 08 апреля 2019

Вот как это работает.При изменении значения по умолчанию для столбца вы настраиваете значение по умолчанию для новых записей, а не для существующих.Если вы хотите обновить существующие значения с помощью false, сделайте что-то вроде Download.where(is_deleted: nil).update_all(is_deleted: false) сразу после строки change_column:

class AddDefaultValuesToAFewColumns < ActiveRecord::Migration[5.2]
  def change
    change_column :downloads, :is_deleted, :boolean, :default => false
    Download.where(is_deleted: nil).update_all(is_deleted: false)
  end
end
...