7

我有一个带有分页数据的表格,这是我为每一页选择数据的方式:

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

另外要建立表格分页,我需要知道记录的总数。目前我对此的解决方案非常粗糙:

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

所以我的问题如下 -为当前页面和记录总数选择有限数据的最佳 ruby​​ 方法是什么?

我注意到如果我这样做@visitors.count- 将生成额外的 sql 查询:

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 

首先,我不明白发送额外查询以获取我们已经拥有的数据计数的原因是什么,我的意思是,在我们从数据库中获取数据后,@visitors我们可以用 ruby​​ 对其进行计数,而无需发送额外的查询到数据库。

第二 - 我认为也许有一些方法可以使用类似的东西.total_count会产生类似的count(*)查询,但没有那个没用limit/offset

4

1 回答 1

13

您应该排除限制和偏移量 http://guides.rubyonrails.org/active_record_querying.html#except。看看 kaminari 是如何做到

所以它可能是这样的

total = @visitors.except(:offset, :limit, :order).count
于 2013-01-09T07:08:05.563 回答