Подтвердить что ты не робот

Rails уничтожают все, кроме новейших n записей

Как уничтожить все, кроме новейших n записей, с помощью Rails ActiveRecord?

Я могу получить самые новые n записей, используя порядок и ограничение, но как я могу уничтожить обратный?

4b9b3361

Ответ 1

Любой из этих методов сделает это:

# 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)

Ответ 2

У меня есть два способа сделать это, предполагая, что 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 <= 6-й последней записи.

Кроме того, вы можете посмотреть этот SO question.

Ответ 3

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

Ответ 4

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

Это уничтожит всех людей, которые отвечают этому условию. Итак, все, что вам нужно, это инвертированные условия и destroy_all

Ответ 5

Предыдущие ответы используют find или last требуют создания ActiveModel, которые занимают дополнительное время вычисления.

Я думаю, что использование pluck лучше, так как оно создает только массив идентификаторов.

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

Ответ 6

[Rails 5/ActiveRecord:: Relation]

destroy_all больше не принимает параметры... На самом деле, ActiveRecord:: Relation никогда не разрешал параметры, которые я не думаю.. В любом случае, вы должны просто поставить условие перед ним, но используйте destroy_all после запроса, например:

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