2014-12-03 125 views
4

我有一个Devise和偏执狂(acts_as_paranoid)gem的复杂问题。我的用户模型相对简单:Rails acts_as_paranoid迁移问题

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

我第一次加入了宝石设计没有确认的选项。然后,我后来添加了此迁移的可确认选项:

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行添加到用户模型中。我的数据库在当前状态下很好,但我试图重置我的数据库以将其与生产数据同步,这就是我遇到问题的地方。当我做了分贝:复位,它失败上述迁移:

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

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

任何想法,以优雅的方式来处理这种情况?

+1

您是否尝试过丢失的列上创建迁移? Paranoid gem〜act_as_paranoid表示您需要运行以下迁移:rails生成迁移AddDeletedAtToClients deleted_at:datetime:index – Miknash 2014-12-03 18:12:55

+1

是的,但稍后会在迁移路径中完成。这个错误发生在那之前。我没有任何安装偏执狂的问题 - 当我试图从头开始删除和重建我的数据库时,我只遇到了这个问题。 – 2014-12-03 19:41:39

+0

我有同样的问题。如果我在我的模型中注释出acts_as_paranoid,它可以工作,但显然只是停止模型中正在进行的任何检查,看是否被删除。对这方面的适当解决方案感兴趣。 – 2014-12-09 22:49:50

回答

3

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

如果您希望已将deleted_at设置为不设置confir_at的用户,则可能无法正常工作;对于我来说,我并不在乎被删除的用户是否有这个字段集(对我来说 - 这只是开发/测试中的一个问题,并且通常在没有记录的情况下发生)。

这一切之后 - 我认为这可能是时候了,我在using seeds or a gem for DML migrations

+0

我想修改以前的迁移以反映更新的代码更改是一个合理的解决方案。我敢打赌有人会不同意我的看法。 – 2015-06-10 05:37:05

+0

这应该被接受,对我很好! – Maor 2017-06-05 18:09:17

1

使用unscoped外观,同时使用模型+移民+ acts_as_paranoid。

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

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