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 решил проблему

Надеюсь это поможет!

Другие вопросы по тегам