LoginSignup
4
0

More than 3 years have passed since last update.

【Rails】graphql-rubyでのオフセットベースのページネーションの実装方法【Graphql】

Posted at

要件からカーソルベースではなくオフセットベースのページネーションを作らないといけなかったがスムーズにいかなかったので当時のメモ。先輩にも助けて頂いた。

使用技術は
フロントエンド
- nuxt + vuetify
バックエンド
- rails + Graphql
という組み合わせ

実現方法としては
- カーソルベースで一度頭から該当ページのカーソルIDを取ってそれを元に1ページの個数をとるという2度APIを取る方法
- graphql-rubyにコードを追加してoffsetやtotal countを返す方法
の二つ考えられるが今回は後者を書く。

app/graphql/offset_extension.rb
class OffsetExtension < GraphQL::Schema::Field::ConnectionExtension
  def apply
    super
    field.argument :offset, 'Int', 'Offset value.', required: false
  end

  def after_resolve(args)
    offset = args[:memo][:offset]
    new_args = offset ? args.merge(value: args[:value].offset(offset)) : args

    super(new_args)
  end
end
app/graphql/types/base_field.rb

module Types
  class BaseField < GraphQL::Schema::Field
    argument_class Types::BaseArgument
    connection_extension(::OffsetExtension)
  end
end
app/graphql/types/pagination_connection.rb
module Types
  class PaginationConnection < GraphQL::Types::Relay::BaseConnection
    field :total_count, Int, null: false

    def total_count
      object.items.size
      object.items.unscope(:offset).unscope(:limit).count
    end
  end
end

参考
GraphQL RubyのPaginationについて|Daiki Tanaka|note

GraphQLでのPaginationの実装方法について(for ruby) - Qiita

graphql-rubyでページネーションがサクッと実装できたのでGemが何をやっているのか覗いてみた - Qiita

RailsでGraphQL APIを作る時に悩んだ5つのこと | スペースマーケットブログ

Offset based pagination in GraphQL-ruby - Blog by Abhay Nikam

Introduction to pagination in GraphQL

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0