Rails act_as_paranoid проблема миграции
У меня сложная проблема с Devise и самоцветом паранойи (actions_as_paranoid). Моя модель пользователя относительно проста:
class User < AR::Base
devise :confirmable, :other_config_options
acts_as_paranoid
end
Сначала я добавил драгоценный камень Devise без подтверждения. Затем я добавил добавленную опцию для этой миграции:
def up
add_column :users, :confirmed_at, :datetime
add_column :users, :confirmation_token, :string
add_column :users, :confirmation_sent_at, :datetime
add_column :users, :unconfirmed_email, :string
add_index :users, :confirmation_token, unique: true
User.update_all(:confirmed_at => Time.now)
end
Нет проблем до этого момента. Затем я добавил драгоценный камень Паранойи и acts_as_paranoid
линия к модели пользователя. Моя база данных в своем текущем состоянии в порядке, но я пытаюсь сбросить базу данных, чтобы синхронизировать ее с производственными данными, и именно здесь я сталкиваюсь с проблемами. Когда я делаю db: reset, он не проходит описанную выше миграцию:
PG::UndefinedColumn: ERROR: column users.deleted_at does not exist
Беда в том, что моя модель содержит директиву acts_as_paranoid
это действительно только с текущим снимком базы данных. Если я вернусь к предыдущему снимку базы данных, User::deleted_at
не существует, гем паранойи все еще пытается обновить только не удаленные объекты, и мой запрос не выполняется.
Есть мысли об элегантном способе справиться с этой ситуацией?
2 ответа
Не совсем уверен, что это самое элегантное решение, но я решил, обновив мои старые миграции с User.with_deleted.update_all(:confirmed_at => Time.now)
(хорошо - версия моих моделей).
Может не сработать, если вы хотите, чтобы пользователи, для которых в параметре delete_at было установлено значение не подтверждено: для меня мне было все равно, было ли это поле установлено для удаленных пользователей (для меня - это проблема только в dev/test, и обычно это происходит там, где вообще нет записей).
После всего этого - думаю, мне пора взглянуть на использование затравок или драгоценного камня для миграции DML.
Использование unscoped
при использовании моделей + миграция + act_as_paranoid.
Строка для обновления всех пользователей должна быть такой:
User.unscoped.update_all(:confirmed_at => Time.now)
Я получаю сообщение об ошибке с существующими миграциями, которые выполнялись all
и each
петля
Так обновил код с:
Object.all.each do |obj|
Для того, чтобы:
Object.with_deleted.each do |obj|
И это with_deleted.each
решил проблему
Надеюсь это поможет!