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

私の質問は次のとおりです。現在のページとレコードの総数に対して限られたデータを選択するための最適なルビーの方法は何ですか?

@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​​ でカウントできるということです。 DBへ。

.total_count2番目-同様のクエリを生成するようなものを使用する方法がいくつかあると思いましたが、count(*)それがなければ役に立たないlimit/offsetでしょうか?

4

1 に答える 1

13

limit と offset http://guides.rubyonrails.org/active_record_querying.html#exceptを除外する必要があります。カミナリがどのようにそれを行うかを参照して ください

だから、それは次のようなものかもしれません

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