2013-08-21 13 views
5

Próbuję przekonwertować następujące zapytanie SQL do ActiveRecord i topi mój mózg.ActiveRecord: Wybierz maksimum limitu

delete from table where id <= (
select max(id) from (
    select id from table order by id limit 0, 10)); 

Wszelkie pomysły?

Co próbuję zrobić, to ograniczyć liczbę wierszy w tabeli. Tak więc chcę usunąć wszystko, co jest mniej niż ostatnie 10 wpisów.

edytuj: Znaleziono rozwiązanie, łącząc kilka z poniższych odpowiedzi.

Temperature.where('id < ?', Temperature.order('id DESC').limit(10).pluck(:id).min).destroy_all 

Pozostaje mi to z ostatnimi 10 wpisami.

Odpowiedz

6

ze swojego SQL, wygląda na to, że chcesz usunąć pierwsze 10 rekordów z tabeli. Wierzę, że większość dotychczasowych odpowiedzi tak zrobi. Oto dwie dodatkowe możliwości:

podstawie wersji MurifoX za:

Table.where(:id=>Table.order(:id).limit(10).pluck(:id)).destroy_all 

To będzie skutecznie wykonywać WHERE id IN (...)

Nieco krótsza wersja:

Table.order(:id).limit(10).destroy_all 

To będzie po prostu chwytać pierwsze 10 rekordów i zniszczyć

EDIT: złapać wszystkie ale najnowszy numer X rekordów (10 na przykład), jedynym sposobem mogę myśleć to zrobić w tej chwili jest tak:

Table.order(:id).limit(Table.count - 10).destroy_all if Table.count > 10 

W istocie, chwyć najstarsze rekordy, pozostawiając tylko 10 najnowszych i zniszcz je, zakładając, że rozmiar stołu jest większy niż 10. Może jest to lepszy sposób, ale jest to jedyny sposób, jaki mogę sobie wyobrazić, robiąc to teraz.

+0

Właściwie to, co próbuję zrobić, to ograniczyć liczbę wierszy w tabeli. Więc jeśli jest 11, usuń 1. 15 usuń 5. – LifeOfRPi

+0

@LifeOfRPi Ok, myślę, że możemy to zrobić, aktualizując odpowiedź ... –

0

Powinny być

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

To niesprawdzone. Chodzi o to, że chcesz usunąć tablicę identyfikatorów zwróconych przez coś. Nie wiem, czy możesz zrobić to wszystko w jednym zapytaniu (bez wykonywania kodu SQL).

+3

Chcę tylko podkreślić, należy zachować ostrożność przy kasowaniu, ponieważ nie wywoła ono żadnego oddzwaniania. Zniszcz jednak. –

1

Hmm, może to?

Model.destroy(Model.where('id <= ?', Model.order(:id).limit(10).pluck(:id).max)) 
+0

jego nie jeden obiekt myślę, że – Zippie

+0

O tak. Masz rację. Oto "<='. – MurifoX

2
model = Model.order(:id).limit(10).last 

Model.where("id <= ?", model.id).destroy_all 
Powiązane problemy