5

我正在尝试将以下 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

4 回答 4

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。也许有一种更清洁的方法,但这是我现在能想象的唯一方法。

于 2013-08-21T20:52:22.117 回答
2
model = Model.order(:id).limit(10).last

Model.where("id <= ?", model.id).destroy_all
于 2013-08-21T20:29:52.217 回答
1

嗯,也许是这个?

Model.destroy(Model.where('id <= ?', Model.order(:id).limit(10).pluck(:id).max))
于 2013-08-21T20:27:29.787 回答
0

应该

YourAR.destroy(YouAR.order(:id).max(:id))

那是未经测试的。这个想法是你想删除一些东西返回的 ID 数组。我不知道您是否可以在一个查询中完成所有这些操作(而不只是执行 SQL)。

于 2013-08-21T20:27:10.653 回答