0

我正在开发一个 Rails 应用程序,它有一个更新一些用户信息的后台进程。为此,此方法必须删除所有现有信息(存储在另一个表中)并从 Internet 获取新信息。问题是,如果中途出现问题,用户在进程再次运行之前没有信息。

有一些事情要做:

transaction = EntityUser.delete_all(:user_id => @current_user.id)
#instructions that adds new  entity
...
...
transaction.commit

谁能建议我可以做些什么来避免这种问题?

谢谢你

4

1 回答 1

1

阅读有关ActiveRecord::Transactions的信息。您可以将所有内容包装在一个块中

ActiveRecord::Base.transaction do
  EntityUser.delete_all(:user_id => @current_user.id)

  # ...
end

如果出现问题,您可以raise ActiveRecord::Rollback在该块内调用以还原事务块内对数据库的所有更改。


另一个想法是软删除EntityUser实例,User而不是实际从数据库中删除它们。有一些 gem 可以帮助您使用此功能,例如acts_as_paranoid.

你会

  1. 软删除EntityUser实例
  2. 获取并构建新EntityUser实例
  3. (可选)如果一切顺利,则从数据库中刷新软删除的实例

如果使用此方法出现问题,很容易取消删除软删除的记录。

于 2013-01-16T16:34:43.093 回答