Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraphQL on Ruby

B72422afc5f3ffc844f672b59122e16d?s=47 joe_re
April 28, 2016

GraphQL on Ruby

西日暮里.rb#21 LT資料

B72422afc5f3ffc844f672b59122e16d?s=128

joe_re

April 28, 2016
Tweet

Transcript

  1. GraphQL on Ruby @joe_re

  2. Who am I? twitter: @joe_re github: @joe­re freee という五反田の会社で働いています スタックはフロントエンド寄り

  3. 前回から西日暮里.rb の オー ガナイザやらせて もらっています!

  4. ふつつかものですが どうぞよろしくお願いします

  5. GraphQL http://graphql.org/

  6. GraqhQL is 何? Facebook が開発しているクエリ言語 クライアント・ サー バ間でのデー タのやりとりを宣言的に 記述するためのもの

    REST API と比べて、 サー バ側のロジックの重複を減らすこ とができて、 効率的にデー タの取得が可能 強い型制約をShema に持たせられる
  7. Query { u s e r ( i d :

    3 5 0 0 4 0 1 ) { i d , n a m e , i s V i e w e r F r i e n d , p r o f i l e P i c t u r e ( s i z e : 5 0 ) { u r i , w i d t h , h e i g h t } } } Response { " u s e r " : { " i d " : 3 5 0 0 4 0 1 , " n a m e " : " J i n g C h e n " , " i s V i e w e r F r i e n d " : t r u e , " p r o f i l e P i c t u r e " : { " u r i " : " h t t p : / / s o m e u r l . c d n / p i c . j p g " , " w i d t h " : 5 0 , " h e i g h t " : 5 0 } } }
  8. Ruby 実装あるぞ!

  9. というわけで試してみた (Demo) https://github.com/joe­re/sample­graphql­on­ruby

  10. 実装どんな感じになるの??

  11. Definition of GraphQL's Shema(Query) P o s t T y

    p e = G r a p h Q L : : O b j e c t T y p e . d e f i n e d o n a m e " P o s t " d e s c r i p t i o n " A b l o g e n t r y " f i e l d : i d , ! t y p e s . I D , " T h e u n i q u e I D f o r t h i s p o s t " f i e l d : t i t l e , ! t y p e s . S t r i n g , " T h e t i t l e o f t h i s p o s t " f i e l d : b o d y , ! t y p e s . S t r i n g , " T h e b o d y o f t h i s p o s t " f i e l d : c o m m e n t s , - > { ! t y p e s [ ! C o m m e n t T y p e ] } , " R e s p o n s e s t o t h i s p o s t " e n d C o m m e n t T y p e = G r a p h Q L : : O b j e c t T y p e . d e f i n e d o n a m e " C o m m e n t " d e s c r i p t i o n " A r e p l y t o a p o s t " f i e l d : i d , ! t y p e s . I D , " T h e u n i q u e I D o f t h i s c o m m e n t " f i e l d : b o d y , ! t y p e s . S t r i n g , " T h e c o n t e n t o f t h i s c o m m e n t " f i e l d : p o s t , ! P o s t T y p e , " T h e p o s t t h i s c o m m e n t r e p l i e s t o " e n d Q u e r y R o o t = G r a p h Q L : : O b j e c t T y p e . d e f i n e d o n a m e " Q u e r y " d e s c r i p t i o n " T h e q u e r y r o o t f o r t h i s s c h e m a " f i e l d : p o s t d o t y p e P o s t T y p e d e s c r i p t i o n " F i n d a P o s t b y i d " a r g u m e n t : i d , ! t y p e s . I D r e s o l v e - > ( o b j e c t , a r g u m e n t s , c o n t e x t ) { P o s t . f i n d ( a r g u m e n t s [ " i d " ] ) } e n d e n d
  12. Definition of GraphQL's Shema(Mutation) C r e a t e

    P o s t F i e l d = G r a p h Q L : : F i e l d . d e f i n e d o | f | f . t y p e P o s t T y p e f . d e s c r i p t i o n ' C r e a t e a p o s t ' f . a r g u m e n t : t i t l e , ! t y p e s . S t r i n g f . a r g u m e n t : b o d y , ! t y p e s . S t r i n g f . r e s o l v e - > ( o b j e c t , a r g u m e n t s , c o n t e x t ) { P o s t . c r e a t e ( t i t l e : a r g u m e n t s [ : t i t l e ] , b o d y : a r g u m e n t s [ : b o d y ] ) } e n d C r e a t e C o m m e n t F i e l d = G r a p h Q L : : F i e l d . d e f i n e d o | f | f . t y p e C o m m e n t T y p e f . d e s c r i p t i o n ' C r e a t e a c o m m e n t ' f . a r g u m e n t : p o s t _ i d , ! t y p e s . I D f . a r g u m e n t : b o d y , ! t y p e s . S t r i n g f . r e s o l v e - > ( o b j e c t , a r g u m e n t s , c o n t e x t ) { C o m m e n t . c r e a t e ( p o s t _ i d : a r g u m e n t s [ : p o s t _ i d ] , b o d y : a r g u m e n t s [ : b o d y ] ) } e n d M u t a t i o n R o o t = G r a p h Q L : : O b j e c t T y p e . d e f i n e d o n a m e ' M u t a t i o n ' d e s c r i p t i o n ' T h e r o o t f o r m u t a t i o n s i n t h i s s c h e m a ' f i e l d : c r e a t e P o s t , f i e l d : C r e a t e P o s t F i e l d f i e l d : c r e a t e C o m m e n t , f i e l d : C r e a t e C o m m e n t F i e l d e n d
  13. Create Shema & Using S c h e m a

    = G r a p h Q L : : S c h e m a . n e w ( q u e r y : Q u e r y R o o t , m u t a t i o n : M u t a t i o n R o o t ) S c h e m a . e x e c u t e ( ' { p o s t ( i d : 1 ) { i d , t i t l e , c o m m e n t s { b o d y } } } ' )
  14. やってみた感触 ActiveRecord と組み合わせても普通に使える ( 最適ではない感もあるけど、 何がいいのかまだ分からん) GraphQL の活用例は絶望的にまだ少ない ここまでなら割と簡単に動かせた Rails

    でGraphQL サー バ立てたり、 特定のエンドポイントで GraphQL 解釈できるようにするのは楽にできそう
  15. そもそもがクライアント・ サー バ間での デー タ通信を簡略化するためのものなので クライアントがないとなんとも言えない

  16. というわけで次回予告! GraphQL on Ruby on Rails with Relay!

  17. ありがとうございました!