Ruby on rails Rails 4:ActiveRecord带偏移量删除
我有一个程序每五分钟向我的Rails应用程序提交一个HTTP请求。这些记录在ID上有一个索引,创建时按相反顺序显示。由于这些状态更新的频率,我只想存储其中最新的10个。在研究如何做到这一点时,我认为偏移量是检索然后删除数据集的最佳选择。虽然在我的rails控制台测试中,我无法说服ActiveRecord它希望以这种方式工作(它删除所有记录,而不仅仅是偏移量中未包含的记录) 有没有一种更有效的方法来完成我在控制器中要做的事情?有没有一种方法可以使用ActiveRecords删除具有偏移量的记录?如果不是的话,理想的方法是什么Ruby on rails Rails 4:ActiveRecord带偏移量删除,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有一个程序每五分钟向我的Rails应用程序提交一个HTTP请求。这些记录在ID上有一个索引,创建时按相反顺序显示。由于这些状态更新的频率,我只想存储其中最新的10个。在研究如何做到这一点时,我认为偏移量是检索然后删除数据集的最佳选择。虽然在我的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
编辑:修改了David的答案,在上面的代码中给出了注释掉的答案我认为您不能在删除中使用偏移量,因此您可能必须:
delete from my_table
where id in ( select id
from my_table
order by created_as desc
offset 10);
因此:
当然,您可以删除超过50分钟的记录?我认为您不能在删除中使用偏移量,因此您可能必须:
delete from my_table
where id in ( select id
from my_table
order by created_as desc
offset 10);
因此:
当然,你可以删除超过50分钟的记录?mhh我不完全明白你的意思,但是你的模型。在哪里(某物)。限制(10)。销毁所有记录都应该足以完成你要求的任务,更不用说,即使每5分钟销毁10条记录也不会给你带来任何麻烦,这是微观优化,你不应该这样做it@Fire-Dragon DoL我认为逻辑不是应该删除最早的10条记录,而是应该删除除最近的10条记录以外的所有记录。如果需要使用delete_all而不是destroy_all,请按照Davis的建议进行。顺便说一句,我不建议你这样做,因为它会忽略对这些对象的任何回调。你检查过这个Q&A吗?Mhhh除了你的模型之外,我不完全明白你的意思。在哪里(某物)。限制(10)。销毁所有这些都应该足以完成你要求的任务,更不用说,即使每5分钟销毁10条记录也不会给你带来任何麻烦,这是微观优化,你不应该这么做it@Fire-Dragon DoL我认为逻辑不是应该删除最早的10条记录,但是除了最近的10条记录外,所有的记录都应该被删除。如果你需要使用delete_-all而不是destroy_-all,请按照Davis的建议。顺便说一句,我不建议你这样做,因为它会忽略对这些对象的任何回调。你检查过这个问答吗?不能删除超过50分钟的记录,因为我可能有一天的记录,它传递了有用的信息!虽然这看起来很可靠,但我很快会尝试一下,然后带着我的发现回来。谢谢好吧!我需要对您的示例进行一些修改,因为MyTable属于另一个表的has_many(很明显,在本例中,MyTable是has_many)。有没有可能以更友好的方式做类似于上述的事情?划破它!经过几次排列后,我最终得到了HasManyTable.BelongsToTable.where(:id=>HasManyTable.BelongsToTable.offset(10)).delete_-all永远不依赖隐式排序顺序,特别是当您假设查询优化程序将在没有排序依据的情况下提供一个排序依据时——不应该依赖DISTINCT或GROUP-BY。Activerecord的第一个和最后一个方法也不是万无一失的——在3.2.13中,针对PostgreSQL的第一个方法不会在查询上放置“order by id”,尽管last确实如此。Hmmm,不确定。可能在一个单独的步骤中提取所需的id,并将其作为数组放入where子句。无法删除超过50分钟的记录,因为我可能有一天的记录可以传递有用的信息!虽然这看起来很可靠,但我很快会尝试一下,然后带着我的发现回来。谢谢好吧!我需要对您的示例进行一些修改,因为MyTable属于另一个表的has_many(很明显,在本例中,MyTable是has_many)。有没有可能以更友好的方式做类似于上述的事情?划破它!经过几次排列后,我最终得到了HasManyTable.BelongsToTable.where(:id=>HasManyTable.BelongsToTable.offset(10)).delete_-all永远不依赖隐式排序顺序,特别是当您假设查询优化程序将在没有排序依据的情况下提供一个排序依据时——不应该依赖DISTINCT或GROUP-BY。Activerecord的第一个和最后一个方法也不是万无一失的——在3.2.13中,针对PostgreSQL的第一个方法不会在查询上放置“order by id”,尽管last确实如此。Hmmm,不确定。可能在单独的步骤中提取所需的id,并将它们作为数组放入where子句中。