【3分钟入门】使用复制粘贴来引入!在Rails中使用GraphQL
【3分钟入门】这是ooo系列的第一弹,可以通过复制粘贴进行导入。
我们将在Rails中引入GraphQL。
什么是GraphQL?
安装
# Gemfile
gem 'graphql'
$ bundle
模型
userstypenameStringageInteger
class User < ApplicationRecord
def friends
%i[user mate_user].inject(Friend.none) do |friends_query, column_name|
friends_query.or(Friend.where(column_name => self))
end
end
end
friendstypeuser_idIntegermate_user_idInteger
class Friend < ApplicationRecord
belongs_to :user
belongs_to :mate_user, class_name: :User
def pairs
[user, mate_user]
end
end
朋友模型有两个用户。
创建
class GraphqlRailsMinimumSampleSchema < GraphQL::Schema
query(GqlTypes::Query)
end
module GqlTypes
class Query < GraphQL::Schema::Object
field :users, [UserType], null: false
field :friends, [FriendType], null: false do
argument :user_id, Int, required: true, camelize: false
end
def users
User.all
end
def friends(user_id:)
User.find(user_id).friends
end
end
end
module GqlTypes
class BaseObject < GraphQL::Schema::Object
end
end
module GqlTypes
class FriendType < BaseObject
field :pairs, [UserType], null: false
end
end
module GqlTypes
class UserType < BaseObject
field :name, String, null: false
field :age, String, null: true
field :created_at, String, null: false
field :friends, [FriendType], null: false
end
end
执行查询!! !!)
注意要点
-
- 默认情况下,将以驼峰命名法指定 created_at 等驼峰命名法的数据名称。
-
- 如果指定 camelize false,则可以使用蛇形命名法来指定。
-
- 参数传递给变量。
- 注意顶层的{}(以下)。
# queryには{}をつけない
query get_friends($user_id: Int!) {
# camelize falseなためuserIdではない(:point_up_2: :point_down: )
friends(user_id: $user_id) {}
}
{
users {}
}
尝试 shì)
rails c
> GraphqlRailsMinimumSampleSchema.execute('{ users { name createdAt age friends { pairs { name } } } }').to_h
=> {"data"=>{
"users"=>[{
"name"=>"nishi",
"createdAt"=>"2019-04-14 04:01:37 UTC",
"age"=>"9",
"friends"=>[{
"pairs"=>[{"name"=>"nishi"}, {"name"=>"tarou"}]
}]
}, {
"name"=>"suke",
"createdAt"=>"2019-04-14 04:01:37 UTC",
"age"=>"19",
"friends"=>[{
"pairs"=>[{"name"=>"suke"}, {"name"=>"tarou"}]
}]
}, {
"name"=>"tarou",
"createdAt"=>"2019-04-14 04:01:37 UTC",
"age"=>"20",
"friends"=>[
{"pairs"=>[{"name"=>"nishi"}, {"name"=>"tarou"}]},
{"pairs"=>[{"name"=>"suke"}, {"name"=>"tarou"}]}
]
}]
}}
> GraphqlRailsMinimumSampleSchema.execute('query get_friends($user_id: Int!) { friends(user_id: $user_id) { pairs { name } } }', variables: { user_id: User.last.id } ).to_json
=> {"data"=>{"friends"=>[
{"pairs"=>[{"name"=>"nishi"}, {"name"=>"tarou"}]},
{"pairs"=>[{"name"=>"suke"}, {"name"=>"tarou"}]}
]}}