2013-01-09 17 views
6

Mam tabelę z danymi z numeracją stron i to jest sposób, w jaki wybrać dane dla każdej strony:Jak wybrać dane dla zdefiniowanej strony i całkowitej liczby rekordów?

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

także zbudować stół paginacji muszę wiedzieć całkowitą liczbę rekordów. Obecnie moje rozwiązanie tego problemu jest bardzo niebezpieczne:

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 

Więc moje pytanie brzmi następująco - Jaka jest optymalna droga rubin, aby wybrać ograniczone dane dotyczące bieżącej strony i łączną liczbę rekordów?

Zauważyłem, że jeśli to zrobię @ visitors.count - dodatkowy zapytań SQL zostanie wygenerowany:

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 

Przede wszystkim nie rozumiem, co jest powodem, aby wysłać zapytanie do zdobycia dodatkowej liczby danych które mamy już, mam na myśli to, że po tym jak dostaliśmy dane z bazy danych w @visitors możemy to policzyć z rubinem bez potrzeby wysyłania dodatkowego zapytania do DB.

Po drugie - pomyślałem, że być może istnieje sposób na użycie czegoś takiego jak .total_count, który wygeneruje podobne zapytanie "count (*)", ale bez tego bezużytecznego "limitu/offsetu"?

+1

Nie trzeba robić inne zapytanie, aby uzyskać liczbę zapytaniu. Zobacz ['size' vs.' length' vs. 'count'] (http://stackoverflow.com/questions/6083219/activerecord-size-vs-count). –

+0

liczba odwiedzin liczby odwiedzin ograniczonej części danych, nie mogę jej użyć ani rozmiaru ani długości, aby uzyskać całkowitą liczbę rekordów – SET

+0

@Andrew Marshall - Rozumiem, chodzi o to, dlaczego druga kwerenda jest wysyłana podczas liczenia połączeń() – SET

Odpowiedz

Powiązane problemy