在Ruby on Rails項(xiàng)目中如何使用PostgreSQL和設(shè)置GraphQL

GraphQL是由Facebook開發(fā)并開源的數(shù)據(jù)查詢語言芥颈。它是一個(gè)可用于構(gòu)建強(qiáng)大API的工具。靈丹妙藥赚抡,但它絕對(duì)可以幫助你解決一些問題浇借,例如在單個(gè)請(qǐng)求中獲取許多的資源。它不會(huì)受到過度獲取或數(shù)據(jù)不足的影響怕品,并且與REST API相反,GraphQL是強(qiáng)類型的巾遭,而且沒有版本化肉康。

在本文中,我將會(huì)向你展示如何在Ruby on Rails項(xiàng)目中如何使用PostgreSQL和設(shè)置GraphQL灼舍。

建立

我假設(shè)在你的計(jì)算機(jī)上已經(jīng)安裝了最新版本的Ruby吼和。如果沒有,你可以通過asdf或rvm安裝骑素。并且已經(jīng)在你的應(yīng)用程序創(chuàng)建了一個(gè)gemset炫乓。你還需要的是安裝并運(yùn)行PostgreSQL。

通常献丑,創(chuàng)建一個(gè)新的Rails應(yīng)用程序末捣,你必須先安裝bundler


gem install bundler

然后使用此命令安裝最新的rails(可能需要一段時(shí)間)


bundle install rails


最后,使用以下命令生成一個(gè)新的rails項(xiàng)目,并指定這個(gè)項(xiàng)目所使用的數(shù)據(jù)庫创橄,我們這里選擇postgresql



rails new graphql_test --database=postgresql


創(chuàng)建一個(gè)數(shù)據(jù)庫箩做,注意創(chuàng)建數(shù)據(jù)庫前,請(qǐng)先設(shè)置你的database.yml文件


添加GraphQL


我們使用graphql-ruby gem包妥畏,所以你必須添加到你的Gemfile中邦邦。


???????

gem 'graphql'


安裝依賴


???????

bundle install


然后使用以下命令進(jìn)行安裝


rails generate graphql:install


以下是你將要做的一些事:


在config/routes.rb中添加一行路由


post "/graphql", to: "graphql#execute"


在GraphQL API中安吁,我們定義了一個(gè)可用于檢索或更改數(shù)據(jù)的端口。這個(gè)端口將在路徑/graphql中可用燃辖。但記住鬼店,你必須使用POST方法來訪問。


創(chuàng)建graphQL控制器?app / controllers / graphql_controller.rb文件黔龟,它將處理execute方法中的所有查詢:


class GraphqlController < ApplicationControllerdef executevariables = ensure_hash(params[:variables])query = params[:query]operation_name = params[:operationName]context = { # Query context goes here, for example: # current_user: current_user,}result = GraphqlTestSchema.execute(query, variables: variables,context: context,operation_name: operation_name)render json: resultrescue => eraise e unless Rails.env.development?handle_error_in_development eend # private methods are also here but are not relevant for nowend


需要注意的是我們收集GraphqlTestSchema.execute方法的參數(shù)的方式妇智。


添加了很多base類型:

???????

base_enum, base_input_object, base_interface, base_object, base_scalar, base_union, mutation_type, query_type


我們將使用它們來構(gòu)建mutations,查詢捌锭,接口和其他類型俘陷。


將gem“graphiql-rails”,group :: development添加到你的Gemfile中观谦,該Gemfile安裝了在開發(fā)期間使用的GraphiQL IDE拉盾。最后記住bundle install。查看routes.rb文件豁状,會(huì)生成以下代碼行:

if Rails.env.development? mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"end

這樣就能夠使用/ graphiql路徑在本地進(jìn)行測(cè)試捉偏。


添加app / graphql / store_manager_schema.rb,它將成為整個(gè)應(yīng)用程序的入口

class GraphqlTestSchema < GraphQL::Schema? mutation(Types::MutationType)? query(Types::QueryType)end


創(chuàng)建模型和數(shù)據(jù)


???????rails generate model Author first_name:string last_name:string date_of_birth:date --no-test-frameworkrails generate model Book title:string author:references publication_date:integer genre:string --no-test-framework


它們將生成我們可以使用rake db:migrate運(yùn)行的遷移泻红。他們還將生成模型夭禽。我們唯一要做的就是添加

has_many :books

到app / models / author.rb中


編輯db / seeds.rb:

stephen = Author.create(first_name: 'Stephen', last_name: 'King', date_of_birth: Date.parse('1947-09-21'))lee = Author.create(first_name: 'Lee', last_name: 'Child', date_of_birth: Date.parse('1954-10-29'))

Book.create(title: 'The Shining', author: stephen, publication_date: 1977, genre: 'Horror')Book.create(title: 'Carrie', author: stephen, publication_date: 1974, genre: 'Horror')Book.create(title: 'It', author: stephen, publication_date: 1986, genre: 'Horror')Book.create(title: 'Green mile', author: stephen, publication_date: 1996, genre: 'Mystery')Book.create(title: 'Killing Floor', author: lee, publication_date: 1997, genre: 'Thriller')Book.create(title: 'Die Trying', author: lee, publication_date: 1998, genre: 'Thriller')

使用rake db:seed運(yùn)行seeds


生成類型


正如我之前提到的,GraphQL是強(qiáng)類型的谊路,這意味著如果我們想要查詢Author和Book讹躯,我們必須為它們定義類型。


app/graphql/types/author_type.rb


module Typesclass AuthorType < Types::BaseObject? ? field :books, [Types::BookType], null: true? ? field :id, ID, null: false? ? field :date_of_birth, String, null: false? ? field :first_name, String, null: false? ? field :last_name, String, null: falseend


app/graphql/types/book_type.rb


module Typesclass BookType < Types::BaseObject field :author, Types::AuthorType, null: false field :genre, Enums::Genre, null: false

field :id, ID, null: false

field :publication_date, Integer, null: false field :title, String, null: falseendend


我們有一個(gè)約定缠劝,我們?cè)陧敳刻砑觕omplex類型潮梯,然后是ID,最后是simple類型惨恭,如Integer秉馏,String等。正如你看到的脱羡,我們正在使用類型的枚舉萝究。 我們?cè)趩为?dú)的目錄app / graphql / types / enums / genre.rb中定義枚舉。

閱讀全文

https://mp.weixin.qq.com/s?__biz=MzU2MTY0NDY4Ng==&tempkey=MTAwM19GT3lWRnA4U1grckJsbTN2MlVaV2pnQzdBbVNDNktGUlBuMnF6N19ZWTVNOVpsTkQydWJRdlJNWm4wSmZxUkNCLWdXcXhmdTh3a05yYUJaZE5iR1p2b3J5di0wckpUQTRvOEp4dzhGVi1XSWdBbmp1aTlCQmJTS28yaW1rVmFxUnBZSW9HVUM3V0xXRER0TVdINmVwaWRCQ0VfeTE1dno1R3NPWEtnfn4%3D&chksm=7c74d4cf4b035dd95dae327f8664e475d82e88c91d54dc56c75ff6c23c72b9164799f6c0772f#rd

微信公眾號(hào):


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锉罐,一起剝皮案震驚了整個(gè)濱河市帆竹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氓鄙,老刑警劉巖馆揉,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抖拦,居然都是意外死亡升酣,警方通過查閱死者的電腦和手機(jī)舷暮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來噩茄,“玉大人下面,你說我怎么就攤上這事〖ㄆ福” “怎么了沥割?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凿菩。 經(jīng)常有香客問我机杜,道長(zhǎng),這世上最難降的妖魔是什么衅谷? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任椒拗,我火速辦了婚禮,結(jié)果婚禮上获黔,老公的妹妹穿的比我還像新娘蚀苛。我一直安慰自己,他們只是感情好玷氏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布堵未。 她就那樣靜靜地躺著,像睡著了一般盏触。 火紅的嫁衣襯著肌膚如雪渗蟹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天赞辩,我揣著相機(jī)與錄音拙徽,去河邊找鬼。 笑死诗宣,一個(gè)胖子當(dāng)著我的面吹牛珠插,可吹牛的內(nèi)容都是我干的缸托。 我是一名探鬼主播戴质,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杖爽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼脚作!你這毒婦竟也來了碾盟?” 一聲冷哼從身側(cè)響起德频,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤路操,失蹤者是張志新(化名)和其女友劉穎徘禁,沒想到半個(gè)月后诅诱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡送朱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年娘荡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了干旁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炮沐,死狀恐怖争群,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情大年,我是刑警寧澤换薄,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站翔试,受9級(jí)特大地震影響轻要,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垦缅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一冲泥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧失都,春花似錦柏蘑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庞溜,卻和暖如春革半,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背流码。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工又官, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漫试。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓六敬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親驾荣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子外构,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,509評(píng)論 0 23
  • Awesome Ruby Toolbox Awesome A collection of awesome Ruby...
    debbbbie閱讀 2,876評(píng)論 0 3
  • 追求簡(jiǎn)單是人類的天性,無論互聯(lián)網(wǎng)產(chǎn)品播掷,還是移動(dòng)應(yīng)用审编,亦或是其他交互設(shè)計(jì),簡(jiǎn)單易使用始終是贏得用戶的關(guān)鍵歧匈。同時(shí)...
    A郭曉楠閱讀 434評(píng)論 0 0
  • 一群嬌滴滴的姑娘披著鵝黃紗巾的姑娘相約在盛夏的五月一齊去藍(lán)天翱翔 相聚時(shí)她們相擁甜蜜分別時(shí)她們舞動(dòng)發(fā)尖 是風(fēng)撩撥了...
    瑜伽散人閱讀 288評(píng)論 1 11