Rails 4:带偏移量的 ActiveRecord 删除

use*_*954 0 ruby activerecord ruby-on-rails

我有一个程序每五分钟向我的 Rails 应用程序提交一个 HTTP 请求。这些记录在 ID 和 created_at 上有一个索引,以相反的顺序显示。由于这些状态更新的频率,我只想存储最近的十个。在研究如何执行此操作时,我认为偏移量非常适合检索然后删除数据集。尽管在我的 rails 控制台测试中,我无法说服 ActiveRecord 它想要以这种方式工作(它删除所有记录,而不仅仅是未包含在偏移量中的记录)。

有没有更有效的方法来做我想在我的控制器中做的事情?有没有办法使用 ActiveRecords 删除带有偏移量的记录?如果没有,那么做这件事的理想方法是什么?

def create
    env = Env.find_by_name(params[:updateresult][:env_name])
    @updateresult = env.updateresults.build(updateresult_params)
    respond_to do |format|
        if @updateresult.save
            format.json { render json: @updatresults, status: :created}
            #env.updateresults.where(:id => env.updateresults.offset(10).pluck(:id)).delete_all
        else
            format.json { render json: @updatresults.errors, status: :unprocessable_entity }
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

编辑:改变大卫的答案,在上面的代码中提出注释掉的答案

Dav*_*dge 5

我认为您不能在删除中使用偏移量,因此您可能必须:

delete from my_table
where id in (  select id
                 from my_table
             order by created_as desc
               offset 10);
Run Code Online (Sandbox Code Playgroud)

所以:

MyTable.where(:id => MyTable.order("created_at desc").offset(10).pluck(:id)).delete_all
Run Code Online (Sandbox Code Playgroud)

当然,您可以删除超过 50 分钟的记录吗?