2013-08-21 8 views
5

Sto provando a convertire la seguente query SQL in ActiveRecord e mi sta sciogliendo il cervello.ActiveRecord: selezionare il limite massimo

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

Qualche idea?

Quello che sto cercando di fare è limitare il numero di righe nella tabella. Quindi, voglio cancellare tutto ciò che è inferiore alle 10 voci più recenti.

modifica: Trovato una soluzione combinando diverse delle risposte di seguito.

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

Questo mi lascia con le ultime 10 voci.

risposta

6

Dal vostro SQL, sembra che si desidera eliminare i primi 10 record dalla tabella. Credo che la maggior parte delle risposte finora sarà così. Qui ci sono due ulteriori alternative:

basato sulla versione di MurifoX:

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

Questo eseguirà in modo efficace un WHERE id IN (...)

versione leggermente più corta:

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

Questo semplicemente afferrerà i primi 10 record e distruggerà

EDIT: per afferrare tutti ma il più recente numero X di record (10 per esempio), unico modo che posso pensare di farlo in questo momento è questo:

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

In sostanza, prendi i record più vecchi, lasciando solo i 10 più recenti, e distruggili, assumendo che la dimensione del tavolo sia maggiore di 10. Forse c'è un modo più pulito per farlo, ma questo è l'unico modo in cui posso immaginare di farlo adesso.

+0

In realtà, quello che sto cercando di fare è limitare il numero di righe nella tabella. Quindi se ci sono 11, cancella 1. 15 cancella 5. – LifeOfRPi

+0

@LifeOfRPi Ok, penso che possiamo farlo, aggiornando la risposta ... –

0

Dovrebbe essere

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

Questo è non testati. L'idea è di voler eliminare l'array di ID restituiti da qualcosa. Non so se puoi fare tutto questo in una singola query (senza solo eseguire SQL).

+3

Voglio solo sottolineare, fare attenzione con l'eliminazione, in quanto non attiverà alcuna richiamata. Distruggere sarà comunque. –

1

Hmm, forse questo?

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

non è un singolo oggetto credo – Zippie

+0

Oh sì. Hai ragione. C'è un '<='. – MurifoX

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

Model.where("id <= ?", model.id).destroy_all