如何使用传递给Graphql ruby​​字段的参数来转换结果?

时间:2018-11-06 17:54:57

标签: ruby graphql graphql-ruby

我希望做的事情类似于graphql教程中的内容:https://graphql.org/learn/queries/#arguments

我想将英尺/米传递到缩放器字段以转换返回的结果。

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

我不知道如何使用graphql-ruby在ruby中做到这一点。

我目前的类型如下:

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

我发现对于返回的每个实例都调用了resolver方法(高度)...但是我不知道如何访问当前值。

谢谢

2 个答案:

答案 0 :(得分:1)

在类型定义中定义解析方法时,Ruby Graphql会假定该方法将解析该值。因此,在运行当前方法def height(unit: nil)时,它不知道当前的高度值是什么,因为它期望您对其进行定义。

相反,您想要做的就是将解析方法移至针对Human类型返回的模型/对象。例如,在rails中,您可以这样做:

# 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随后将在传递给它的人类实例上调用.height

答案 1 :(得分:0)

我发现要查询的对象在解决方法本身中可用

def height(unit: nil)
  # do some conversion here and return the value you want.
  self.object.height
end