ページ分割されたデータを含むテーブルがあり、これが各ページのデータを選択する方法です。
@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_count
2番目-同様のクエリを生成するようなものを使用する方法がいくつかあると思いましたが、count(*)
それがなければ役に立たないlimit/offset
でしょうか?