Rails会破坏所有最新的n条记录

时间:2010-10-16 08:01:34

标签: ruby-on-rails activerecord

如何使用Rails的ActiveRecord销毁除最新n条记录以外的所有记录?

我可以使用顺序和限制来获取最新的n条记录但是如何销毁反转?

7 个答案:

答案 0 :(得分:25)

这两种方法都可以做到:

# Fetch your latest N records
newest_n_records = Foo.find(:all, :order => 'created_at DESC', :limit => n)

# Then do:
Foo.destroy_all(['id NOT IN (?)', newest_n_records.collect(&:id)])

# Or:
Foo.destroy_all('created_at < ?', newest_n_records.last.created_at)

答案 1 :(得分:17)

我有两种方法,假设n = 5:

Foo.order('id desc').offset(5).destroy_all

这会先记录最新的记录,然后销毁第5条记录以外的所有内容。或者

Foo.destroy_all(['id <= ?', Foo.order('id desc').limit(1).offset(5).first.id])

这将找到第6个最新记录ID并删除id为&lt; =第6个最新记录ID的所有记录。

此外,您可能希望查看此SO question

答案 2 :(得分:6)

Foo.destroy_all(['id NOT IN (?)', Foo.last(1000).collect(&:id)])

答案 3 :(得分:4)

Person.destroy_all("last_login < '2004-04-04'")

这将摧毁所有符合条件的人。所以你需要的只是倒置条件和destroy_all

答案 4 :(得分:1)

以前的答案使用findlast需要创建ActiveModel,这需要额外的计算时间。

我认为使用pluck会更好,因为它只会创建一个ID数组。

ids = Foo.limit(n).order('id DESC').pluck(:id)
Foo.where('id NOT IN (?)', ids).destroy_all

答案 5 :(得分:0)

[Rails 5 / ActiveRecord :: Relation]

destroy_all不再需要参数......实际上,ActiveRecord :: Relation从不允许参数我不认为......无论如何,你应该把条件放在它之前,但是使用destroy_all < em>在查询之后,如下所示:

Person.destroy_all("last_login < '2004-04-04'")
Person.destroy_all(status: "inactive")
Person.where(age: 0..18).destroy_all

答案 6 :(得分:0)

这些都不在Rails 6中工作,但是delete_by does

keep_ids = [2345, 345256, 34]
Component.delete_by('id NOT IN (?) AND status = "inactive"', keep_ids) }