我有一张桌子,我想继续修剪500个最近的行。在rails中执行此操作的最有效方法是什么?
答案 0 :(得分:3)
一种方法:
class MyModel
after_create do
self.class.prune(500)
end
def self.prune(max)
if count > max
order('created_at DESC').offset(max).each do |model|
model.destroy
end
end
end
end
如果您想在多个模型上使用prune
类方法,也可以将ActiveRecord::Base
类方法添加到{{1}}。
答案 1 :(得分:1)
这绝对是一种方法,尽管有人可能会以更有效的方式参与其中。在你的控制器中创建一个方法,对于这个例子,我将其称为“prune”,并在你的创建动作之后调用它(可能有一个after_filter或类似的东西你可以使用。)它应该看起来像这样。
def prune
if MyModel.count > 500
@models = MyModel.all(:offset => 500)
@models.each do |m|
m.destroy!
end
end
end
答案 2 :(得分:0)
一个基本的解决方案是在调度应用程序下使用以下脚本,例如每当https://github.com/javan/whenever运行以下命令时:
Mould.order('updated_at DESC').offset(20).each {|m| m.destroy }
用您的模型名称替换Mold。 cron和调度的使用已在以下帖子中详细讨论:A cron job for rails: best practices?