はじめに
最近、graphql-ruby
を使ってAPI実装をしています。最初の頃は、query_type.rb
にロジックを書いていました。でもクエリの数が多くなると、まあ見辛いこと!
そこで、query_type.rb
にロジックを書かずにクエリごとに分割する方法を説明したいと思います。
やりたいこと
まず、もともとクエリを書いていたquery_type.rbがこんな感じだとします。
module Types
class Query < Types::BaseObject
field :user, ObjectTypes::UserType, null: false do
argument :id, ID, required: true
end
def user(id:)
User.find(id)
end
field :post, ObjectTypes::PostType, null: false do
argument :id, ID, required: true
end
def post(id:)
Post.find(id)
end
end
idを引数にもらってuser,postを返す簡単なクエリですね。
このuserとpostを返すそれぞれのqueryを2つのファイル(user.rb,post.rb)に分割したいと思います。
クエリーを分割する
では、クエリーを分割していきます。
まずは、query_types.rbを以下のように変更します。
module Types
class QueryType < Types::BaseObject
field :user, resolver: Queries::User # userを返すqueryを定義
field :post, resolver: Queries::Post # postを返すqueryを定義
end
上記のようにquery_type.rbにfieldだけ定義します。resoleverで実際のロジックがある場所を指定します。
次に実際のロジック(resolver)を定義します。今回はgraphqlフォルダ直下にqueriesというフォルダを作りました。
module Queries
class User < BaseQuery
type ObjectTypes::UserType, null: false
argument :id, ID, required: true
def resolve(id:)
User.find(id)
end
end
これで、query_type.rbで定義したresolverが書けたので、userを取得することができます。
postに関しても同じようにpost.rbを用意すれば問題なしです。
ファイルを分割するだけで、かなり見易くなるので個人的にはかなりオススメです!