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

Viewed 1342

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
1 Answers

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"
      }
    ]
  }
}
Related