2013-01-09 13 views
6

Ho una tabella con i dati impaginati e questo è il mio modo di selezionare i dati per ogni pagina:Come selezionare i dati per la pagina definita e il conteggio totale dei record?

@visitors = EventsVisitor 
     .select('visitors.*, events_visitors.checked_in, events_visitors.checkin_date, events_visitors.source, events_visitors.id AS ticket_id') 
     .joins(:visitor) 
     .order(order) 
     .where(:event_id => params[:event_id]) 
     .where(filter_search) 
     .where(mode) 
     .limit(limit) 
     .offset(offset) 

anche per costruire l'impaginazione tavolo ho bisogno di sapere conteggio totale di record. Attualmente la mia soluzione per questo è molto ruvido:

total = EventsVisitor 
     .select('count(*) as count, events_visitors.*') 
     .joins(:visitor) 
     .order(order) 
     .where(:event_id => params[:event_id]) 
     .where(filter_search) 
     .where(mode) 
     .first() 
     .count 

Quindi la mia domanda è la seguente - Qual è il modo ottimale rubino per selezionare i dati limitati per pagina corrente e il numero totale di record?

Ho notato che se faccio @ visitors.count - query SQL aggiuntivo verrà generato:

SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM `events_visitors` INNER JOIN `visitors` ON `visitors`.`id` = `events_visitors`.`visitor_id` WHERE `events_visitors`.`event_id` = 1 LIMIT 15 OFFSET 0) subquery_for_count 

Prima di tutto non capisco qual è il motivo di inviare ulteriore query per ottenere conteggio dei dati che abbiamo già, voglio dire che dopo aver ottenuto i dati dal database in @visitors possiamo contarlo con ruby ​​senza bisogno di inviare ulteriori query al DB.

Secondo: ho pensato che forse ci fosse un modo per usare qualcosa come .total_count che genererebbe una query 'count (*)' simile ma senza quell'inutile 'limite/offset'?

+1

Non devi fare un'altra query per ottenere il conteggio della query. Vedi ['size' vs.' length' vs. 'count'] (http://stackoverflow.com/questions/6083219/activerecord-size-vs-count). –

+0

visitor.count conteggio di ritorno di una porzione limitata di dati, non posso usarlo o dimensione o lunghezza per ottenere il conteggio totale dei record – SET

+0

@Andrew Marshall - ho capito, questo è il motivo per cui viene inviata la seconda query quando si chiama count() – SET

risposta

Problemi correlati