Search code examples
graphqlgraphql-ruby

passing arguments in graphQL queries


I'm just starting to learn GraphQL and I'm currently trying to create a clone of twitter. In the code below, is there a way I can pass the 81 from the id argument (e.g. user(id: 81)) automatically to the userId argument (e.g. tweets(userId: 81))?

I've copied my code below

{
  user(id: 81) {
    username
    email
    tweets(userId: 81) {
      content
    }
  }
}

user_type.rb

module Types
  class UserType < Types::BaseObject
    field :username, String, null: false
    field :email, String, null: false
    field :bio, String, null: true
    field :tweets, [Types::TweetType], null: true do
      argument :user_id, ID, required: true
    end

    def tweets(user_id:)
      Tweet.where(user_id: user_id)
    end
  end
end

tweet_type.rb

module Types
  class TweetType < Types::BaseObject
    field :id, ID, null: false
    field :content, String, null: false
    field :userId, ID, null: false
    field :createdAt, GraphQL::Types::ISO8601DateTime, null: false
    field :user, Types::UserType, null: false
  end
end

query_type.rb

module Types
  class QueryType < Types::BaseObject
    field :tweets,
      [Types::TweetType],
      null: false,
      description: "Returns a list of all tweets"

    field :user,
      Types::UserType,
      null: false,
      description: "Returns a list of all users" do
        argument :id, ID, required: true
      end

    def tweets
      Tweet.all
    end

    def user(id:)
      User.find(id)
    end
  end
end

Solution

  • GraphQL has a first-class way to factor dynamic values out of the query, and pass them as a separate dictionary (variables). You would use syntax similar to that below, and can read more about it here.

      query User($id: Int) {
        user(id: $id) {
            username
            email
            tweets(userId: $id) {
              content
            }
         }
       }