GraphQLでのデータの並び替え引数をもたせる時の作り方
GraphQLでのデータの並び替え引数をもたせる時の作り方
先日GraphQLでの並び替えをリクエストで受け付けられるようにする必要がありました。
その際、GitHubのAPIを参考に実装しましたので、その説明をしたいと思います。
バックエンドは Rails + graphql-ruby です
そもそも何がうれしいの?
この方法で実装するメリットを挙げていきます。
- 受け付けられる値を指定できるので、Rails側でチェックする処理を自分で書く必要がなくなる
- 「D」だけでリクエストした場合、GraphQLのところで validation してくれます。
- 「D」だけでリクエストした場合、GraphQLのところで validation してくれます。
- GraphiQLが使いやすくなる
- 補完がきく
- ドキュメンテーション化が進む
- 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での実装の参考になれば幸いです。
これからもみなさんに共有できる情報があればどんどんしていきたいと思います。
それでは!