ruby-on-rails 如何从ruby hash构建GQL?

wmtdaxz3  于 2023-08-08  发布在  Ruby
关注(0)|答案(2)|浏览(136)

我正在构建一个rspec帮助器来测试我的graphql请求。
到目前为止,这是我的助手:

def mutation_params(name, attributes:, return_types:)
  {
    query:
      <<~GQL
          mutation {
          #{name}(
            input: { attributes: #{attributes} })
            #{return_types}
        }
      GQL
  }
end

字符串
我必须这样声明attributes

let(:attributes) do
  <<~GQL
    {
      email: "#{email_param}",
      password: "#{password_param}"
    }
  GQL
end


现在我想知道我能做些什么来简单地传递我的arguments作为哈希值,并让mutations_params方法通过迭代从哈希值构建GQL。

let(:attributes) do
  {
    email: email_param,
    password: password_param
  }
end


例如:

def mutation_params(name, attributes:, return_types)
  gql_attributes = <<~GQL 
                    { 
                    }
                  GQL
  attributes.each do |key, value|
    gql_attributes merge with 
    <<~GQL
        "#{key}": "#{value}"
    GQL
  end

  {
  query:
    <<~GQL
        mutation {
        #{name}(
          input: { attributes: #{gql_attributes} })
          #{return_types}
      }
    GQL
  }
end


但这显然行不通我想我的问题是我真的不明白<<~GQL是什么以及如何操作它。

vngu2lb8

vngu2lb81#

您正在寻找Ruby 2.3中引入的弯曲的heredoc。就像一个普通的heredoc但是它去掉了前导缩进。https://ruby-doc.org/core-2.5.0/doc/syntax/literals_rdoc.html
所以换句话说,它只是一个字符串!GQL位是任意的,但却是传达heredoc目的的好方法。
您可以编写一个类似于这样的帮助器来将哈希转换为GraphQL字符串

def hash_to_mutation(hash)
  attr_gql_str = attributes.map{|k,v| "#{k}: #{v.inspect}"}.join(", ")
  " { #{attr_gql_str} } "
end

字符串
然后假设属性是一个散列,就像你的例子中一样,你可以

def mutation_params(name, attributes:, return_types:)
  {
    query:
      <<~GQL
          mutation {
          #{name}(
            input: { attributes: #{hash_to_gql(attributes)} })
            #{return_types}
        }
      GQL
  }
end

92dk7w1h

92dk7w1h2#

它稍微冗长一些,但是这个转换将处理嵌套哈希和大多数常见输入数据类型

def to_graphql_input(hash)
  input_fields = hash.map do |key, value|
    key_str = key.to_s.camelize(:lower)
    value_str = case value
      when Hash
        to_graphql_input(value)
      when Array
        "[#{value.map { |v| to_graphql_input(v) }.join(", ")}]"
      else
        value.to_json # For string, numeric, boolean, and null values
      end
    "#{key_str}: #{value_str}"
  end

  "{#{input_fields.join(", ")}}"
end

字符串

相关问题