我试图将以下SQL查询转换为ActiveRecord并且它让我的大脑融化。
delete from table where id <= (
select max(id) from (
select id from table order by id limit 0, 10));
有什么想法吗?
我尝试做的是限制表格中的行数。所以,我想删除任何少于最近10个条目的内容。
编辑: 通过结合以下几个答案找到解决方案。
Temperature.where('id < ?', Temperature.order('id DESC').limit(10).pluck(:id).min).destroy_all
这给我留下了最新的10个条目。
答案 0 :(得分:6)
从您的SQL看起来,您希望从表中删除前10条记录。我相信到目前为止大多数答案都是如此。以下是另外两种选择:
基于MurifoX的版本:
Table.where(:id=>Table.order(:id).limit(10).pluck(:id)).destroy_all
这将有效地执行WHERE id IN(...)
版本略短:
Table.order(:id).limit(10).destroy_all
这将简单地抓住前10条记录并销毁
编辑:要获取除最近的X个记录之外的所有记录(例如10个),我现在只能想到这样做:
Table.order(:id).limit(Table.count - 10).destroy_all if Table.count > 10
本质上,抓住最旧的记录,只留下最近的10个记录,并将其破坏,假设桌面大小大于10.也许有更清洁的方法来做,但这是我现在唯一想象的就是这样做。
答案 1 :(得分:2)
model = Model.order(:id).limit(10).last
Model.where("id <= ?", model.id).destroy_all
答案 2 :(得分:1)
Model.destroy(Model.where('id <= ?', Model.order(:id).limit(10).pluck(:id).max))
答案 3 :(得分:0)
应该是
YourAR.destroy(YouAR.order(:ID)的.max(:ID))
那是未经测试的。想法是你要删除某些东西返回的ID数组。我不知道你是否可以在一个查询中完成所有操作(不需要执行SQL)。