Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails批处理问题_Ruby On Rails_Batch Processing - Fatal编程技术网

Ruby on rails rails批处理问题

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”-可见、“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存储很便宜。)当一篇文章被标记为删除时,只需更改一个标志,不再显示它。这使得用户可以随时“取消删除”帖子——不必担心最后期限,也不必担心任何竞争条件