Ruby on rails rails批处理问题
在我的应用程序中,用户可以将帖子的状态设置为不同的标志,如“v”-可见、“d”-删除标记等 这些标志通过控制器动作设置 我有一个批处理过程,可以运行并清理所有标记为删除的帖子 Post.find(:all,:conditions=>['status=?','d'])。每个都做| p| p、 毁灭 结束 此批处理过程每x多分钟运行一次 假设一个用户用'd'=>标记文章,批处理过程在某些点运行=>而进程正在运行,用户将文章标记为'v'。现在,在批处理过程中,记录已成为删除的目标,并且将在do循环完成时删除,但标志已通过控制器操作更改 理想情况下,如果发生这种情况,我不希望在批处理过程中删除该帖子Ruby on rails rails批处理问题,ruby-on-rails,batch-processing,Ruby On Rails,Batch Processing,在我的应用程序中,用户可以将帖子的状态设置为不同的标志,如“v”-可见、“d”-删除标记等 这些标志通过控制器动作设置 我有一个批处理过程,可以运行并清理所有标记为删除的帖子 Post.find(:all,:conditions=>['status=?','d'])。每个都做| p| p、 毁灭 结束 此批处理过程每x多分钟运行一次 假设一个用户用'd'=>标记文章,批处理过程在某些点运行=>而进程正在运行,用户将文章标记为'v'。现在,在批处理过程中,记录已成为删除的目标,并且将在do循环完成
处理这个问题的最佳方法是什么?按照您描述的方式,这是一种竞赛条件用户可以在帖子已处于删除过程中时将其标记为v。用户的请求将被忽略 根据您的目标,有很多方法可以改变这一点: 1) 从
Post.find(:all, :conditions => ['status = ?', 'd']).each do |p| p.destroy end
to
Post.find(:all, :conditions => ['status = ?', 'd']).each do |p|
p.reload
p.destroy if p.status == 'd'
end
这将最小化检查状态和删除帖子之间的时间窗口
2) 更改帖子的显示,仅在状态不是“d”时显示帖子。这将有效加快删除速度,因为其他人将要删除的帖子标记为“v”的时间要少得多
3) 为了让人们有更长的时间改变主意,每天只运行一次批处理作业,直到深夜。将帖子标记为d(待删除)后,以特殊方式显示帖子,以警告用户该帖子即将被删除。这使他们有最长的时间撤消删除请求
4) 永远不要破坏数据。(DBMS存储很便宜。)当一篇文章被标记为删除时,只需更改一个标志,不再显示它。这使得用户可以随时“取消删除”帖子——不必担心最后期限,也不必担心任何竞争条件