ActiveRecord:选择最大限制

时间:2013-08-21 20:20:47

标签: ruby-on-rails ruby rails-activerecord

我试图将以下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个条目。

4 个答案:

答案 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)。