fre*_*man 3 ruby ruby-on-rails graphql graphql-ruby
我想创建一个不在 ActiveRecord 中的 MentionType。当查询 SummaryCommentType 时,我想返回 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
Run Code Online (Sandbox Code Playgroud)
从 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
Run Code Online (Sandbox Code Playgroud)
询问:
query {
mentions {
id
name
nameUpper
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
{
"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"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)