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)
编辑:改变大卫的答案,在上面的代码中提出注释掉的答案
我认为您不能在删除中使用偏移量,因此您可能必须:
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 分钟的记录吗?