Rails acts_as_paranoid迁移问题

时间:2014-12-03 18:04:38

标签: ruby-on-rails migration acts-as-paranoid

我有一个复杂的问题与Devise和偏执狂(acts_as_paranoid)宝石。我的用户模型相对简单:

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不存在,妄想宝石仍会尝试仅更新未删除的对象,并且我的查询失败。

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

3 个答案:

答案 0 :(得分:4)

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

如果您希望将deleted_at设置为未设置confirm_at的用户,则可能无效;对我来说,我并不在乎删除的用户是否设置了这个字段(对我来说 - 这只是dev / test中的一个问题,通常发生在首先没有记录的地方)。

毕竟这一点 - 我认为现在是时候看一下using seeds or a gem for DML migrations

答案 1 :(得分:3)

使用模型+ migration + acts_as_paranoid时使用unscoped

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

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

答案 2 :(得分:0)

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

因此更新了以下代码:

Object.all.each do |obj|

收件人:

Object.with_deleted.each do |obj|

with_deleted.each解决了这个问题

希望这会有所帮助!