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

![Artboard.png](https://qiita-image-store.s3.amazonaws.com/0/58639/f21d19f4-072c-1fbc-1a55-32e8d3ec9c29.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](http://graphql-ruby.org/getting_started) の中で 以下のように genarate してくださいとありますが、このgenerateor自体が古いので[TOPページ](http://graphql-ruby.org/)の example をコピペしましょう。

古い generator 

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

最新の書き方

```ruby: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のサンプルクエリは[こちら](https://www.yelp.com/developers/graphiql?query=%7B%0A%20%20search(term%3A%20%22burrito%22%2C%0A%20%20%20%20%20%20%20%20%20location%3A%20%22san%20francisco%22)%20%7B%0A%20%20%20%20total%0A%20%20%20%20business%20%7B%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20rating%0A%20%20%20%20%20%20review_count%0A%20%20%20%20%20%20location%20%7B%0A%20%20%20%20%20%20%20%20address1%0A%20%20%20%20%20%20%20%20city%0A%20%20%20%20%20%20%20%20state%0A%20%20%20%20%20%20%20%20country%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D
)


#### N+１問題
##### graphql-batch
検索するとよく出てくる方がこちらです。
これ用にロジックを多く書かないといけないので、記述量が増えてしまうのが懸念点でした。
↑のこの次の goldiloader で解決しきれなかったら導入検討します。
https://github.com/Shopify/graphql-batch
##### goldiloader
このgemであれば入れるだけで解決できるクエリも結構あるので試している最中です。
https://github.com/salsify/goldiloader

#### 本当にバージョン管理しなくていいのか
facebookのグラフAPIエクスプローラはがっつりバージョン管理していたので悩ましいところです。
(githubも頭にv4がついているのも気になります。）
<img width="523" alt="スクリーンショット 2018-12-18 22.55.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/200628/77d2d0b4-426d-cc41-a2d0-0eb3af3b3260.png">


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

グロービスはエンジニア・デザイナー積極採用中ですので、もし興味ある方は [Wantedly](https://www.wantedly.com/companies/globis) 覗いてください！


### 参考になるリンク
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