GraphQLでのデータの並び替え引数をもたせる時の作り方 | Dev Driven 開発・デザインチーム GraphQLでのデータの並び替え引数をもたせる時の作り方 | 働くひとと組織の健康を創る iCARE

BLOG

GraphQLでのデータの並び替え引数をもたせる時の作り方

中村一星
2020/07/03

GraphQLでのデータの並び替え引数をもたせる時の作り方

先日GraphQLでの並び替えをリクエストで受け付けられるようにする必要がありました。
その際、GitHubのAPIを参考に実装しましたので、その説明をしたいと思います。

バックエンドは Rails + graphql-ruby です

そもそも何がうれしいの?

この方法で実装するメリットを挙げていきます。

  • 受け付けられる値を指定できるので、Rails側でチェックする処理を自分で書く必要がなくなる
    • 「D」だけでリクエストした場合、GraphQLのところで validation してくれます。
      validation
  • GraphiQLが使いやすくなる
    • 補完がきく
      • completation
    • ドキュメンテーション化が進む
      • String 型だと何が入力/受付可能なのかわからない(もしくはコメントで書く必要がある)のが、わかりやすくなっていますね!

作り方

以下の3つを作ります

  • SQLでいう order by をまとめる InputObject
class Types::Healthcheck::TermsCustomerOrder < Types::BaseInputObject
  argument :direction, Types::OrderDirection, required: false
  argument :field, Types::Healthcheck::TermsCustomerOrderField, required: false
end
  • 並び替えをするカラムを指定する Enum
class Types::Healthcheck::TermsCustomerOrderField < Types::BaseEnum
  value "CONSULTING_AT", "受診予定日時"
  value "DECISION_MAIL_SENT_AT", "確定メール送信日時"
  value "LAST_REMIND_MAIL_SENT_AT", "最終リマインドメール送信日時"
end
  • 並び替えをする方向を指定する Enum
class Types::OrderDirection < Types::BaseEnum
  value "ASC", "並び替えを昇順にする"
  value "DESC", "並び替えを降順にする"
end

query は以下のように実装しました。(簡略化しています)

def order_by_arguments(record_relation, order_by_arguments)
  record_relation
    .merge(
      ::Healthcheck::Reservation
        .order(order_by_arguments.field.downcase.to_sym => order_by_arguments.direction.downcase.to_sym)
    )
end

おわりに

ざっと説明しましたが、みなさんのGraphQLでの実装の参考になれば幸いです。

これからもみなさんに共有できる情報があればどんどんしていきたいと思います。

それでは!