ruby-on-railsrubygraphqlgraphql-ruby

Ruby graphql How to define object type which is not Active Record?


I want to create a MentionType which is not in ActiveRecord. And when query SummaryCommentType I want to return MentionType with it. But I dont know how to.

I am completely new for graphql. Sorry for my english.

Here is my code

module Types
  class MentionType < Types::BaseObject
    field :id, Integer, null: false  
    field :name, String, null: false
  end
end








module Types
 class SummaryCommentType < Types::BaseObject
  field :id, Integer, null: false
  field :summary_id, Integer, null: false
  field :comment_status, Integer, null: false
  field :curator_id, Integer, null: true
  field :curator, CuratorType, null: true
  field :total_like, Integer, null: true
  field :total_dislike, Integer, null: true
  field :comment_desc, String, null: true
  field :parent_comment_key, Integer, null: true
  field :created_at, GraphQL::Types::ISO8601DateTime, null: true
  field :updated_at, GraphQL::Types::ISO8601DateTime, null: true
  field :sub_comment_count, Integer, null: true
  field :summary_comment_sticker, SummaryCommentStickerType, null: true 
  field :mention, [MentionType.graphql_definition], null:true do
    argument :comment_id, Integer, required: true
  end

  def mention(comment_id:)
    comment = SummaryComment.where(id: self.object.id)
    #  to do put logic here to query mention by comment
    #  ....

    return mention
  end

 end
end

Solution

  • The objects returned from a GraphQL query don't need to be ActiveRecord objects, they just need methods that map to your field names, or your fields need to have methods that can extract the data needed from the object.

    Here's an example that uses several different ways to cast to a type:

    module Types
      class MentionType < BaseObject
        field :id, Integer, null: false
        field :name, String, null: false
        field :name_upper, String, null: false
        def name_upper
          if object.is_a?(Hash)
            object[:name].upcase
          else
            object.name.upcase
          end
        end
      end
    end
    
    module Types
      class QueryType < Types::BaseObject
        field :mentions, [MentionType], null: true
    
        def mentions
          [
            Struct.new(:id, :name).new(1, 'Struct'),
            OpenStruct.new(id: 2, name: 'OpenStruct'),
            { id: 3, name: 'Hash' },
            CustomObject.new(id: 4, name: 'CustomObject'),
          ]
        end
    
        class CustomObject
          def initialize(attrs)
            @attrs = attrs
          end
    
          def id
            @attrs[:id]
          end
    
          def name
            @attrs[:name]
          end
        end
      end
    end
    

    Query:

    query {
      mentions {
        id
        name
        nameUpper
      }
    }
    

    Result:

    {
      "data": {
        "mentions": [
          {
            "id": 1,
            "name": "Struct",
            "nameUpper": "STRUCT"
          },
          {
            "id": 2,
            "name": "OpenStruct",
            "nameUpper": "OPENSTRUCT"
          },
          {
            "id": 3,
            "name": "Hash",
            "nameUpper": "HASH"
          },
          {
            "id": 4,
            "name": "CustomObject",
            "nameUpper": "CUSTOMOBJECT"
          }
        ]
      }
    }