rails-graphql-patterns

GraphQL patterns for Rails applications using graphql-ruby gem. Automatically invoked when working with GraphQL schemas, types, resolvers, mutations, subscriptions, or the app/graphql directory. Triggers on "GraphQL", "schema", "resolver", "mutation", "query type", "subscription", "graphql-ruby", "field", "argument", "N+1 graphql", "dataloader".

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "rails-graphql-patterns" with this command: npx skills add ag0os/rails-dev-plugin/ag0os-rails-dev-plugin-rails-graphql-patterns

Rails GraphQL Patterns

Patterns for building GraphQL APIs in Rails applications using graphql-ruby.

When This Skill Applies

  • Designing GraphQL schemas and types
  • Implementing resolvers and mutations
  • Optimizing queries and preventing N+1 problems
  • Handling authentication/authorization in GraphQL
  • Implementing subscriptions for real-time updates
  • Structuring the app/graphql directory

Quick Reference

ComponentPurposeLocation
TypesDefine object shapesapp/graphql/types/
QueriesRead operationsapp/graphql/types/query_type.rb
MutationsWrite operationsapp/graphql/mutations/
ResolversQuery logicapp/graphql/resolvers/
SourcesDataLoader batchingapp/graphql/sources/

Detailed Documentation

  • patterns.md - Complete GraphQL patterns with examples

Type Definition Basics

# app/graphql/types/user_type.rb
module Types
  class UserType < Types::BaseObject
    field :id, ID, null: false
    field :email, String, null: false
    field :name, String
    field :created_at, GraphQL::Types::ISO8601DateTime, null: false

    field :posts, [Types::PostType], null: true
    field :posts_count, Integer, null: false

    def posts_count
      object.posts.size  # Use size for counter cache
    end
  end
end

Mutation Basics

# app/graphql/mutations/create_post.rb
module Mutations
  class CreatePost < BaseMutation
    argument :title, String, required: true
    argument :content, String, required: true

    field :post, Types::PostType
    field :errors, [String], null: false

    def resolve(title:, content:)
      post = context[:current_user].posts.build(title: title, content: content)

      if post.save
        { post: post, errors: [] }
      else
        { post: nil, errors: post.errors.full_messages }
      end
    end
  end
end

N+1 Prevention with DataLoader

# app/graphql/sources/record_loader.rb
class Sources::RecordLoader < GraphQL::Dataloader::Source
  def initialize(model_class)
    @model_class = model_class
  end

  def fetch(ids)
    records = @model_class.where(id: ids).index_by(&:id)
    ids.map { |id| records[id] }
  end
end

# Usage in type
def author
  dataloader.with(Sources::RecordLoader, User).load(object.user_id)
end

Key Principles

  • Type Safety: Define explicit types for all fields
  • Null Handling: Be intentional about null: true/false
  • Batch Loading: Use DataLoader to prevent N+1 queries
  • Authorization: Check permissions at field level
  • Error Handling: Return structured errors, not exceptions

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

ruby refactoring expert

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

hotwire-patterns

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

rails-model-patterns

No summary provided by upstream source.

Repository SourceNeeds Review