2013-01-09 14 views
6

Tôi có một bảng với dữ liệu phân trang và đây là cách tôi chọn dữ liệu cho mỗi trang:Làm cách nào để chọn dữ liệu cho trang đã xác định và tổng số bản ghi?

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

Ngoài ra để xây dựng bảng pagination tôi cần phải biết tổng số hồ sơ. Hiện nay giải pháp của tôi cho điều này là rất khó khăn:

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 

Vì vậy, câu hỏi của tôi là như sau - ruby ​​cách tối ưu để chọn dữ liệu hạn chế cho trang hiện tại và tổng số hồ sơ là gì?

tôi nhận thấy rằng nếu tôi làm @ visitors.count - thêm truy vấn sql sẽ được tạo:

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 

Trước hết tôi không hiểu được lý do để gửi truy vấn bổ sung để có được số lượng dữ liệu là gì mà chúng tôi đã có, tôi có nghĩa là sau khi chúng tôi nhận dữ liệu từ cơ sở dữ liệu trong @visitors, chúng tôi có thể đếm số bằng ruby ​​mà không cần phải gửi truy vấn bổ sung cho DB.

Thứ hai - tôi nghĩ rằng có thể có một số cách để sử dụng một cái gì đó như .total_count sẽ tạo truy vấn 'đếm (*)' tương tự nhưng không có giới hạn/bù đắp vô dụng đó?

+1

Bạn không cần phải làm một truy vấn để có được số lượng truy vấn của bạn. Xem ['size' so với' length' so với 'count'] (http://stackoverflow.com/questions/6083219/activerecord-size-vs-count). –

+0

visitors.count số lượng dữ liệu giới hạn, tôi không thể sử dụng hoặc kích thước hoặc độ dài để nhận tổng số hồ sơ – SET

+0

@Andrew Marshall - tôi hiểu, đây là lý do tại sao truy vấn thứ 2 được gửi khi số điện thoại gọi() – SET

Trả lời