在删除之前将用户数据克隆到新表

时间:2017-03-20 15:40:30

标签: ruby-on-rails ruby activerecord

我正在寻找一些关于如何更好地处理用户删除的方向。理想情况下,在archive!中列无效之前,用户数据将被复制并存储到新表中。在归档用户数据之前,设置模型和迁移以克隆用户数据的最佳方法是什么?

在users_controller中,destroy方法很简单

 def destroy
    load_user
    @user.archive!
    flash[:notice] = 'User deleted'
    redirect_to action: :index
    ...
  end

档案!用户模型中的操作将使所有用户列无效,并在删除用户时将后缀添加到用户电子邮件的末尾。

def archive!
    self.is_archived = true

    self.email = "#{self.email}.archived#{Time.now.to_i}"
    self.encrypted_password = nil
    self.password_salt      = nil
    self.session_token      = nil
    self.perishable_token   = nil
    self.device_id          = nil
    self.verification_key   = nil
    self.save!

    self.update_column(:api_key, nil)
    UserGroup.delete_all(:user_id => self.id)
  end

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是简单地创建一个新表 - ArchivedUsers,其中包含与Users相同的所有属性以及您想要的任何其他信息(例如deleted_at

然后您的archive!方法可能如下所示:

def archive!
  additional_attributes = {
    deleted_at: Time.now.to_i
  }

  if ArchivedUser.create!(self.attributes.merge(additional_attributes))
    self.destroy!
  else
    # handle the ArchivedUser not being created properly
  end
end