Ошибка Rails act_as_paranoid

У меня сложная проблема с Devise и паранойей (act_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

Нет проблем до этого момента. Затем я добавил модель Paranoia и строку acts_as_paranoid к модели пользователя. Моя база данных прекрасна в текущем состоянии, но я пытаюсь выполнить reset мою базу данных, чтобы синхронизировать ее с производственными данными, и именно здесь я столкнулся с проблемами. Когда я делаю db: reset, он не выполняет описанную выше миграцию:

PG::UndefinedColumn: ERROR: column users.deleted_at does not exist

Проблема в том, что моя модель содержит директиву acts_as_paranoid, которая действительна только с текущим моментальным снимком базы данных. Если я вернусь к предыдущему снимку базы данных, User::deleted_at не существует, камень paranoia по-прежнему пытается обновить только не удаленные объекты, и мой запрос завершится с ошибкой.

Любые мысли об элегантном способе справиться с этой ситуацией?

2 ответа

Не совсем уверен, что это самое изящное решение, но я решил, обновив свои старые миграции с помощью User.with_deleted.update_all(:confirmed_at => Time.now) (хорошо - мои версии моделей).

Может не работать, если вы хотите, чтобы пользователи, которые установили delete_at, не установили confirm_at; для меня, мне все равно, было ли у удаленных пользователей это поле установленным (для меня это проблема только в dev/test, и обычно это происходит там, где нет записей в первую очередь).

После всего этого - я думаю, что для меня может быть время посмотреть использование семян или драгоценный камень для миграции DML


Используйте unscoped при использовании моделей + migration + actions_as_paranoid.

Строка для обновления всех пользователей должна выглядеть примерно так:

User.unscoped.update_all(:confirmed_at => Time.now)

licensed under cc by-sa 3.0 with attribution.