こんにちは!kossyです!
さて、今回はgraphql-rubyでカラムの値をよしなに加工して返す方法について、ブログに残してみたいと思います。
Typeファイル内にfield名と同じ名前の変数を定義する
以下のようなType定義をしているとします。
module Types class UserType < Types::BaseObject field :id, ID, null: false field :provider, String, null: false field :uid, String, null: false field :sign_in_count, Integer, null: false field :current_sign_in_at, GraphQL::Types::ISO8601DateTime, null: true field :name, String, null: true field :nickname, String, null: true field :image, String, null: true field :email, String, null: true field :created_at, GraphQL::Types::ISO8601DateTime, null: false field :updated_at, GraphQL::Types::ISO8601DateTime, null: false field :posts, [Types::PostType], null: true field :comments, [Types::CommentType], null: true def posts Loaders::AssociationLoader.for(User, :posts).load(object) end def comments Loaders::AssociationLoader.for(User, :comments).load(object) end end end
この時に、例えばemailの@以降の文字列からドメイン提供元の会社名が知りたいとします。
この場合、以下のようにfieldと同名の変数を定義することで、変数の計算結果を返すことができます。
module Types class UserType < Types::BaseObject # 省略 field :email_domain, String, null: true def email_domain return nil if object.email.blank? domain = object.email.split('@').last case domain when 'gmail.com' 'Google' when 'ezweb.ne.jp' 'au' when 'docomo.ne.jp' 'Docomo' when 'i.softbank.jp' 'ソフトバンク' end end # 省略 end end
カラム以外の値を返したい時なんかに使えるやり方かと思います。
勉強になりました。