2013-01-09 6 views
6

Ich habe eine Tabelle mit paginierte Daten und das ist die Art, wie ich Daten für jede Seite wählen:So wählen Sie Daten für definierte Seite und die Gesamtzahl der Datensätze?

@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) 

Auch ich brauche Tabelle Paginierung zu bauen Gesamtanzahl von Datensätzen kennen. Derzeit meine Lösung für dieses ist sehr rau:

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 

Also meine Frage ist wie folgt - Was ist die optimale Rubin Art und Weise begrenzte Daten für die aktuelle Seite und die Gesamtzahl der Datensätze zu wählen?

Ich habe bemerkt, dass, wenn ich @ visitors.count tun - zusätzliche SQL-Abfrage generiert:

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 

Zunächst einmal ich verstehe nicht, was der Grund dafür ist, zusätzliche Abfrage zu senden Anzahl der Daten zu erhalten dass wir bereits haben, meine ich, dass, nachdem wir Daten aus der Datenbank in @visitors bekam können wir es mit Rubin ohne keine Notwendigkeit zu senden zusätzliche Abfrage an die DB zählen.

Zweitens - ich dachte, dass es vielleicht eine Möglichkeit gibt, etwas wie .total_count zu verwenden, das eine ähnliche "count (*)" -Abfrage generiert, aber ohne dieses nutzlose 'limit/offset'?

+1

sein Sie haben noch eine weitere Abfrage zu tun, um die Anzahl der Abfrage zu erhalten. Siehe [ 'size' vs.' length' vs. 'count'] (http://stackoverflow.com/questions/6083219/activerecord-size-vs-count). –

+0

visitors.count Rückkehr Anzahl der begrenzten Teil der Daten, ich es nicht oder Größe oder Länge verwenden können, Gesamtanzahl der Datensätze – SET

+0

@ Andrew Marshall zu bekommen - ich verstehe, das ist, warum zweite Abfrage gesendet wird, wenn Count() aufrufen – SET

Antwort

Verwandte Themen