【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

执行查询!! !!)

注意要点

    1. 默认情况下,将以驼峰命名法指定 created_at 等驼峰命名法的数据名称。

 

    1. 如果指定 camelize false,则可以使用蛇形命名法来指定。

 

    1. 参数传递给变量。

 

    注意顶层的{}(以下)。
# 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"}]}
]}}
广告
将在 10 秒后关闭
bannerAds