2014-12-03 2 views
4

У меня проблема с Devise и paranoia (act_as_paranoid). Моя модель пользователя относительно проста:Rails 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 

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

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

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

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

+1

Вы пытались создать миграции для недостающих столбцов? Paranoid gem ~ act_as_paranoid говорит, что вам нужно выполнить следующую миграцию: rails generate migration AddDeletedAtToClients deleted_at: datetime: index – Miknash

+1

Да, но это сделано позже в пути миграции. Эта ошибка происходит до этого. У меня не возникало проблем с установкой параноидального кода - я столкнулся с этой проблемой только тогда, когда пытался сбросить и восстановить базу данных с нуля. –

+0

У меня такая же проблема. Если я прокомментирую act_as_paranoid в моей модели, это работает, но это, очевидно, просто прекращает все проверки в модели, если она удалена. Заинтересованы в правильном решении этого. –

ответ

3

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

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

После всего этого - я думаю, что это может быть время для меня, чтобы посмотреть на using seeds or a gem for DML migrations

+0

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

+0

Это должно быть принято, отлично работает для меня! – Maor

1

Использование unscoped при использовании моделей + миграцию + acts_as_paranoid.

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

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

Смежные вопросы