Rails act_as_paranoid проблема с миграцией

У меня сложная проблема с Devise и драгоценным камнем paranoia(acts_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 в модель пользователя. Моя база данных в текущем состоянии в порядке, но я пытаюсь сбросить базу данных, чтобы синхронизировать ее с производственными данными, и здесь у меня возникают проблемы. Когда я выполняю db:reset, происходит сбой вышеуказанной миграции:

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

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

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


person kid_drew    schedule 03.12.2014    source источник
comment
Вы пытались создать миграцию для отсутствующих столбцов? Параноидальный гем ~ act_as_paranoid говорит, что вам нужно выполнить следующую миграцию:   -  person Miknash    schedule 03.12.2014
comment
Да, но это делается позже на пути миграции. Эта ошибка происходит до этого. У меня не было проблем с установкой paranoid — я столкнулся с этой проблемой только тогда, когда попытался удалить и перестроить свою базу данных с нуля.   -  person kid_drew    schedule 03.12.2014
comment
У меня такая же проблема. Если я закомментирую act_as_paranoid в своей модели, это сработает, но, очевидно, это просто остановит любую проверку, происходящую в модели, на предмет ее удаления. Интересует правильное решение.   -  person Jordan Ell    schedule 10.12.2014


Ответы (3)


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

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

После всего этого, я думаю, мне пора взглянуть на использование seed или gem для миграции DML

person p5k6    schedule 08.06.2015
comment
Я полагаю, что модификация предыдущих миграций для отражения более поздних изменений кода является разумным решением. Держу пари, кто-то со мной не согласится. - person kid_drew; 10.06.2015

Используйте unscoped при использовании моделей + миграция + act_as_paranoid.

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

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

person Rael Gugelmin Cunha    schedule 19.07.2017
comment
Хороший. Я не знал, что unscoped существует - person kid_drew; 04.12.2018

Я получал ошибку с существующими миграциями, которые запускали цикл all и each

Итак, обновил код из:

Object.all.each do |obj|

To:

Object.with_deleted.each do |obj|

И это with_deleted.each решило проблему

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

person d1jhoni1b    schedule 04.12.2018