Ruby graphql 如何定义不是Active Record 的对象类型?

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

我想创建一个不在 ActiveRecord 中的 MentionType。 当查询 SummaryCommentType 时,我想 return MentionType 用它。 但是我不知道怎么办。

我对 graphql 完全陌生。 对不起我的英语。

这是我的代码

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

从 GraphQL 查询返回的对象不需要是 ActiveRecord 对象,它们只需要映射到您的字段名称的方法,或者您的字段需要具有可以从对象中提取所需数据的方法。

下面是一个使用多种不同方式转换为类型的示例:

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 {
  mentions {
    id
    name
    nameUpper
  }
}

结果:

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