1
0

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 3 years have passed since last update.

[Ruby]GraphQLのそれぞれのqueryをファイル分割する方法

Last updated at Posted at 2020-06-05

はじめに

最近、graphql-rubyを使ってAPI実装をしています。最初の頃は、query_type.rbにロジックを書いていました。でもクエリの数が多くなると、まあ見辛いこと!
そこで、query_type.rbにロジックを書かずにクエリごとに分割する方法を説明したいと思います。

やりたいこと

まず、もともとクエリを書いていたquery_type.rbがこんな感じだとします。

types/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を以下のように変更します。

types/query_type.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というフォルダを作りました。

queries/user.rb
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を用意すれば問題なしです。
ファイルを分割するだけで、かなり見易くなるので個人的にはかなりオススメです!

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?