Как использовать аргументы, которые передаются в поле Graphql ruby ​​для преобразования результата? - PullRequest
0 голосов
/ 06 ноября 2018

Я собираюсь сделать что-то похожее на то, что сделано в руководстве по графику: https://graphql.org/learn/queries/#arguments

Я хочу передать футы / метры в поле масштабера, чтобы преобразовать возвращаемый результат.

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

Я не могу понять, как это сделать в ruby, используя graphql-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 голосов
/ 13 ноября 2018

Я обнаружил, что запрашиваемый объект доступен в самом методе разрешения

def height(unit: nil)
  # do some conversion here and return the value you want.
  self.object.height
end
0 голосов
/ 11 ноября 2018

Когда вы определяете разрешающий метод внутри вашего определения типа, Graphql Ruby предполагает, что этот метод разрешит значение. Таким образом, в то время как ваш текущий метод def height(unit: nil) запущен, он не знает, каково текущее значение высоты, потому что он ожидает, что вы определите его.

Вместо этого вам нужно переместить метод разрешения в модель / объект, возвращаемый для типа Human. Например, в рельсах вы можете сделать это:

# 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 в случае экземпляра человека, который ему передан.

...