Как я могу реализовать «Запись в оба столбца» в Rails Active Record (как рекомендует Strong migrations)? - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь изменить тип столбца в PostgreSQL (Rails 6).

миграция:

# frozen_string_literal: true

class ChangeUsersEmailToCitext < ActiveRecord::Migration[6.0]
  def up
    enable_extension('citext')

    change_column :users, :email, :citext
  end

  def down
    change_column :users, :email, :string
  end
end

Но сильная миграция вызывает ошибку и говорит следующее:

=== Dangerous operation detected #strong_migrations ===

Changing the type of an existing column blocks reads and writes
while the entire table is rewritten. A safer approach is to:

1. Create a new column
2. Write to both columns
3. Backfill data from the old column to the new column
4. Move reads from the old column to the new column
5. Stop writing to the old column
6. Drop the old column

Я понимаю смысл и опасность блокировки db ... но мой вопрос довольно глупый, и я не нашел на него ответа. Как буквально я могу заработать 2, 4 и 5 баллы? Как я могу заставить мою модель ActiveRecord писать в оба столбца одновременно и переключаться после обратного заполнения в правый?

1 Ответ

1 голос
/ 07 августа 2020

Допустим, старый столбец - length, а новый - length_advanced.

2 - Запись в оба столбца

def length=(value)
  super(value)
  self[:length_advanced] = value
end

4 - Перенос чтения из старого столбца в новый столбец

def length
  if super.present?
    super
  else
    self[:length_advanced]
  end
end

5 - Прекратить запись в старый столбец

def length=(value)
  # no write to old column
  self[:length_advanced] = value
end

Подробнее обо всем этом https://api.rubyonrails.org/classes/ActiveRecord/Base.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...