要件からカーソルベースではなくオフセットベースのページネーションを作らないといけなかったがスムーズにいかなかったので当時のメモ。先輩にも助けて頂いた。
使用技術は
フロントエンド
- 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