Search code examples
rubygraphqlgraphql-ruby

How do I use arguments that are passed to a Graphql ruby field to transform the result?


I am looking to do something similar to what is done in the graphql tutorial: https://graphql.org/learn/queries/#arguments

I want to pass feet/meters to a scaler field to transform the result that is returned.

{
  human(id: "1000") {
    name
    height(unit: FOOT)
  }
}

I can't figure out how to do that in ruby using graphql-ruby.

I currently have a type that looks like:

class Types::Human < Types::BaseObject

  field :id, ID, null: false
  field :height, Int, null: true do
     argument :unit, String, required: false
  end

  def height(unit: nil)

  #what do I do here to access the current value of height so I can use unit to transform the result?

  end
end

I have found that the resolver method (height) is called for every instance that is returned... but I don't know how to access the current value.

Thanks


Solution

  • When you define a resolving method inside of your type definition Graphql Ruby assumes that that method will resolve the value. So at the time your current method def height(unit: nil) is ran it doesn't know what the current height value is because it is expecting you to define it.

    Instead what you would want to do is move the resolving method to the model / object returned for the Human type. For example, in rails you might do this:

    # app/graphql/types/human_type.rb
    class Types::Human < Types::BaseObject
    
      field :id, ID, null: false
      field :height, Int, null: true do
        argument :unit, String, required: false
      end
    
    end
    
    # app/models/human.rb
    class Human < ApplicationRecord
    
      def height(unit: nil)
        # access to height with self[:height]. 
        # You must use self[:height] so as to access the height property
        # and not call the method you defined.  Note: This overrides the
        # getter for height.
      end
    end
    

    GraphQL Ruby will then call .height on the instance of human that is passed to it.