Как уничтожить все, кроме новейших n записей, с помощью Rails ActiveRecord?
Я могу получить самые новые n записей, используя порядок и ограничение, но как я могу уничтожить обратный?
Как уничтожить все, кроме новейших n записей, с помощью Rails ActiveRecord?
Я могу получить самые новые n записей, используя порядок и ограничение, но как я могу уничтожить обратный?
Любой из этих методов сделает это:
# 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)
У меня есть два способа сделать это, предполагая, что 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.
Foo.destroy_all(['id NOT IN (?)', Foo.last(1000).collect(&:id)])
Person.destroy_all("last_login < '2004-04-04'")
Это уничтожит всех людей, которые отвечают этому условию. Итак, все, что вам нужно, это инвертированные условия и destroy_all
Предыдущие ответы используют find
или last
требуют создания ActiveModel, которые занимают дополнительное время вычисления.
Я думаю, что использование pluck
лучше, так как оно создает только массив идентификаторов.
ids = Foo.limit(n).order('id DESC').pluck(:id)
Foo.where('id NOT IN (?)', ids).destroy_all
[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