Рельсы уничтожают все, кроме новейших русских записей - PullRequest
19 голосов
/ 16 октября 2010

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

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

Ответы [ 6 ]

25 голосов
/ 16 октября 2010

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

# 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)
17 голосов
/ 11 июля 2014

У меня есть два способа сделать это, предполагая, что 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])

Это находит шестой последний идентификатор записи и удаляет все записи с идентификатором <= шестой последний идентификатор записи. </p>

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

6 голосов
/ 10 июля 2013
Foo.destroy_all(['id NOT IN (?)', Foo.last(1000).collect(&:id)])
4 голосов
/ 16 октября 2010

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

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

1 голос
/ 16 мая 2014

В предыдущих ответах для использования find или last требуется создание ActiveModel, что требует дополнительного времени вычислений.

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

ids = Foo.limit(n).order('id DESC').pluck(:id)
Foo.where('id NOT IN (?)', ids).destroy_all
0 голосов
/ 15 сентября 2017

[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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...