Rails acts_as_paranoid迁移问题



我对Devise和偏执狂(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

到目前为止没有问题。 然后,我将偏执狂宝石和acts_as_paranoid线添加到用户模型中。 我的数据库在当前状态下很好,但我正在尝试重置数据库以将其与生产数据同步,这就是我遇到问题的地方。 当我执行 db:reset 时,它使上述迁移失败:

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

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

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

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

更新所有用户的行应如下所示:

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

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

如果您希望设置deleted_at的用户不设置confirmed_at,则可能不起作用;对我来说,我并不真正关心已删除的用户是否设置了此字段(对我来说 - 这只是开发/测试中的一个问题,通常发生在没有记录的地方首先

)。

毕竟 - 我认为可能是时候考虑使用种子或宝石进行 DML 迁移了

我在运行alleach循环的现有迁移中遇到错误

因此,从以下位置更新了代码:

Object.all.each do |obj|

自:

Object.with_deleted.each do |obj|

with_deleted.each解决了问题

希望这有帮助!

相关内容

  • 没有找到相关文章