我正在开发一个Rails应用程序,该应用程序具有更新一些用户信息的后台进程。为此,该方法必须删除所有现有信息(存储在另一个表中),并从Internet获取新信息。问题是,如果中途出现问题,用户在进程再次运行之前无法获得信息。
有事情要做,比如:
transaction = EntityUser.delete_all(:user_id => @current_user.id)
#instructions that adds new entity
...
...
transaction.commit
谁能建议我做些什么来避免这种问题?谢谢
阅读有关ActiveRecord::Transactions的信息。你可以把所有东西都包装在一个块中
ActiveRecord::Base.transaction do
EntityUser.delete_all(:user_id => @current_user.id)
# ...
end
如果出现问题,您可以在该块中调用raise ActiveRecord::Rollback
,以导致事务块中数据库的所有更改被恢复。
另一个想法是为User
软删除EntityUser
实例,而不是实际从数据库中删除它们。有一些宝石可以帮助您实现此功能,例如 acts_as_paranoid
。
你会
- 软删除
EntityUser
实例 - 获取并构建新的
EntityUser
实例 - (可选)如果一切顺利,则从数据库中刷新软删除实例
如果使用此方法出现问题,则很容易重新删除软删除的记录。