graphql-ruby ConnectionTypeでcursorはどうやって作られているのか
発端の疑問
ConnectionTypeでitemsを渡すだけでなぜcursorを指定したらなんでいい感じにoffsetやpageが指定されるのか
cursorは何をencodeしたものなのか
ざっくり回答
ConnectionTypeでcursorからoffsetやpageを作っている
graphql
graphql-ruby
cursorは何をencodeしたものなのか
クエリ
https://gyazo.com/8dcd3e7132085673e53c6dba8ac5a798
このendCursorってどうやって作ってる?
でメモしながら読んだ
code:ruby
def cursor_for(item)
load_nodes
# index in nodes + existing offset + 1 (because it's offset, not index)
offset = nodes.index(item) + 1 + (@paged_nodes_offset || 0) - (relation_offset(items) || 0)
encode(offset.to_s)
end
ここで作ってそう。
offsetの計算式、特に@paged_nodes_offset と relation_offset の生成方法を追ってるけどいまいちわからん
afterより前のnodeの数と考えていいのかな
cursorは何をencodeしたものなのか
の答えとしては、「ActiveRecordの場合 offsetの数値」となる
Arrayだったら「idx = items.find_index(item) + 1」だった
ただ本当に知りたいのはpaged_nodes_offset と relation_offset の生成方法な気がする