ããã«ã¡ã¯ããã¼ããã¼ã¢ã©ã¤ã¢ã³ã¹é¨ã®è«¸æ© (@moro) ã§ãã
çªç¶ã§ããããããã¯ãã¾ã¯ãã¯ãããã®ãã¦ã¼ã¶ã¼åºç¤ããåæ§ç¯ãããã¨ãã¦ãã¾ãã ä¸å£ã«ãã¦ã¼ã¶ã¼åºç¤ã®åæ§ç¯ãã¨ãã£ã¦ãããã®ã´ã¼ã«ãä½ãæããã¯(ãããèªèº«ã«ã¨ã£ã¦ãã¾ã )æ¼ ç¶ã¨ãã¦ãããåºå®ãããã´ã¼ã«ã¯è¦ãã ãã¦ãã¾ããããããå¾è¿°ããããã«ãããã¤ãã®åé¡ã¯æ確ãªå½¢ãåã£ã¦ãã¾ããè¨ãæããã¨ããããæ確ãªåé¡ã¨åãåããªãããæè»ã§ããæãã®ã¦ã¼ã¶ã¼åºç¤ãç®æããã¨ããã®ããã®åæ§ç¯ããã¸ã§ã¯ãã®ç®çã§ãã
ãã®ç¬¬ä¸æ©ç®ã¨ãã¦ãã¦ã¼ã¶ã¼ç»é²é¨åãç¾ç¶ã®ã¯ãã¯ãããæ¬ä½ã¨ã¯å¥ã®å°ããªRailsã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦å®è£ ãé²ããã¤ãå æ¥ãä¸é¨ã®éå®ãããå©ç¨è ã®æ¹ã«åãã¦å ¬éãããã¨ãã§ãã¾ããã ä»å¾ãæ§åãè¦ãªããå ¬éç¯å²ãæ¡å¤§ãã¦ããäºå®ã§ãã
åæ§ç¯ã®èæ¯
ã§ã¯ãã®ãæ確ãªåé¡ãã¨ã¯ãªãã§ããããã
æ大ã®ãã®ã¯ãã¦ã¼ã¶ã¼ç»é²ã®ããæ¹ãæå¢ã«ããããªããªã£ã¦ãã¦ããã®ã§ã¯ãªããã¨ããæ¸å¿µã§ãããã¨ãã°ã¯ãã¯ãããã®ã¢ã«ã¦ã³ãã¯ã¡ã¼ã«ã¢ãã¬ã¹ã¨ãã¹ã¯ã¼ããç»é²ãã¦ããã ãã®ãåºæ¬ã«ãªã£ã¦ãã¾ãããããä¸ã®ä¸ã®ãã¬ã³ãã¨ãã¦Eã¡ã¼ã«èªä½ã®å©ç¨ã·ã¼ã³ãæ¸ãã«é£ãããããå¿ é ã¨ãããµã¼ãã¹ã¾ã§ä½¿ãã¥ãããã®ã«ãªãã®ã§ã¯ãªããã¨ããå±æ©æãããã¾ããããã®ãããã¦ã¼ã¶ã¼åºç¤ã«å¤§ããæãå ¥ãããã¨ãããã¼ãºãããã¾ããã
ããä¸ã¤ã¯ãã¯ãã¯ãããã®ã³ã¼ããã¼ã¹ãããªã巨大åã»è¤éåãã¦ãããã¨ã§ã(åè)ã巨大ã§è¤éãªã³ã¼ããã¼ã¹ã®ä¸ã§ã¯ãä¸è¨ã®ã¦ã¼ã¶ã¼ç»é²ã®ããæ¹ã®ææ¬çã«å¤æ´ãããã¨ã¯é£ããã§ãããæ¥å¸¸ã®éçºã«ããã¦ãããæ©è½ã®ä¿®æ£ãä»ã®æ©è½ã®ãã°ã®ãã£ããã«ãªã£ãããèªåãã¹ãã®å®è¡æéãé·ããªã£ãããããªã©ã®åé¡ãã§ã¦ãã¾ãããã®ããåæ©è½ãå¥ã®ãµã¼ãã¹ã¨ãã¦å®è£ ããä¸ã§é£æºããããã¤ã¯ããµã¼ãã¹åãé²ãã¦ãã¾ãããã®æ¹åæ§ãè¸ã¾ããä»åã®ã¦ã¼ã¶ã¼åºç¤ã®åæ§ç¯ã§ããã¦ã¼ã¶ã¼ç»é²ããã°ã¤ã³ã¨ãã£ãæ©è½ãå¥ãµã¼ãã¹ã¨ãã¦å®è£ ãããã¨ã«ãã¾ããã
ãµã¼ãã¹å±¤ã¸ã®èå³
ã¾ãããã£ããæ°ããRailsã¢ããªã±ã¼ã·ã§ã³ãä½ãã®ã ãããRailsã«ããããµã¼ãã¹å±¤ã®å®ç¾ãã¨ããæè¡çé¢å¿ã«ãåãåããã¨ã«ãã¾ããã
Railsã¯ãDBã®ãã¼ãã«ããã®ã¾ã¾èªã¿æ¸ããããããªåç´ãªã¢ããªã±ã¼ã·ã§ã³ãä½ããã¨ã¯ç°¡åã«ã§ãã¾ãããããè¤éãªã¢ããªã±ã¼ã·ã§ã³ã§ã¯ãã®ã¶ãæ éãªè¨è¨ãå¿ è¦ã«ãªããããTrailblazerã®ãããªè¤éãªWebã¢ããªã±ã¼ã·ã§ã³æ§ç¯ãæ¯æ´ããã©ã¤ãã©ãªã注ç®ãéãã¦ãã¾ãã
ç§èªèº«ããã®ãµã¼ãã¹å±¤ã®å®ç¾ã«ã¯ãããã«èå³ããããã£ã½ããä»åã¯ã¾ã ã³ã¼ãè¦æ¨¡ãå°ããããã«Trailblazerããèªä½ã®å°å ¥ã¯å éãããRailsä¸ã§ãã©ã¼ã ãªãã¸ã§ã¯ããã¿ã¼ã³ã«ãããµã¼ãã¹å±¤ã®å®ç¾ã«ææ¦ãããã¨ã«ãã¾ããã
ãã®è¨äºã§ã¯ããããã£ããã¸ãã¹ä¸ã®èæ¯ã¨æè¡çèå³ãè¸ã¾ãã¦ã¢ããªã±ã¼ã·ã§ã³ãä½ãéç¨ã®è©¦è¡/æèãç´¹ä»ãã¾ãã
æå°éã®æ©è½ããå°ããã¤é²ãã
åæ§ç¯ã決æããã¨ã¯è¨ãããµã¼ãã¹ã«ããã¦ãã¦ã¼ã¶ã¼ãã¨ããã®ã¯ã¨ã¦ã大äºãã¤è¤éãªãã¡ã¤ã³ã¢ãã«ã§ãã
å®éã«ãç¾ã¯ãã¯ãããã®ActiveRecordã¢ãã«ã¯ã©ã¹(以ä¸ARã¢ãã«)User
ã¯ãã¡ã¤ã«ä¸ã§å®ç¾©ãããã¡ã½ããã328åãinclude
ãã¦ããã¢ã¸ã¥ã¼ã«ã14åãhas_(one|many)
åããã¦175åã®é¢é£ãå®ç¾©ããã¦ãã3,000è¡ãè¶
ããã¯ã©ã¹ã§ãããã®ãã¹ã¦ãä¸æ°ã«æ°ããã¦ã¼ã¶ã¼åºç¤(以ä¸ãæ°åºç¤)ã«ç½®ãæãããã¨ãã¦ããå½±é¿ç¯å²ã大ãããã¦ãªãªã¼ã¹ã«ãã©ãã¤ããªãã®ã§ã¯ãªããã¨ããæ¸å¿µãããã¾ããã
ããã§ä»åã¯æå°éã®æ©è½ããªãªã¼ã¹ãããã¨ãéè¦ããå¾æ¥ããè² æ ã®å°ãªãã¦ã¼ã¶ã¼ç»é²ããã¼ãå®ç¾ããã¢ããªã±ã¼ã·ã§ã³ãéçºãã¾ããã
ç¾æ¹å¼ã§ã¯(1-1)ãã¡ã¼ã¹ããã¥ã¼ã§å¿ è¦ãªæ å ±ããã¹ã¦å ¥åãããã¨ã§ã(1-2)å°é確èªã®ããã«ã¡ã¼ã«ãéä¿¡ãã(1-3)ã¡ã¼ã«ä¸ã®URLã«ã¢ã¯ã»ã¹ããã¨ç»é²ãå®äºããã¨ããæµãã§ç»é²ãã¾ãã 対ãã¦æ°åºç¤ã§ã¯ã(2-1)ãã¡ã¼ã¹ããã¥ã¼ã§ã¯ã¡ã¼ã«ã¢ãã¬ã¹ã®ã¿å ¥åãã(2-2)ããã«å°é確èªã¡ã¼ã«ãéä¿¡ãã(2-3)ã¡ã¼ã«ä¸ã®URLã«ã¢ã¯ã»ã¹ãããã¨ã«æ®ãã®æ å ±ãå ¥åãããã¨ããæµãã§ãããã¡ã¼ã¹ããã¥ã¼ã§ã®å ¥åé ç®ãæ¸ãåãã¦ã¼ã¶ã¼ç»é²ããéã®è² æ ãæ¸ãã§ãããã¨è¦è¾¼ãã§ãã¾ãã
ã¾ããæ°åºç¤ã®ãã¼ã¿ã®æã¡æ¹ãã¤ã³ãã©æ§é ã«ã¤ãã¦ããç¾è¡ã¯ãã¯ãããããã®æ¼¸æ¬¡çãªæ¹åãé²ãã¦ããããã«ã以ä¸ã®ãããªæ¹éãåãã¾ããã
- æ°åºç¤ã§ã¯ãç¾ã¯ãã¯ãããã¨DBãå
±æããã
- æ°ããããã¼ã§ã®ã¿å¿ è¦ãªãã¼ã¿ã¯æ°è¦ã®DBã«ãç¾ã¯ãã¯ãããã§ä½¿ããã¼ã¿ã¯ç¾DBã«æ¸ãåºãã
- ç¾DBã«æ¸ãå ´åã§ãããã¸ãã¹ãã¸ãã¯ã¯æ°ãã«æ¸ãç´ãã
- ä»å¾ãã¤ã³ã¯ãªã¡ã³ã¿ã«ãªç§»è¡ãé²ãããããç¾ãµã¼ãã¹ https://cookpad.com/ 以ä¸ã®ç¹å®ã®ãã¹ããªãã¼ã¹ãããã·ã§åå²ãã¦æ°åºç¤ã¨çµ±åããã
- æè¡è¦ç´ ã¯ç¤¾å
æ¨å¥¨ãã¤æ°ãããã®ãæ¡ç¨ããã
- ç¾ã¯ãã¯ãããããã®ç§»è¡ããããããéçºè ã®ç練度ãé«ãRuby on Railsãæ¡ç¨ããã
- æè¡çãªé²æ©ã«ãã£ããã¢ãããããããRuby 2.4 + Rails 5.1.rc1 + Webpack + React ãªã©ã§éçºããã
- ECSä¸ã«ã¢ããªã±ã¼ã·ã§ã³ããããã¤ããããã®Hakoãªã©ã社å ã®æ¨æºçãªã¤ã³ãã©æ§æã«ä¹ããã
ãã®ããã«ãæå°éã®æ©è½ã§ãã¡ããã¨åãã½ããã¦ã§ã¢ãããªãªã¼ã¹ãããã¨ãåªå ããçµæãã¦ã¼ã¶ã¼ç»é²ã®ã¿ãè¡ãã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦æåã®ãªãªã¼ã¹ãè¿ãããã¾ããã
ã¢ããªã±ã¼ã·ã§ã³ãå°ããã¤è¨è¨ãã
ãã¦ãåæ§ç¯ã®æ¹éããã¡ã¼ã¹ããªãªã¼ã¹ã®ã¹ã³ã¼ãã¯æ±ºãããã®ã®ãããã ãã§ã¯ã¢ããªã±ã¼ã·ã§ã³ã¯ã§ãã¾ããã ä»å¾ã®æ¡å¼µã«å¯¾ãã¦æè»ã«å¯¾å¿ã§ãããã¤è¤éã ã£ããç¡çã®ããæ§é ã«ããªããããæ éã«ã¢ããªã±ã¼ã·ã§ã³ãè¨è¨ãã¾ããããã®éç¨ãç´¹ä»ãã¾ãã
æåã®ä¸æ©: ã¡ã¼ã«ã¢ãã¬ã¹ãç»é²ãã
åºæ¥ä¸ãã£ãæ°åºç¤ã§ã®ã¦ã¼ã¶ã¼ç»é²ããã¼ã§ã¯ãå©ç¨è ãç®ã«ããæåã®ç»é¢ã¯ä¸è¨ã®ãããªãã®ã«ãªãã¾ãã
ãããã¿ã¦ãããããã«ãå ¥åãã©ã¼ã ã¯ã¡ã¼ã«ã¢ãã¬ã¹ä¸ã¤ã ãã¨ããã·ã³ãã«ãªãã®ã«ãã¾ããããã®ç»é¢ããã¡ã¼ã«ã¢ãã¬ã¹ãç»é²ããã¨ãã¡ã¼ã«ã¢ãã¬ã¹ç¢ºèªç¨ã®ãªã³ã¯ãè¨è¼ãããã¡ã¼ã«ãéããã¾ããå©ç¨è ããããã¯ãªãã¯ãããã¨ã§ãã¡ã¼ã«ã¢ãã¬ã¹ã®å°é確èªããªãããã¨ã¿ãªãã¾ãã
ãã®ããæåã¯ããã¡ã¼ã«ã¢ãã¬ã¹ç»é²ãã表ãARã¢ãã«ãä½ããã¡ã¼ã«ã¢ãã¬ã¹ã¨ç¢ºèªç¨URLã«ä»ä¸ããäºæ¸¬ãå°é£ãªãã¼ã¯ã³æåå(以ä¸ã確èªURLç¨ãã¼ã¯ã³)ãä½ãã¾ãããã«ã©ã å®ç¾©ã¯æ¬¡ã®ããã«ãã¾ããã
- ç»é²å¯¾è±¡ã®ã¡ã¼ã«ã¢ãã¬ã¹(æåå)
- 確èªURLç¨ãã¼ã¯ã³(æåå)
- 確èªURLç¨ãã¼ã¯ã³ã®æå¹æé(ã¿ã¤ã ã¹ã¿ã³ã)
- ç»é²å®äºæ¥(ã¿ã¤ã ã¹ã¿ã³ã, åæå¤null)
- Railsã¿ã¤ã ã¹ã¿ã³ã(
created_at
,updated_at
)
ãã®ãã¼ã¿ãæ°¸ç¶åããã¨ã¨ãã«ãå ¥åãããã¡ã¼ã«ã¢ãã¬ã¹ã«å¯¾ãã確èªç¨ã¡ã¼ã«ãéãã¾ãã
次ã®ä¸æ©: 確èªURLããç»é²å®äºãã
確èªç¨URLããã¢ã¯ã»ã¹ããç»é¢ã¯ãã®ãããªãã®ã«ãªãã¾ãã
ããã§ãã¹ã¯ã¼ãã¨çå¹´ææ¥ãå ¥åãã¦ããããã¡ã¼ã«ãã¬ã¸ã³ãªã©ã®è¨å®ãè¦ç´ãã¦ãããã¨ç»é²ãå®äºãã¾ãã
ä¸è¦ããã¨åç´ãªç»é¢ã§ã¯ããã®ã§ãããããããç»é²ããã¨ä¸è¨ã®ãããªãããããã®å¦çãèµ°ãã¾ãã
- ç¾DBã®ã¦ã¼ã¶ã¼ãã¼ãã«ã«ãã¼ã¿ãä½ãã
- åããã¦ãç¾DBã®ã¦ã¼ã¶ã¼ã®ãã¼ã¿ä¸å¼ãä½ãããããã¯è¤æ°ã®ãã¼ãã«ã«åå²ããã¦ããã
- æ°åºç¤ã®DBã§ãããã®
ã¡ã¼ã«ã¢ãã¬ã¹ç»é²
ã使ç¨æ¸ã¿ã¨ãã¦æ´æ°ããã - ç»é²å®äºã®ã¡ã¼ã«ãéä¿¡ããã
- ä»ã·ã¹ãã ã«ã¦ã¼ã¶ã¼ç»é²å®äºãç¥ãããããã®APIãå©ãã
ããã§ããã®å¦çã§ã¯ARã¢ãã«ãç´æ¥èªã¿æ¸ãããã®ã§ã¯ãªãããã©ã¼ã ãªãã¸ã§ã¯ããå°å ¥ãããã¦ã¼ã¶ã¼ç»é²å®äºãã©ã¼ã ãã¨ãã¦æ½åºãã¾ããã
ããã«ããã以ä¸ã®è¦³ç¹ã§ãç¡çã®ãªãã¢ããªã±ã¼ã·ã§ã³ã³ã¼ããã«ã§ããã¨æã£ã¦ãã¾ãã
- ãã©ã¼ã ã®å
¥åå¤ã
request
ãparams
ããã·ã¥ããåãåºãããã¨ã®ãPlain OldãªRubyãªãã¸ã§ã¯ãã«ã§ããããã®ãããã¢ãã«ã®ã¦ããããã¹ãã¨ãã¦ä¸é£ã®å¦çããã¹ãã§ããã - è¤æ°ARã¢ãã«ã®ãªãã¸ã§ã¯ããä¸æ°ã«ä¿åããå ´åã«ãé¢é£å
ãªãã¸ã§ã¯ãã®å
é¨æ§é ã¨å¯çµåãã¦ãã¾ãããã
accept_nested_attributes
ãé¿ãããã¹ãã®ãªãActiveModelã¢ãã«å ã«ã«ãã»ã«åã§ããã
ããã§ä¸»è¦ãªå ¥åã¯åºæ¥ã¦ãã¾ããããåã®ã¡ã¼ã«ã¢ãã¬ã¹ã®ç»é²ç»é¢ãããããæ°¸ç¶åãããã¼ãã«æ§é ã«æ°ã«ãªãã¨ãããã§ã¦ãã¾ããã
ã¡ã¼ã«ã¢ãã¬ã¹ç»é²ç»é¢ã®ãã©ã¼ã ãªãã¸ã§ã¯ãå
åè¿°ã®ããã«ãã¡ã¼ã«ã¢ãã¬ã¹ç»é²ãã©ã¼ã ã§ã¯ãå ¥åãããã¡ã¼ã«ã¢ãã¬ã¹ã¨ç¢ºèªURLç¨ãã¼ã¯ã³ãæå¹æéã1ã¤ã®ãã¼ãã«ã«æ°¸ç¶åãã¦ãã¾ãããããã¯åæã¨ãã¦ã¯æé ãªè½ã¨ãæã§ã¯ããã¾ããããããã¤ãæ°ã«ãªãç¹ãã§ã¦ãã¾ããã
ã¾ããåæ§ç¯ã®ç®çã«ã¯ãè¿ãå°æ¥ã«ã¡ã¼ã«ã¢ãã¬ã¹ä»¥å¤ã§ã®ã¦ã¼ã¶ã¼ç»é²ã§ããããã«ãããã¨ãããã®ãããã¾ãããããããã¨ãå©ç¨è ãã¦ã¼ã¶ã¼ç»é²ãããã¨ãããã¨ããã®ãã®ã¨ãããã§ç»é²ãã¦ãããã¡ã¼ã«ã¢ãã¬ã¹ãã¯åå²ãã¹ãããã«è¦ãã¾ãã ã¾ããç»é²å®äºããæç¹ã§ç¾DBã«æ¸ãè¾¼ã¾ããã¦ã¼ã¶ã¼ã追跡å¯è½ã«ãã¦ãããããªãã¾ãã
ããããèæ ®ãããã¼ãã«æ§é ã以ä¸ã®ããã«ãã¾ããã
ã¦ã¼ã¶ã¼ç»é²ããããã¨ãããã¨ãã¼ãã«
- 確èªURLç¨ãã¼ã¯ã³ã®æå¹æé(ã¿ã¤ã ã¹ã¿ã³ã)
- ã¡ã¼ã«ã§ã¯ãªããæ°è¦ç»é²ãã§ãã£ã¦ããæå¹æéã¯åå¨ããã¯ãã¨ããä»®å®ã§
- å®äºå¾ç¾DBã«ä½æãããã¦ã¼ã¶ã¼ã®ID(æ°å¤, åæå¤null)
- ç»é²å®äºæ¥(ã¿ã¤ã ã¹ã¿ã³ã, åæå¤null)
- Railsã¿ã¤ã ã¹ã¿ã³ã(
created_at
,updated_at
)
- 確èªURLç¨ãã¼ã¯ã³ã®æå¹æé(ã¿ã¤ã ã¹ã¿ã³ã)
ã¡ã¼ã«ã¢ãã¬ã¹ç»é²ãã¼ãã«
- ã¦ã¼ã¶ã¼ç»é²ãããã¨ãã¼ãã«ã¸ã®å¤é¨ãã¼
- ç»é²å¯¾è±¡ã®ã¡ã¼ã«ã¢ãã¬ã¹(æåå)
- 確èªURLç¨ãã¼ã¯ã³(æåå)
- Railsã¿ã¤ã ã¹ã¿ã³ã(
created_at
,updated_at
)
ãªããç¾DBã®ã¦ã¼ã¶ã¼IDãã¨ãç»é²å®äºæ¥ããã®ã¿ãæ½åºãã¦ãç»é²å®äºãããã¨ããã¼ãã«ã«åããã¢ã¤ãã£ã¢ããããå人çã«ããã®ã»ãã好ã¿ã§ã¯ããã¾ããããããããããåå²ããå©ç¹ãã¾ã å°ãªããã¨ãå°æ¥çã«ããããããªã£ãå ´åã§ãç¡æ失ã«åå²ã§ããããªãã¨ãªã©ãèæ ®ãã¦ããã¾ã®2ãã¼ãã«ã®æ§æã«ãã¦ãã¾ãã
ãã¦ããã®ããã«ãã¼ãã«ãåå²ããã¨Railsãããè¤æ°ã®ARã¢ãã«ãæ±ããã¨ã«ãªãã¾ããçµæã¨ãã¦ãã¡ã¼ã«ã¢ãã¬ã¹ç»é²ç»é¢ã«ããã©ã¼ã ãªãã¸ã§ã¯ããå°å ¥ãããã¨ã§ã¹ãããªæ¸ããããã«ãªãã¾ããã
ã¾ã¨ã
ãã®ããã«ãæ©è½ãã¾ã å°ãªãç°¡åãªWebã¢ããªã±ã¼ã·ã§ã³ã§ãã£ã¦ããã¢ããªã±ã¼ã·ã§ã³è¨è¨ã§èãããããã¨ã¯ããããããã¾ãããä»å¾ãç¶ç¶çã«éçºãé²ããªããè¨è¨ãæ´ç·´ããã¦ããããã¨æã£ã¦ãã¾ããããããã¯Trailblazerã®å°å ¥ãªã©ãèãã¦ããã¤ããã§ãã
ã¾ããã以å¤ã«ããReactã使ã£ãã¯ã©ã¤ã¢ã³ããµã¤ãè¨è¨ãããã®åæã¨ãªããµã¼ãå´/JSå´ã§ã®è²¬åã®åãåããèªåãã¹ãæ¦ç¥ãªã©ãªã©ãããããã¦è¨èªåãã¦ã¿ãã¨æ§ã ãªã¬ãã«ã§è¨è¨å¤æãå¿ è¦ã¨ãªãã¾ãããã¾ãå¥ã®æ©ä¼ã«ãããããç´¹ä»ã§ããã°ãããªã¨æãã¾ãã ããã«ãä»åã®ãæå°æ©è½ã§ãªãªã¼ã¹ãããã¨ããã¹ã³ã¼ã決å®ããä»å¾ããããããã¨ãªã¹ãããåãçµãé çªã¥ããªã©ãã½ããã¦ã§ã¢éçºã¯å¤§å°ã®å¤æã®é£ç¶ãªã®ã ãªãã¨ããã®ãããããã¦å®æãã¾ãã
ãããã£ãå¤æã¯ãããããã®ç¾å ´ã«ãã£ã¦ããããããã¨ãåæãæ¢åã³ã¼ãã大ããéãããä¸æ¦ã«ã¯è¨ããªãã¨æãã¾ãããä»åã®è©±ãä¸ã¤ã®ä¾ã¨ãã¦åèã«ãªãã°å¬ããæãã¾ãã