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"
}
]
}
}
我想创建一个不在 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"
}
]
}
}