graphql-rubyでモデルのカラムの値を加工して返したい

こんにちは!kossyです!




さて、今回はgraphql-rubyでカラムの値をよしなに加工して返す方法について、ブログに残してみたいと思います。



環境

Ruby 2.6.3
Rails 6.0.3.4
graphql 1.11.6
graphql-batch 0.4.3



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

カラム以外の値を返したい時なんかに使えるやり方かと思います。




勉強になりました。



大いに参考にさせていただいたサイト

この場を借りて御礼を申し上げます。

spirits.appirits.com