Rails GraphQL入門|graphql-rubyでスキーマ・タイプ・リゾルバをやさしく理解
生徒
「RailsでAPIを作るとき、GraphQLってよく聞くんですが、何ができるんですか?」
先生
「GraphQLは、必要なデータだけを指定して取得できる仕組みです。Railsでは graphql-ruby を使って実装できます。」
生徒
「REST APIと何が違うんですか?」
先生
「RESTはURLごとに返すデータが決まっていますが、GraphQLは質問内容を自分で決められます。順番に仕組みを見ていきましょう。」
1. Rails の基本・概要(MVC・コンベンション・Railsとは)
Railsは、Rubyというプログラミング言語を使ってWebアプリケーションを作るためのフレームワークです。MVCとは、Model(データ管理)、View(画面表示)、Controller(処理の流れ)の役割を分ける考え方です。GraphQLを使う場合も、この基本構造は変わりません。Controllerの代わりにGraphQLのリゾルバが、データ取得の窓口になります。
2. 開発環境とインストール(Ruby・Bundler・Node・DB準備)
GraphQLをRailsで使うには、まずRubyとRailsが動く環境が必要です。Bundlerは、必要なライブラリをまとめて管理する道具です。graphql-rubyもGemとして追加します。Gemとは、Railsで使う部品セットのようなものです。
# Gemfile
gem 'graphql'
3. プロジェクト作成と構成(rails new・ディレクトリ構造・設定)
Rails APIモードでプロジェクトを作成すると、画面表示よりもAPI提供に特化した構成になります。GraphQLを導入すると、app/graphql ディレクトリが作られ、スキーマやタイプをここで管理します。これは設計図を置く場所だと考えると分かりやすいです。
rails new sample_api --api
rails generate graphql:install
4. ルーティング入門(resources・namespaces・constraints)
通常のRailsでは routes.rb にURLと処理の対応を書きます。GraphQLの場合、多くは /graphql という1つのエンドポイントを使います。ここにクエリ(質問)を送ることで、必要なデータを取得します。
post "/graphql", to: "graphql#execute"
5. コントローラ基礎(アクション・フィルタ・Strong Parameters)
GraphQL用のコントローラでは、受け取ったクエリをスキーマに渡して実行します。アクションとは処理の入口です。Strong Parametersは、受け取ってよいデータを制限する安全装置です。
class GraphqlController < ApplicationController
def execute
result = SampleSchema.execute(params[:query])
render json: result
end
end
6. ビューとテンプレート(ERB・Haml・Slim・パーシャル・レイアウト)
APIモードではHTMLビューはほとんど使いません。GraphQLはJSON形式でデータを返します。JSONとは、データを整理して渡すための書き方です。画面表示はフロントエンド側が担当します。
7. モデルとActive Record基礎(CRUD・スキーマ・ORMの基本)
GraphQLで取得するデータは、Railsのモデルから来ます。Active Recordは、データベース操作を簡単にする仕組みです。CRUDとは、作成・取得・更新・削除の基本操作です。
class User < ApplicationRecord
end
8. マイグレーションとスキーマ設計(型・インデックス・外部キー)
マイグレーションは、データベースの設計図です。型とはデータの種類のことです。GraphQLのタイプ定義は、このデータ構造を元に作ります。
create_table :users do |t|
t.string :name
t.timestamps
end
9. バリデーションとコールバック(presence・uniqueness・before_*)
バリデーションは、正しいデータかどうかを確認する仕組みです。GraphQLでデータを返す前にも、このチェックが働きます。コールバックは、保存前後に自動で実行される処理です。
10. アソシエーション(belongs_to・has_many・through・多対多)
アソシエーションは、モデル同士のつながりです。GraphQLのリゾルバでは、この関係を使って関連データを一緒に取得できます。これにより、必要な情報を一度にまとめて返せます。
field :users, [Types::UserType], null: false
def users
User.all
end