40
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

グロービスAdvent Calendar 2018

Day 19

GraphQL Ruby(class-based API)の導入でハマったこと

Last updated at Posted at 2018-12-19

Artboard.png

はじめに

ここ1,2週間くらいで GraphQL を Rails プロジェクトに導入したので、知見を共有できたらと思い書いていきます。
ハマったことを、解決したことと未だに困っていることに分けて書いていきます。

解決したこと

graphql-ruby の ドキュメントが古く、最新の書き方がわからなかった

graphql-rubyの commit 履歴を見て、ドキュメント、モジュールが古い場合は気をつけて使うようにしましょう。

重要! 5月頃リリースされたv1.8.0から大きく変わり、 class-based API になりました。
class-based APIの実装はこちらを参照してください。
http://graphql-ruby.org/schema/class_based_api

例えば、 Get Started の中で 以下のように genarate してくださいとありますが、このgenerateor自体が古いのでTOPページの example をコピペしましょう。

古い generator

rails g graphql:object Post title:String rating:Int comments:[Comment]

最新の書き方

app/graphql/types/profile_type.rb
class Types::ProfileType < Types::BaseObject
  field :id, ID, null: false
  field :name, String, null: false
  field :avatar, Types::PhotoType, null: true
end

GraphQLの参考になるものが少ない

こちらに public APIの参考URLがまとまっているので、ぜひ試してみてください。
https://github.com/APIs-guru/graphql-apis

ざっくりでいいからコーディング規約ほしい

kibelaの方がコーディング規約を公開しているので、参考にさせていただきました。
https://bitjourney.kibe.la/shared/entries/1f26acbe-315f-42b8-9ecd-11bcaac5b697

Collection と Array って何が違うの?

以下がわかりやすいです。

コレクション型のフィールドは基本的にconnection型にします
いかなるケースでも要素をすべて取得する フィールドはarray型にします
引用元:https://bitjourney.kibe.la/shared/entries/1f26acbe-315f-42b8-9ecd-11bcaac5b697#connection-vs-array

困っていること

どこまでwhereできるようにするべきか

GitHubはsearchというfieldを作って汎用的に検索できる形にしています。
この場合柔軟性は高いものの、 query に何を入れるべきかをドキュメントに書く必要があるのが面倒だと感じました。

yelpを見てみると、細かく引数が設定されていて利用イメージは湧きやすいかなと思いました。
ただ、引数が増えすぎると見づらいという問題はあります。
yelpのサンプルクエリはこちら

N+1問題

graphql-batch

検索するとよく出てくる方がこちらです。
これ用にロジックを多く書かないといけないので、記述量が増えてしまうのが懸念点でした。
↑のこの次の goldiloader で解決しきれなかったら導入検討します。
https://github.com/Shopify/graphql-batch

goldiloader

このgemであれば入れるだけで解決できるクエリも結構あるので試している最中です。
https://github.com/salsify/goldiloader

本当にバージョン管理しなくていいのか

facebookのグラフAPIエクスプローラはがっつりバージョン管理していたので悩ましいところです。
(githubも頭にv4がついているのも気になります。)
スクリーンショット 2018-12-18 22.55.24.png

最後に

GraphQLの導入により、アプリ・フロントとバックエンドとのコミュニケーションコストが下がりそうだと感じています。
本当に小さく始められるので、まず導入してみて合うかどうか見てみるとよさそうです。
いろいろな実装やスキーマ見ながら試行錯誤中ですが、もし知見がある方いらっしゃったらコメントいただけると助かります!

グロービスはエンジニア・デザイナー積極採用中ですので、もし興味ある方は Wantedly 覗いてください!

参考になるリンク

http://graphql-ruby.org/schema/class_based_api
https://www.howtographql.com/
https://qiita.com/vsanna/items/031aa5a17a2f284eb65d
https://bitjourney.kibe.la/shared/entries/1f26acbe-315f-42b8-9ecd-11bcaac5b697
https://www.yelp.com/developers/graphql/guides/intro
https://github.com/APIs-guru/graphql-apis

40
18
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
40
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?