2011-11-23 18 views
6

Rubino 1.9.2/rails 3.1/deploy su Heroku -> PosgreSQLRientro ogni ennesima riga dal database utilizzando ActiveRecord in Rails

Ciao, Una volta che un certo numero di righe relative ad un oggetto va oltre un certo importo, ho desidero ritirare invece ogni ennesima riga. È semplicemente perché le righe vengono utilizzate (in parte) per visualizzare i dati per la rappresentazione grafica, quindi una volta che il numero di righe restituite va sopra il numero diciamo 20, è opportuno tornare ogni secondo e così via.

Questa domanda sembrava puntare nella giusta direzione: ActiveRecord Find - Skipping Records or Getting Every Nth Record

Facendo un mod nel braccio della serie ha un senso, ma utilizzando in fondo:

@widgetstats = self.widgetstats.find(:all,:conditions => 'MOD(ROW_NUMBER(),3) = 0 ') 

non funziona, restituisce un errore:

E qualsiasi tentativo di risolverlo con es. basando la mia clausola sintassi OLTRE sulle cose che vedo nella risposta su questa questione:

Row numbering in PostgreSQL

termina con errori di sintassi e non riesco a ottenere un risultato.

Mi manca un modo più ovvio per restituire in modo efficiente ogni ennesimo compito o se sono sulla strada giusta tutti i suggerimenti sulla strada da percorrere? Ovviamente il ripristino di tutti i dati e il successivo fissaggio in binari è possibile, ma terribilmente inefficiente.

Grazie!

risposta

7

Penso che siete alla ricerca di una query come questa:

SELECT * FROM (SELECT widgetstats.*, row_number() OVER() AS rownum FROM widgetstats ORDER BY id) stats WHERE mod(rownum,3) = 0 

Questo è difficile da compilare usando ActiveRecord, quindi potresti essere costretto a fare qualcosa del tipo:

@widgetstats = self.widgetstats.find_by_sql(
    %{ 
    SELECT * FROM 
    (
     SELECT widgetstats.*, row_number() OVER() AS rownum FROM widgetstats ORDER BY id 
    ) AS stats 
    WHERE mod(rownum,3) = 0 
    } 
) 

Ovviamente si desidera modificare l'ordine utilizzato e aggiungere eventuali clausole WHERE o altre modifiche in base alle proprie esigenze.

2

Se dovessi risolvere ciò, scriverei l'SQL personalmente, come l'SQL a cui ti sei collegato. Si può fare questo con

my_model.connection.execute('...') 

o semplicemente ottenere i numeri di identificazione e di trovare da id

ids = (1..30).step(2) 
my_model.where(id => ids) 
Problemi correlati