4

我对 Devise 和 paranoia(acts_as_paranoid) gem 有一个复杂的问题。我的用户模型比较简单:

class User < AR::Base
  devise :confirmable, :other_config_options
  acts_as_paranoid
end

我首先添加了 Devise gem,没有可确认的选项。然后我后来在此迁移中添加了可确认选项:

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 gem 和acts_as_paranoid行添加到 User 模型中。我的数据库在当前状态下很好,但我正在尝试重置我的数据库以将其与生产数据同步,这就是我遇到问题的地方。当我执行 db:reset 时,上述迁移失败:

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

问题是我的模型包含一个acts_as_paranoid仅对当前数据库快照有效的指令。如果我回滚到以前的数据库快照User::deleted_at不存在,偏执狂 gem 仍会尝试仅更新未删除的对象,并且我的查询失败。

关于处理这种情况的优雅方式有什么想法吗?

4

3 回答 3

4

不完全确定这是否是最优雅的解决方案,但我通过使用User.with_deleted.update_all(:confirmed_at => Time.now)(嗯 - 我的模型版本)更新我的旧迁移来解决。

如果您希望将已删除_at 设置为未设置已确认_at 的用户可能不起作用;对我来说,我并不关心被删除的用户是否设置了这个字段(对我来说——这只是开发/测试中的一个问题,通常发生在首先没有记录的地方)。

毕竟 - 我认为现在是时候考虑使用种子或 gem 进行 DML 迁移了

于 2015-06-08T21:29:45.860 回答
3

使用unscoped模型+迁移+acts_as_paranoid时使用。

更新所有用户的行应该是这样的:

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

于 2017-07-19T13:00:48.267 回答
0

all我在运行一个和一个each循环的现有迁移时遇到了错误

所以更新了代码:

Object.all.each do |obj|

至:

Object.with_deleted.each do |obj|

with_deleted.each解决了这个问题

希望这可以帮助!

于 2018-12-04T14:15:48.110 回答