-
-
Save yana-gi/0d897ecb9a793d08d223b2aecdf7d1e8 to your computer and use it in GitHub Desktop.
graphql-rubyのカーソルを作っているながれ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"$schema": "https://aka.ms/codetour-schema", | |
"title": "カーソルがどうやって作られているか", | |
"steps": [ | |
{ | |
"file": "lib/graphql/types/relay/page_info.rb", | |
"description": "pageinfoの定義から見ていく\n", | |
"line": 6 | |
}, | |
{ | |
"file": "lib/graphql/types/relay/page_info.rb", | |
"description": "PageInfoBehaviorsをincludeしている", | |
"line": 7 | |
}, | |
{ | |
"file": "lib/graphql/types/relay/page_info_behaviors.rb", | |
"description": "end_cursor はここ\n", | |
"line": 18 | |
}, | |
{ | |
"file": "lib/graphql/types/relay/page_info_behaviors.rb", | |
"description": "includedされた時にこのメソッドが呼び出される\n\nhttps://docs.ruby-lang.org/ja/latest/method/Module/i/included.html\n", | |
"line": 6 | |
}, | |
{ | |
"file": "lib/graphql/types/relay/page_info_behaviors.rb", | |
"description": "child_class のメソッドにClassMethodsを追加している\n\nつまり今回は default_relay?がPageInfoクラスに追加される\n(今後ClassMethodsが増えても記述量が増えなくて便利、的な?)\n", | |
"line": 7 | |
}, | |
{ | |
"file": "lib/graphql/types/relay/page_info_behaviors.rb", | |
"description": "pageInfoにhas_next_pageメソッドを追加している", | |
"line": 9 | |
}, | |
{ | |
"file": "lib/graphql/types/relay/page_info_behaviors.rb", | |
"description": "pageInfoにend_cursorメソッドを追加している", | |
"line": 18 | |
}, | |
{ | |
"file": "lib/graphql/pagination/connection.rb", | |
"description": "end_cursorの実装はここ", | |
"line": 214 | |
}, | |
{ | |
"file": "lib/graphql/pagination/connection.rb", | |
"description": "end_cursorの実装はここ", | |
"line": 214 | |
}, | |
{ | |
"file": "lib/graphql/pagination/connection.rb", | |
"description": "nodes.lastがある場合(つまりnodeがなかった場合はnulが返ってくる)\ncursor_for(nodes.last)の値が返ってくる\n\n", | |
"line": 215 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "nodes.index(item) + 1\nindexは Array#index のindex。つまりnodeの中でitemが何番目の要素かを返す。0始まりなので+1してる", | |
"line": 50 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "@paged_nodes_offset はここで入れてる\n\nrelation_offsetとは", | |
"line": 210 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "初期代入はここっぽい \n@sliced_nodes_offsetとは", | |
"line": 188 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "sliced_nodes_offsetの代入場所\n\nnext_offsetとは", | |
"line": 141 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "next_offsetの代入場所\n\nrelation_offsetとは", | |
"line": 119 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "itemsの型によるっぽい", | |
"line": 66 | |
}, | |
{ | |
"file": "lib/graphql/pagination/active_record_relation_connection.rb", | |
"description": "ここでrelation_offsetを定義してる", | |
"line": 35 | |
}, | |
{ | |
"file": "lib/graphql/pagination/active_record_relation_connection.rb", | |
"description": "relation.class は User::ActiveRecord_Relation\n\noffset_valueの定義場所\n\n04:0> m = relation.method(:offset_value)\n05:0> m.source_location\n=> \n[\"/Users/yana/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/activerecord-6.1.6.1/lib/active_record/relation/query_methods.rb\", , 98]", | |
"line": 40 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "難しくなったのでもう一度ここに帰る\n\n(relation対象のnodesのindex + 1) + nodes_offsetのpaged? -\n\nusers(first:1, after:\"Mg\")(Mgは2番目の要素)\nの計算式は 1 + 2 - 0 だった\n\npaged_nodes_offset は afterより前のnodeの数と考えていいのかな", | |
"line": 51 | |
}, | |
{ | |
"file": "lib/graphql/pagination/connection.rb", | |
"description": "ここでは定義されていないので継承先で実装されていそう", | |
"line": 222 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "nodesはload_nodesした後の@nodesの値", | |
"line": 50 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "ActiveRecordRelationはRelationConnectionを継承しているので、cursor_forの実装はここ", | |
"line": 47 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "```ruby\n08:0> limited_nodes.to_a\n=> \n[#<User:0x0000000114997f18 \n id: 3, \n name: \"user\", \n email: nil, \n created_at: Mon, 18 Jul 2022 09:49:16.616049000 UTC +00:00, \n updated_at: Mon, 18 Jul 2022 09:49:16.616049000 UTC +00:00>] \nirb(#<GraphQL::Pagination::ActiveRecordRelationConnection:0x0000000114dae930>):0\n\n```\nlimited_nodes自体はUser::ActiveRecord_Relation", | |
"line": 222 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "pagenationで指定された対象のnodesを @nodes 格納していた", | |
"line": 48 | |
}, | |
{ | |
"file": "lib/graphql/pagination/relation_connection.rb", | |
"description": "load_nodesは何をしているか", | |
"line": 48 | |
} | |
], | |
"ref": "master" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment