Rails ã® ActiveRecord ã¢ãã«ãã¹ãã®æ¸ãæ¹ã¬ã¤ãã©ã¤ã³
ãã®ã¨ã³ããªã§ã¯ï¼Ruby on Rails ï¼ä»¥ä¸ Railsï¼ã® ActiveRecord ã¢ãã«ãã¹ãã«ã¤ãã¦ï¼1) ã©ãã®ä½ããã¹ãããã°ãããï¼2) ã©ã®ããã«ãã¹ããæ¸ãã°ãããï¼ã®ã¬ã¤ãã©ã¤ã³ã示ãã¾ãï¼ãã®ã¬ã¤ãã©ã¤ã³ã¯ Rails å ¬å¼ã®ãã®ã§ã¯ãªãï¼id:passingloop ã使ã£ã¦ããç§çãªãã®ã§ãï¼çåã»è³ªåã»æ¹å¤ã»ééãã®ææã¯ãã¼ã¸ä¸é¨ã®ã³ã¡ã³ãæ¬ã¾ã§ãé¡ããã¾ãï¼
ã¯ããã«
Rails 㯠TDD/BDD ãµãã¼ããå å®ãã Web ã¢ããªã±ã¼ã·ã§ã³éçºãã¬ã¼ã ã¯ã¼ã¯ã§ãï¼Rails ã§ä½¿ãã Test::Unit ã RSpec ãªã©ã¨ãã£ããã¹ãã£ã³ã°ãã¬ã¼ã ã¯ã¼ã¯ã®ä½¿ãæ¹ã«é¢ãã解説ãè±å¯ã«ããã¾ãï¼ãããï¼ãã©ããã©ããã¹ãããã°ããã®ããã«ã¤ãã¦ã®è§£èª¬ã¯ï¼ãä½¿ãæ¹ãã®è§£èª¬ã¨æ¯è¼ãã¦å°ãªãããã«æãã¾ãï¼ãã£ã¨ãï¼ãã¹ãä¸è¬ã«ã¤ãã¦ã©ãæ¸ããã¯ã¢ããªã±ã¼ã·ã§ã³æ¬¡ç¬¬ã¨ããã¨ãããããã®ã§ï¼ããã¯ä»æ¹ããã¾ããï¼ã¨ã¯ããï¼ãã¸ãã¹ãã¸ãã¯ãå«ã¾ãªããActiveRecord ã¢ãã«ããªãï¼ããç¨åº¦å®ååã§ããã®ã§ã¯ãªãã§ããããï¼
ActiveRecord ã¢ãã«ã®ãã¹ãã«é¢ããæ å ±æºã¯å¤ããã®ã®ï¼ããããããéãã¦å ¨ä½åãææ¡ãã«ããã®ãåé¡ã§ãï¼æãã¤ãã ãã§ãï¼
- Ruby on Rails Guides: A Guide to Testing Rails Applications
- Agile Web Development with Rails æ¬
- Rails Test Prescription æ¬
- GitHub ã«ããæ°å¤ãã® Rails ã¢ããªã±ã¼ã·ã§ã³ãªãã¸ããª
ãããã¾ãï¼ããã§ï¼ãã®ææ¸ã§ã¯ï¼ç§ãåéãããã¹ãã«é¢ããæ å ±ããã¨ã«ï¼ActiveRecord ã¢ãã«ã«å¯¾ãããã¹ãã®æ¸ãæ¹ã¬ã¤ãã©ã¤ã³ã示ããã¨ãç®æ¨ã«ãã¾ãï¼
ãã®ææ¸ã§ã¯ï¼ã¾ãï¼ãActiveRecord ã¢ãã«ããå®ç¾©ãã¾ãï¼ãã®ææ¸ã§æ±ã ActiveRecord ã¢ã㫠㯠MVC ã® 'M' ã§ã¯ãªããã¨ã«æ³¨æãã¦ãã ããï¼æ¬¡ã«ï¼ActiveRecord ã¢ãã«ã«ã¤ãã¦ï¼ã©ãã®ä½ããã¹ãããã°ããã®ã示ãã¾ãï¼æå¾ã«ï¼Test::Unit ã使ã£ã¦ãã¹ããã©ãæ¸ãã°ããã®ããå ·ä½ä¾ã§èª¬æãã¾ãï¼
ã½ã¼ã¹ã³ã¼ããåãè¾¼ãã¨ãã« Gist ã使ã£ã¦ããç®æãããã¾ãï¼JavaScript ãç¡å¹ã«ãã¦ãããï¼https://gist.github.com ã¸ã®ãªã¯ã¨ã¹ããæå¦ãã¦ãããããã¨ä¸é¨ã®ã½ã¼ã¹ã³ã¼ããæ£ãã表示ãããªããã¨ãããã¾ãï¼ãã®å ´åã¯ï¼ç´æ¥ Gist ãåç §ãã¦ãã ããï¼
ActiveRecord ã¢ãã«ã¨ã¯
ActiveRecord ã¢ãã«ã¨ã¯ï¼ç義ã«ã¯ ActiveRecord::Base
ã®æ´¾çã¯ã©ã¹ã§ããï¼app/models/model_name.rb
ãã¡ã¤ã«ã§å®ç¾©ãããã¢ãã«ã¯ã©ã¹ã®ãã¨ãæãã¾ãï¼ãããï¼ããã ãã§ã¯ï¼æ¬ææ¸ã® ActiveRecord ã¢ãã«å®ç¾©ã®ååã§ãï¼æ®ãã®ååãå®ç¾©ããããã®ææã¨ãã¦ï¼Rails ã®ã¢ãã«ã¸ã®æ¹å¤ã¨ããã«å¯¾ããç§ã®å¯¾å¿çã«ã¤ãã¦èª¬æãã¾ãï¼
Rails ã®ã¢ãã«ã¸ã®æ¹å¤
äººæ° Web ã¢ããªã±ã¼ã·ã§ã³ãã¬ã¼ã ã¯ã¼ã¯ã® Rails ã¯ï¼ãã®äººæ°ããï¼æ¹å¤ã«ããããããã¨ãå¤ããªãã¾ãï¼ãã®ä¸ä¾ã Rails ã® ã¢ãã«ã¸ã®æ¹å¤ã§ãï¼ãã¨ãã°ï¼Ruby on Railsã®ãããMVCãã®å¼å®³ ã§ã¯ï¼Rails ã®ã¢ãã«ã ãã¡ã¤ã³ã¢ãã«è²§è¡ç ã«é¥ããããè¨è¨ã§ãããã¨ãæ¹å¤ãã¦ãã¾ãï¼å®ã¯ï¼ç§ããã®æ¹å¤ã¨åãæè¦ã§ãï¼
è²§è¡ã®æ²»çæ³
ãããï¼ãã¸ãã¹ãã¸ãã¯ããã¹ã¦ ActiveRecord ã¢ãã«ã«å®è£ ããå¿ è¦ããããã¨ããã¨ï¼å¿ ãããï¼ããã§ã¯ããã¾ããï¼ãã¨ãã°ï¼Dan Chak ã¯èæ¸ "Enterprise Rails" ã§ç©çã¢ãã«ã¨è«çã¢ãã«ã®åé¢ãææ¡ãã¦ãã¾ãï¼Dan Chak ã®ç©çã¢ãã«ã¯ãã¼ã¿ãã¼ã¹ã¨ãã¼ãã«ã®æ½è±¡åã§ï¼ActiveRecord ã§å®ç¾ããããã®ã§ãï¼ç©çã¢ãã«ã«ãã¸ãã¹ãã¸ãã¯ãå«ãã¦ã¯ããã¾ããï¼ä¸æ¹ï¼è«çã¢ãã«ã¯ãã¡ã¤ã³ã¢ãã«ã«ç¸å½ãï¼ãã¸ãã¹ãã¸ãã¯ã¯å ¨ã¦ããã«å«ãã¾ãï¼ããã¦ï¼ã³ã³ããã¼ã©ãªã©ã¯ã©ã¤ã¢ã³ãåã API ã¯è«çã¢ãã«ã«ã ãå®ç¾©ãã¾ãï¼ãã®æ¹æ³ã®å©ç¹ã®ä¸ã¤ãã¯ï¼ãã¼ã¿ãã¼ã¹è¨è¨ã«æãå ¥ãã¦ãã¯ã©ã¤ã¢ã³ãåã API ãå®å®ãããã¨ï¼äºã¤ãã¯ï¼ã³ã³ããã¼ã©ã容æã«ãã¸ãã¹ãã¸ãã¯ãå©ç¨ã§ãï¼ãã¼ã¿ã®æ´åæ§ãä¿è¨¼ããããã¨ã§ãï¼
æ¬ææ¸ã® ActiveRecord ã¢ãã«
ç§ã¯ï¼Dan Chak ã®æ¹æ³ã¨ã¯å°ãéãããæ¹ã§ãã¡ã¤ã³ã¢ãã«è²§è¡çãäºé²ãã¾ãï¼Dan Chak ã®å®è£
ã§ã¯ç©çã¢ãã«ã¨è«çã¢ãã«ãå¥ã
ã®ã¯ã©ã¹ã«ãã¦ãã¾ãï¼ãã®æ¹æ³ã§ã¯ï¼ç©çã¢ãã«ã app/models/physical
ã«ï¼è«çã¢ãã«ã app/models/logical
ã«é
ç½®ãã¾ãï¼ãã®æ¹æ³ã¯ Rails ã®ãã£ã¬ã¯ããªæ§æè¦ç´ããããå¤ããæ¹æ³ã§ï¼ç©çã¢ãã«ã¯ã©ã¹åã ::Physical
ã§ä¿®é£¾ãããããä¸å¿
è¦ã«é·ããªãã¨ããåé¡ãããã¾ãï¼ããã§ï¼ç§ã¯ï¼
- ActiveRecord æ´¾çã¯ã©ã¹ãç©çã¢ãã«ã¨ãã¦å®è£ ãã
- è«çã¢ãã«ã¯ã¢ã¸ã¥ã¼ã«ã¨ãã¦å®è£ ãã
- ç©çã¢ãã«ã«è«çã¢ãã«ã¢ã¸ã¥ã¼ã«ã
include
ã㦠MVC ã® M ãå®ç¾ãã
æ¹æ³ãæ¡ç¨ãã¦ãã¾ãï¼ããã«ããï¼
- ç©çã¢ãã«ã¨è«çã¢ãã«ã®åé¢
- Rails ã®ãã£ã¬ã¯ããªæ§æè¦ç´ãå°é
- ãã¡ã¤ã³ã¢ãã«è²§è¡çã®äºé²
ãå®ç¾ãã¦ãã¾ãï¼
æ¬ææ¸ã®ãActiveRecord ã¢ãã«ãã¨ã¯ï¼ããã§èª¬æããç©çã¢ãã«ã®ãã¨ã§ãï¼ãããã£ã¦ï¼ActiveRecord ã¢ãã«ã«å¯¾ãããã¹ãã¯ç©çã¢ãã«ã«å¯¾ãããã¹ãã¨ãããã¨ã«ãªãã¾ãï¼
ã©ãããã¹ãããã®ã
ããã§ã¯ï¼ActiveRecord ã¢ãã«ã®ï¼ã©ãã®ä½ããã¹ãããã°ããã®ã§ããããï¼å ã«çããè¨ã£ã¦ãã¾ãã¨ï¼ã©ãããã¹ãããã®ãã«ã¤ãã¦ã¯
- Validation
- ãã¼ã¿ãã¼ã¹
ã§ãï¼
Validation ã®ãã¹ãã«ã¤ãã¦ã¯ï¼Ruby on Rails Guides ããvalidation ããã¹ããããã¨æ¸ãã¦ãã¾ãï¼Validation 㯠ActiveRecord ã¢ãã«ã¯ã©ã¹ã«å®ç¾©ããããã®ã§ï¼ãã®ã¯ã©ã¹ã§ãããã¹ãã§ããªããã®ãªã®ã§ï¼ActiveRecord ã¢ãã«ã§ãã¹ããã¾ãï¼ãã¼ã¿ãã¼ã¹ã«é¢ãããã¹ãã«ã¤ãã¦ã¯ ActiveRecord ã¢ãã«ãç©çã¢ãã«ã§ãããã¨ããï¼å½ç¶ããã§ãã¹ããã¾ãï¼
ã¨æ¸ãã¾ãããï¼æ¬å½ã«å½ç¶ãªã®ã§ãããã? 次ã®ãã¼ã¿ãã¼ã¹ã«é¢ãããã¹ãã«é¢ããè°è«ã§å½ç¶ãæ£ããã£ããã©ãã確èªãã¾ãï¼
ãã¼ã¿ãã¼ã¹ã«é¢ãããã¹ãã¨ã¯ï¼
ãã¼ã¿ãã¼ã¹ã«é¢ãããã¹ãã§ã¯ï¼
- å¶ç´ãã¹ã
- CHECK
- NOT NULL
- UNIQUE
- åç
§æ´åæ§ãã¹ã
- FOREIGN KEY
ãè¡ãªãã¾ãï¼ãããã¯ãã¼ã¿ãã¼ã¹ã®ã¹ãã¼ãã«é¢ãããã¹ããªã®ã§ï¼SqlUnit ã¨ã SchemaUnit ã¨ãã¨ããã®ã使ã£ã¦ãã¼ã¿ãã¼ã¹å´ã§ãã¹ããã¹ãã¨èããããããã¾ããï¼ãããï¼å¶ç´ãåç §æ´åæ§ã«éåãããã¼ã¿ããã¼ã¿ãã¼ã¹ã«æå ¥ãããã¨ããå ´åï¼ActiveRecord ã¢ãã«ã¯ä¾å¤ãæãããã¨ãæãåºãã¾ãããï¼ãããªãã¨ï¼ææ©ãã¼ã¿ãã¼ã¹ããé¢ã㦠ActiveRecord ã¢ãã«ã®æ¯èãã®åé¡ãªã®ã§ï¼ä¾å¤ãæå¾ éãã«èµ·ãããã¨ãæ¯èããã¹ãã¨ãã¦ãã¹ãããå¿ è¦ãåºã¦ãã¾ãï¼
ã¤ã¾ãï¼ãã¼ã¿ãã¼ã¹ã«é¢ãããã¹ãã¨ã¯ï¼å¶ç´ãåç §æ´åæ§ã«éåãããã¼ã¿ããã¼ã¿ãã¼ã¹ã«æå ¥ãããã¨ããã¨ãã«çºçããä¾å¤ãï¼æå¾ éãã«çºçãããã¨ã確ããããã¬ãã£ããã¹ãã ã¨ãããã¨ã«ãªãã¾ãï¼
ä»ã«ããã¹ããã¹ããã®ãããã®ã§ã¯ï¼
ããã¾ã§ï¼ActiveRecord ã¢ãã«ã§ã¯ validation ã¨ãã¼ã¿ãã¼ã¹ããã¹ããããã¨ã説æãã¾ãããï¼ä»ã«ããã¹ãããã¹ããã®ãããã®ã§ã¯ï¼ã¨çåã«æã人ãããããããã¾ããï¼ãã¨ãã°ï¼
has_many
ãbelongs_to
ã®ãããªé¢é£å®ç¾©- ã¹ã³ã¼ã
- ãã®ä»ã®ã¡ã½ãã
ã§ãï¼ãããï¼ããã㯠ActiveRecord ã¢ãã«ã§ã¯ãã¹ããã¾ããï¼ããã¯ã©ããã¦ãã¨ããã¨ï¼
has_many ã belongs_to, ã¹ã³ã¼ãããã¹ãããªãã®ã¯ï¼
has_many
ãªã©ãã¹ã³ã¼ãã¨ãã£ã ActiveRecord ãæä¾ããã¯ã©ã¹ã¡ã½ããã¯ï¼Rails æ¬ä½ã§ãããããã¹ãããã¦ããã®ã§ï¼ãã¹ãç¡ãã«ä½¿ã£ã¦ã大ä¸å¤«ã§ãï¼ãã ãï¼æ¡ä»¶ã« lambda
ãããã¯ã使ããªã©ï¼è¤éãªãã®ã¯ãã¹ããã¦ãããããããã¾ããï¼ã§ãï¼ãã£ã±ãããªãã¦ãããããããã¾ããï¼ãã®çç±ã¯æ¬¡ãèªãã§èãã¦ãã ããï¼
ãã®ä»ã®ã¡ã½ããããã¹ãããªãã®ã¯ï¼
ActiveRecord ã¢ãã«ã¯ã©ã¹ã«å®ç¾©ãããã¡ã½ããã¯ï¼ã¤ã³ã¯ã«ã¼ããããè«çã¢ãã«ã¢ã¸ã¥ã¼ã«ããã®ã¿å¼ã³åºãããã¹ãã§ãï¼ãã£ã¦ï¼ãããã®ã¡ã½ããã¯åºæ¬çã«ã¯ãã©ã¤ãã¼ãã¡ã½ããã¨ãã¦å®ç¾©ããã¾ãï¼ã¦ããããã¹ãã§ãã©ã¤ãã¼ãã¡ã½ããããã¹ããã¹ããã©ããã¯è°è«ãåãããã¨ããã§ããï¼ç§ã¯ããã©ã¤ãã¼ãã¡ã½ããã¾ã§ç¡çãã¦ã¾ã§ãã¹ãããå¿ è¦ã¯ãªãï¼Ruby ã ããã§ãããã©ãã¨ããèããªã®ã§ï¼ãã¹ããã¾ããï¼
ãã©ã¤ãã¼ãã¡ã½ããããã¹ãããªãã¦ãï¼ãããå¼ã³åºãè«çã¢ãã«ã¢ã¸ã¥ã¼ã«ã®ã¡ã½ããããã¹ãããã®ã§ãããï¼ã«ãã¬ãã¸ä¸ã¯åé¡ããã¾ããï¼
Ruby on Rails Guides ã«ã¯éããã¨ãæ¸ãã¦ãããã©ï¼
ããããåèæç®ã¨ãã¦ä¾ã«æãã¦ãã Ruby on Rails Guides ã§ããï¼å®ã¯ï¼ããã§è¨ã£ã¦ããã®ã¨ã¯éããã¨ãæ¸ãã¦ããã¾ãï¼è©²å½é¨åãå¼ç¨ãã¦ç¢ºèªãã¦ã¿ãã¨ï¼
3.3 What to Include in Your Unit Tests
Ideally, you would like to include a test for everything which could possibly break. Itâs a good practice to have at least one test for each of your validations and at least one test for every method in your model.
ã¨ï¼æ¬å½ã¯ï¼
- Validation
- å ¨ã¦ã®ã¡ã½ãã
ããã¹ãããã¨æ¸ãã¦ããã¾ãï¼ãã® Ruby on Rails Guides ã¨ãã®ææ¸ã¯çç¾ãã¦ãã¾ãï¼ããã§ã¯ï¼ã©ã¡ããééã£ã¦ãããã¨ããã¨ï¼ã©ã¡ããééã£ã¦ã¯ãã¾ããï¼ã¨ããã®ãï¼Ruby on Rails Guides ã¨ãã®ææ¸ã¨ã§ã¯ã¦ããããã¹ãã®å¯¾è±¡ã¨ãã¦ããã¢ãã«ã®èãæ¹ãéãããã§ãï¼
Ruby on Rails Guides ã対象ã¨ãã¦ããã¢ãã«ãã©ã®ãããªãã®ãã¨ããã¨ï¼ï¼ï¼ï¼å®ã¯ï¼ã¯ã£ããã¨æ¸ãã¦ãã¾ããï¼ã§ãã®ã§ï¼validation ã¨ã¡ã½ããã ãããã¹ãããã°ãããããªã±ã¼ã¹ãï¼ãã£ã¨å«ãã§ããã®ã ã¨æãã¾ãï¼ä¸æ¹ï¼ç¹°ãè¿ãã§ããï¼ãã®ææ¸ã®ã¢ãã«ã¯ï¼ããæç¢ºã«å®ç¾©ããããActiveRecord ã¢ãã«ããªã®ã§ï¼validation ã¨ãã¼ã¿ãã¼ã¹ããã¹ããã¾ãï¼
ã©ã®ããã«ãã¹ããæ¸ãã
ããã¾ã§ï¼ActiveRecord ã¢ãã«ã«å¯¾ãããã¹ã㯠validation ã«é¢ãããã¹ãã¨ãã¼ã¿ãã¼ã¹ã«é¢ãããã¹ãã® 2 ã¤ã§ãããã¨ã説æãã¦ãã¾ããï¼ããã§ã¯ï¼ãããã® 2 ã¤ã®ãã¹ããã©ã®ããã«æ¸ãã°ããã®ã§ããããï¼ãããã®ãã¹ããæ¸ãéã«ã¯ãã¸ãã£ããã¹ãï¼æåãããã¹ãï¼ã¨ãã¬ãã£ããã¹ãï¼å¤±æãããã¹ãï¼ã® 2 ã¤ãæ¸ãã¾ãï¼ããªãã¡ï¼
- æ£å¸¸å¤ãªãã¸ã§ã¯ã â ã¨ã©ã¼ã«ãªããªããã¨
- ç°å¸¸å¤ãªãã¸ã§ã¯ã â ã¨ã©ã¼ã«ãªããã¨
ããã¹ããã¾ãï¼
ããã§ã¯ï¼ã¾ãï¼ActiveRecord ã¢ãã«ã®ä¾ã¨ã㦠Item ã¢ãã«ãç¨æãï¼ãã®ã¢ãã«ã«å¯¾ãã¦ãã¹ããå ·ä½çã«æ¸ãã¦ããã¾ãï¼
ä¾: Item ã¢ãã«
ä½ããªãã¨ããã«ãã¹ãã¯æ¸ããªãã®ã§ï¼ä¾ã¨ã㦠Item ã¢ãã«ãç¨æãã¾ããï¼
Item ã¢ãã«ã¯ï¼Vendor ã¢ãã«ã«å¯¾ã㦠belongs_to
é¢é£ããã£ã¦ãã¾ãï¼ãã® Item ã¢ãã«ã®ãã¤ã°ã¬ã¼ã·ã§ã³ã¯æ¬¡ã®ããã«ãªãã¾ãï¼
vendor_id
, title
, price
ã® 3 ã¤ã®ã«ã©ã ã«ã¯ NOT NULL å¶ç´ãè¨å®ããã¦ãã¾ãï¼NOT NULL å¶ç´ã¯ add_column
ã¡ã½ããã§ç°¡åã«è¨å®ã§ãã¾ãï¼ããã«ï¼11 è¡ç®ãã execute
ã¡ã½ããã§ SQL ãå®è¡ãã¦ãã¾ãï¼ãã¼ã¿ãã¼ã¹ã«ã¯ CHECK å¶ç´ã¨ FOREIGN KEY å¶ç´ã追å ãããã®ã§ããï¼Rails ã®ãã¤ã°ã¬ã¼ã·ã§ã³ã«ã¯ãã® 2 ã¤ã®å¶ç´ã追å ããã¡ã½ãããç¡ãã®ã§ä»æ¹ãªãç SQL ã«é ¼ãã¾ãï¼ä½è«ã§ããï¼ãã® execute
ã¡ã½ããã¯ï¼ãç°¡åãªãã¨ã¯ç°¡åã«ï¼ããã§ãªããã¨ã¯ãããªãã«ãå®ç¾ã§ãã ActiveRecord ã®æã®æ·±ããæããããã®ã§ï¼ç§ãæ°ã«å
¥ã£ã¦ããã¡ã½ããã®ä¸ã¤ã§ãï¼
話ãå ã«æ»ãã¦ï¼Item ã¢ãã«ã® ActiveRecord ã¢ãã«ã¯æ¬¡ã®ããã«ãªãã¾ãï¼
belongs_to
é¢é£ã¨ validation ãè¨å®ããã¦ãã¾ãï¼
ãã¼ã¿ãã¼ã¹ã«å¶ç´ãããã®ã«åãæå³ã® validation ãæ¸ãã®ã¯ãªãã
Item ã¢ãã«ã® title
, price
2 ã¤ã®ã«ã©ã ã«ã¯ãã¼ã¿ãã¼ã¹å¶ç´ã¨ validation ã®ä¸¡æ¹ãè¨å®ããã¦ãã¾ãï¼ãã¼ã¿ãã¼ã¹å¶ç´ãããã®ã«åãæå³ã® validation ãæ¸ãã®ã¯åé·ã ã¨æã£ã人ãããããããã¾ããï¼ãããï¼validation ãç¡ãã¨ï¼ã¢ãã«ã®ç°å¸¸å¤ã§ãã¼ã¿ãã¼ã¹ã®ä¾å¤ãã¢ããªã±ã¼ã·ã§ã³ã«é£ãã§ãã¾ãã¾ãï¼ã¢ããªã±ã¼ã·ã§ã³ã«ä¸å¿
è¦ã«ä¾å¤ãé£ã°ããªãããã«ãï¼validation ãè¨å®ãã¾ãããï¼ããã«ï¼ãã¼ã¿ãã¼ã¹ã®ä¾å¤ãããã¼ã¿ã®ç°å¸¸ãæ¢ãã®ã¯é£ããã®ã§ããï¼validation ãããã¨ã¢ããªã±ã¼ã·ã§ã³ã§ææã§ããã¨ããã¡ãªãããããã¾ãï¼
å®ã¯ï¼ãã¼ã¿ãã¼ã¹å¶ç´ã¨ validation ã¨ã§ã¯æ¤åºããç°å¸¸ã®æå³åããç°ãªãã¾ãï¼Validation ã§æ¤åºããç°å¸¸ã¯å ¥åã¨ã©ã¼ã§ãï¼ã¦ã¼ã¶ã«ãã¼ã¿ã®ä¿®æ£ãä¿ãããã®ãã®ã§ãï¼ä¸æ¹ï¼ãã¼ã¿ãã¼ã¹ã§æ¤åºããç°å¸¸ã¯ã¢ããªã±ã¼ã·ã§ã³ã®ãã°ã§ãï¼éçºè ã«ã³ã¼ãã®ä¿®æ£ãä¿ãããã®ãã®ã§ãï¼ã¨ããããã§ï¼ç§ã¯ãã¼ã¿ãã¼ã¹å¶ç´ã¨ validation ã®ä¸¡æ¹ãè¨å®ãããã¨ã«ãã¦ãã¾ãï¼
association_id ã§ãã vendor_id ã®ããªãã¼ã·ã§ã³ãæ¸ããªãã£ãã®ã¯ãªãã
ãã¼ã¿ãã¼ã¹ã® vendor_id
ã«ã©ã ã«ã¯ NOT NULL å¶ç´ã¨ FOREIGN KEY å¶ç´ãããã¾ããï¼ãããï¼ActiveRecord ã¢ãã«ã® vendor_id
ã«ã¯ NOT NULL å¶ç´ã«ç¸å½ãã validation ã¯ããã¾ããã§ããï¼ããã¯ï¼vendor_id == nil
ã¯å
¥åãã¼ã¿ã®ç°å¸¸ã§ã¯ãªãï¼ã¢ããªã±ã¼ã·ã§ã³ã®ãã°ã ã¨æ³å®ãã¦ããããã§ãï¼ããªãã¡ï¼ãã®ã¢ããªã±ã¼ã·ã§ã³ã¯ vendor_id
ãã¦ã¼ã¶ãç´æ¥æå®ãããããªä»æ§ã§ã¯ãªãï¼ããã«ï¼item.vendor = nil
ã¨æ¸ããããªã¦ã¼ã¹ã±ã¼ã¹ãæ³å®ãã¦ããªããã¨ãæå³ãã¦ãã¾ãï¼ãããªãã¨ä»ã¾ã§ã©ãã«ãæ¸ãã¦ãã¾ããã§ãããï¼ä»æ¸ããã®ã§è¨±ãã¦ãã ããï¼
ã¾ã¨ããã¨ï¼NOT NULL/FOREIGN KEY å¶ç´éåã¯ãã°ã¨ããã¢ããªã±ã¼ã·ã§ã³ã®ä»æ§ãæ³å®ãã¦ããã®ã§ï¼validation ã§æ¤åºãããããã¼ã¿ãã¼ã¹ä¾å¤ãæããã»ããããã¨ãããã¨ã§ãï¼
æºå 1) ã¹ãã¼ãã Ruby ã§ã¯ãªã SQL ã§ä¿åãããã Rails ãè¨å®ãã
ãã¹ããæ¸ãã¦ããåã®æºåã 2 ã¤ããã¾ãï¼ä¸ã¤ãã¯ï¼ã¹ãã¼ãã Ruby ã§ã¯ãªã SQL ã§ä¿åãããã Rails ãè¨å®ãããã¨ã§ãï¼Rails ã test ç°å¢ã®ãã¼ã¿ãã¼ã¹ãç¨æããã¨ãã«ã¯ï¼development ç°å¢ã®ãã¼ã¿ãã¼ã¹ã¹ãã¼ããã³ãã¼ãã¾ãï¼ãã®ã¨ãã«ä½¿ãã¹ãã¼ãã¯ï¼development ç°å¢ã®ãã¼ã¿ãã¼ã¹ããã¤ã°ã¬ã¼ã·ã§ã³ããã¨ãã«èªåã§ä¿åãããã¹ãã¼ãã§ï¼ããã©ã«ãã§ã¯ Ruby ã§æ¸ããããã¤ã°ã¬ã¼ã·ã§ã³ã³ã¼ãã¨ãã¦ä¿åããã¾ãï¼ããã§åé¡ã¨ãªãã®ãï¼execute
ã¡ã½ãããªã©ã§è¿½å ãã Ruby ã®ãã¤ã°ã¬ã¼ã·ã§ã³ã§è¡¨ç¾ã§ããªã SQL æã§ãï¼ãããã® SQL æã¯ããã©ã«ãã® Ruby å½¢å¼ã¹ãã¼ãã«ã¯ä¿åãããªãã®ã§ï¼test ç°å¢ã®ãã¼ã¿ãã¼ã¹ã«ã³ãã¼ããã¾ããï¼ãã®ã¾ã¾ã§ã¯å¶ç´ããã¹ãã§ãã¾ããï¼
ããã§ï¼ã¹ãã¼ãã®ä¿åå½¢å¼ã Ruby ãã SQL ã«å¤æ´ãã¾ãï¼config/applicaiton.rb ã«ï¼
# config/application.rb
module Dummy
class Application < Rails::Application
config.active_record.schema_format = :sql
end
end
ã¨, config.active_record.schema_format = :sql
ã追å ãã¾ãããï¼ããã§ test ç°å¢ã®ãã¼ã¿ãã¼ã¹ã«ãå¶ç´ãã³ãã¼ããã¾ãï¼
æºå 2) factory_girl ãå°å ¥ãã
ãã¹ããã¼ã¿ã®ä½æã«å©ç¨ãã factory_girl ãå°å ¥ãã¾ãï¼Rails ã« factory_girl ãå°å ¥ããéã¯ï¼factory_girl_rails gem ã便å©ã§ãï¼factory_girl_rails gem ãå°å ¥ããã¨ã¸ã§ãã¬ã¼ã¿ããã£ã¯ã¹ãã£ãªãã¬ã¼ã¹ã¡ã³ãã¨ã㦠factory_girl ã使ãããã«ãªãã¾ãï¼Gemfile ã«
group :test do
gem 'factory_girl_rails'
end
ã追å ãã¦ï¼bundle update
ãã¾ãï¼ããã«ï¼test/test_helper.rb ã§ï¼
# test/test_helper.rb
class ActiveSupport::TestCase
include Factory::Syntax::Methods
end
ã¨ï¼ActiveSupport::TestCase
ã¯ã©ã¹ã« Factory::Syntax::Methods
ã¢ã¸ã¥ã¼ã«ãã¤ã³ã¯ã«ã¼ããã¦ããã¾ãããï¼ãã®ã¢ã¸ã¥ã¼ã«ãã¤ã³ã¯ã«ã¼ãããã¨ï¼ãã¹ãã¡ã½ããä¸ã§ FactoryGirl.create(:foo)
ã¨ãã代ããã« create(:foo)
ã¨ã¹ãããªæ¸ãã¾ãï¼
ãªã Fixtures ã使ããªãã®ã
Fixtures ã¯ãã¼ã¿ãã¼ã¹ã®ç¶æ ãç¨æãã¾ãï¼ã ããï¼ãã¼ã¿ãã¼ã¹ã«å¶ç´ãããã¨ãã«ã¯ï¼å¶ç´ã«éåããç°å¸¸å¤ fixture ã使ãããã§ãã§ãã¾ããï¼ãã®ãã Fixtures ã¯ç°å¸¸å¤ãã¹ãã«ã¯åãã¾ããï¼ActiveRecord ã¢ãã«ã®ãã¹ãã§ã¯ï¼æ£å¸¸å¤ã®ãã¹ãã ãã§ãªãç°å¸¸å¤ã®ãã¹ããè¡ãªãããï¼ãã£ã¯ã¹ãã£ãªãã¬ã¼ã¹ã¡ã³ãã¨ã㦠factory_girl ãæ¡ç¨ãã¾ããï¼
ã ããã¨ãã£ã¦ï¼ã¢ããªã±ã¼ã·ã§ã³ã®ãã¹ãå ¨ä½ãã Fixtures ã追æ¾ãããã¨ããã¨ï¼ããããããã§ã¯ãªãï¼è«çã¢ãã«ã®ãã¹ãã§ã¯ Fixtures ã®ã»ãã便å©ã§ï¼ãã¡ãã使ããã¨ãããã¾ãï¼ã¤ã¾ãï¼Fixtures ããã£ã¯ã¹ãã£ãªãã¬ã¼ã¹ã¡ã³ãã§å®å ¨ã«ç½®ãæããã®ã§ã¯ãªãï¼ããã¨ãåãã§ä½µç¨ãã¾ãï¼ä½µç¨ããçç±ï¼ããªãã¡ï¼å®å ¨ã«ç½®ãæããªãçç±ã«ã¤ãã¦ã¯ factory_girl ã®æ¡ç¨é¢æ¥ ãåããã¦èªãã§ã¿ã¦ãã ããï¼
Validation ããã¹ããã
ããããæºåãæ´ãã¾ããï¼ã¾ã㯠validation ã®ãã¹ãããæ¸ãã¦ããã¾ãï¼
æ£å¸¸å¤ãªãã¸ã§ã¯ããã¨ã©ã¼ã«ãªããªããã¨ã確èªãã
ã¾ãï¼ãã¸ãã£ããã¹ããæ¸ãã¾ãï¼ããªãã¡ï¼æ£å¸¸å¤ãªãã¸ã§ã¯ããã¨ã©ã¼ã«ãªããªããã¨ã確èªãããã¹ãã§ãï¼ãã®ã¨ãã«ç¨æããæ£å¸¸å¤ãªãã¸ã§ã¯ãã®å±æ§å¤ã«ã¯ï¼å¢çå¤ãè¨å®ãã¾ãï¼ãã®å¢çå¤ãã¡ã¯ããªã®ååã¯ãã®ã¾ã¾ï¼item_with_boundary_value_attributes
ã¨ããä½ã®ã²ããããªãååã«ãã¾ãï¼ãã¡ã¯ããªå®ç¾©ã¯ï¼
# test/facytories/items.rb
FactoryGirl.define do
factory :item, aliases: [:item_with_boundary_value_attributes] do
vendor
title "Q"
description "Using this item, you will be taller."
price '0.00'
end
end
ã¨ãªãã¾ãï¼ãã®ãã¡ã¯ããªã¯ Item
ã¯ã©ã¹ã®ãªãã¸ã§ã¯ããä½ããã®ãªã®ã§ï¼ååã :item
ã¨ãã¦å®ç¾©ãã¦ããã¨ã¯ã©ã¹åã®è¨å®ãä¸è¦ã«ãªã便å©ã§ãï¼ããã¦ï¼æ¬æ¥ã¤ãããã£ãååï¼:item_with_boundary_value_attributes
ãã¨ã¤ãªã¢ã¹ã¨ãã¦è¨å®ãã¦ãã¾ãï¼
ããã¦ï¼ãããããã¹ãã¡ã½ããã§ãï¼ãã¹ãã¡ã½ããã¯ï¼"{ãã¡ã¯ããªå} is valid" ã¨ãã¾ãï¼ä»åã®ãã¡ã¯ããªå㯠item_with_boundary_value_attributes
ã ã£ãã®ã§ï¼
# test/units/item_test.rb
test 'an item with boundary value attributes is valid' do
assert build(:item_with_boundary_value_attributes).valid?
end
ã¨ãªãã¾ãï¼build
ã§ãã¼ã¿ãã¼ã¹ã«ä¿åããªããªãã¸ã§ã¯ããä½ã£ã¦ valid?
ããã ãã§ãï¼ç°¡åã§ããï¼
ç°å¸¸å¤ãªãã¸ã§ã¯ããã¨ã©ã¼ã«ãªããã¨ã確èªãã
次ã«ãã¬ãã£ããã¹ããæ¸ãã¾ãï¼ããªãã¡ï¼ç°å¸¸å¤ãªãã¸ã§ã¯ããã¨ã©ã¼ã«ãªããã¨ã確èªãããã¹ãã§ãï¼ç°å¸¸å¤ãç¨æããç°å¸¸å¤ãã¡ã¯ããªã«ã¯ï¼:{ã¢ãã«å}_with_{ç°å¸¸ãª}_{屿§å}
ã¨ããå½åè¦åã§ååãã¤ãã¾ãï¼ä»åã¯ï¼
:item_with_empty_title
:item_with_blank_title
:item_with_empty_price
:item_with_negative_price
ã® 4 ã¤ã®ç°å¸¸å¤ãã¡ã¯ããªãç¨æãã¾ããï¼ãã®ã¨ãã«ç¨æããç°å¸¸å¤ãã¡ã¯ããªã¯ï¼ãã¸ãã£ããã¹ãã§ç¨æããæ£å¸¸å¤ï¼å¢çå¤ï¼ãå°ãä¿®æ£ããã ãã§ç¨æã§ãã¾ãï¼ãããªã¨ãã«ã¯ factory_girl ã®ç¶æ¿æ©è½ã便å©ã§ãï¼ç°å¸¸å¤ãã¡ã¯ããªã追å ãã¦å®æãã Item ã¢ãã«ã®ãã¡ã¯ããªå®ç¾©ã次ã«ç¤ºãã¾ãï¼
次ã«ï¼ãã¹ãã¡ã½ãããæ¸ãã¦ããã¾ãï¼ãã¹ãã¡ã½ãã㯠"{ç°å¸¸å¤ãã¡ã¯ããªå} is invalid" ã¨ãã¾ãï¼ä»åç¨æãããã¡ã¯ããªã®ããããã«ã¤ãã¦ãã¹ããæ¸ãã¨ï¼
# test/units/item_test.rb
test 'an item with empty title is invalid' do
item = build(:item_with_empty_title)
assert item.invalid?
assert item.errors[:title].any?
end test 'an item with blank title is invalid' do
item = build(:item_with_blank_title)
assert item.invalid?
assert item.errors[:title].any?
end
test 'an item with empty price is invalid' do
item = build(:item_with_empty_price)
assert item.invalid?
assert item.errors[:price].any?
end
test 'an item with negative price is invalid' do
item = build(:item_with_negative_price)
assert item.invalid?
assert item.errors[:price].any?
end
ã¨ãªãã¾ãï¼åãã¹ãã¡ã½ããã§ã¯ï¼ç°å¸¸å¤ãªãã¸ã§ã¯ãã invalid?
ã§ãããã¨ã¨ï¼ç°å¸¸å¤å±æ§ãã¨ã©ã¼ã«ãªã£ã¦ãããã¨ã確èªãã¾ãï¼
ããã§ï¼validation ã®ãã¹ãã¯å®æã§ãï¼
ãã¼ã¿ãã¼ã¹å¶ç´ã»åç §æ´åæ§ããã¹ããã
Validation ã®ãã¹ããçã¥ããã¨ããã§ï¼ãã¼ã¿ãã¼ã¹å¶ç´ã»åç
§æ´åæ§ãã¹ãã«ç§»ãã¾ãï¼ãã¹ããæ¸ãåã«ï¼ActiveSupport::TestCase
ã«ãã¼ã¿ãã¼ã¹ãã¹ãç¨ã®ã¢ãµã¼ã·ã§ã³ã追å ãã¾ãããï¼
æºå: ãã¼ã¿ãã¼ã¹ã¨ã©ã¼ã®ããã®ã¢ãµã¼ã·ã§ã³ã追å ãã
ãã¼ã¿ãã¼ã¹ã«å¯¾ãããã¬ãã£ããã¹ãã§ã¯ãã¼ã¿ãã¼ã¹ä¾å¤ã®çºçã確èªãã¾ãï¼å ·ä½çã«ã¯ï¼
ActiveRecord::StatementInvalid
... NOT NULL, CHECK å¶ç´éåActiveRecord::RecordNotUnique
... UNIQUE å¶ç´éåActiveRecord::InvalidForeignKey
... FOREIGN KEY å¶ç´éå
ãçºçãããã¨ã確èªãã¾ãï¼ä¾å¤çºçã®ã¢ãµã¼ã·ã§ã³ã«ã¯ assert_raise
ã使ããã®ã§ããï¼æ¯å
assert_raise ActiveRecord::StatementInvalid do
...
endassert_raise ActiveRecord::RecordNotUnique do
...
end
assert_raise ActiveRecord::InvalidForeignKey do
...
end
ã¨é·ãä¾å¤åãæ¸ãã®ã¯é¢åãªã®ã§ï¼å°ç¨ã®ã¢ãµã¼ã·ã§ã³ãç¨æãã¾ãï¼ããããååãï¼
assert_statement_invalid
assert_record_not_unique
assert_invalid_foreign_key
ã¨ãã¦ï¼ActiveSupport::TestCase
ã«è¿½å ãã¾ãããï¼è¿½å ããå ´æã¯ test/test_helper.rb ãé©å½ã§ãï¼
# test/test_helper.rb
class ActiveSupport::TestCase
include Factory::Syntax::Methods def assert_statement_invalid(&block)
assert_raise(ActiveRecord::StatementInvalid, &block)
end
def assert_record_not_unique(&block)
assert_raise(ActiveRecord::RecordNotUnique, &block)
end
def assert_invalid_foreign_key(&block)
assert_raise(ActiveRecord::InvalidForeignKey, &block)
end
end
ããã§æºåãæ´ãã¾ããï¼
æ£å¸¸å¤ãªãã¸ã§ã¯ããä¿åã§ãããã¨ã確èªãã
Validation ã®ãã¹ãã¨åæ§ï¼ãã¸ãã£ããã¹ãããæ¸ãã¦ããã¾ãï¼ãã¼ã¿ãã¼ã¹ã®ãã¹ãã§ã¯ validation ã®ãã¹ãã§ç¨æãããã¡ã¯ããªãåå©ç¨ãã¾ãï¼:item_with_boundary_value_attributes
ãã¡ã¯ããªã使ã£ã¦ï¼"db allows saving an item with boundary value attributes" ãã¹ãã¡ã½ãããæ¸ãã¾ãï¼è¨ãå¿ãã¾ãããï¼ãã¼ã¿ãã¼ã¹ã®ãã¸ãã£ããã¹ãã§ãã¹ãã¡ã½ãããæ¸ãã¨ãã«ã¯ã¡ã½ããåã "db allows saving {æ£å¸¸å¤ãã¡ã¯ããªå}" ã¨ãã¾ãï¼
test 'db allows saving an item with boundary value attributes' do
assert build(:item_with_boundary_value_attributes).save
end
å¶ç´ããã¹ããã
ããã§ãï¼validation ã®ãã¹ãã§ç¨æããç°å¸¸å¤ãã¡ã¯ããªãå
¨é¨ãã®ã¾ã¾åå©ç¨ãã¾ãï¼ãã ãï¼vendor_id
ã«ã©ã ã« NULL ãè¨å®ãããã¡ã¯ããªã ãã¯ç¨æãã¦ããªãã®ã§ï¼build(:item, vendor_id: nil)
ã¨ãã¦ç°å¸¸å¤ãªãã¸ã§ã¯ããä½ãã¾ãï¼ã¾ãï¼åã« save!
ã¨ããã¨ãã¼ã¿ãã¼ã¹å¶ç´ãããå
ã« validation ãã¨ã©ã¼ãæ¤åºãã¦ãã¾ãã®ã§ï¼{ :validate => false }
ã¨ã㦠validation ãåé¿ãã¾ãï¼ãã¹ãã¡ã½ããåã¯ï¼"db can catch {ç°å¸¸ãªç¶æ
ã®} {屿§}" ã¨ããå½åè¦åã§ååãã¤ãã¾ãï¼ããã¦ï¼ä¾å¤ã®ææã«ã¯ï¼æºåãã¦ãããå¶ç´éåç¨ã®ã¢ãµã¼ã·ã§ã³ assert_statement_invalid
ã使ãã¾ãï¼
test 'db can catch null title' do
assert_statement_invalid do
build(:item_with_empty_title).save!(validate: false)
end
endtest 'db can catch blank title' do
assert_statement_invalid do
build(:item_with_blank_title).save!(validate: false)
end
end
test 'db can catch null price' do
assert_statement_invalid do
build(:item_with_empty_price).save!(validate: false)
end
end
test 'db can catch negative price' do
assert_statement_invalid do
build(:item_with_negative_price).save!(validate: false)
end
end
test 'db can catch null vendor_id' do
assert_statement_invalid do
build(:item, vendor_id: nil).save!(validate: false)
end
end
åç §æ´åæ§ããã¹ããã
åç
§æ´åæ§ããã¹ãããããã®ãã¡ã¯ããªã validation ã®ãã¹ãã§ç¨æãã¦ããªãã®ã§ï¼æ£å¸¸å¤ï¼å¢çå¤ï¼ãªãã¸ã§ã¯ãã® vendor_id
ã夿´ãã¦ï¼build(:item, vendor_id: 99999999)
ã®ããã«ãã¦ç°å¸¸å¤ãªãã¸ã§ã¯ãã使ãã¾ãï¼ãã¹ãã¡ã½ããåã¯ï¼"db can catch {ã¢ãã«å} with invalid reference" ã¨ãã¾ãï¼
test 'db can catch an item with invalid reference' do
assert_invalid_foreign_key do
build(:item, vendor_id: 99999999).save!(validate: false)
end
end
åç §æ´åæ§ãã¹ãã§æ°ãã«ãã¡ã¯ããªãå®ç¾©ããªãã£ãã®ã¯ãªãã
åç
§æ´åæ§ãã¹ãã§ç°å¸¸å¤ãªãã¸ã§ã¯ããä½ãã¨ãã¯æ°ãã«ãã¡ã¯ããªãå®ç¾©ããï¼æ¢åã®ãã¡ã¯ããªãæµç¨ãã¾ããï¼:item_with_invalid_reference
ã¨ãããã¡ã¯ããªãæ°ããä½ã£ã¦ããããããªã®ã«ï¼ã¨æã£ãæ¹ãããããããã¾ããï¼æ°ãã«å®ç¾©ããªãã£ãã®ã¯çç±ã¯ç°¡åã§ï¼ãã¡ã¯ããªãå®ç¾©ããã¨ãã¦ãä¸åº¦ããå¼ã³åºãããªãããã§ãï¼Validation ã®ãã¹ãã§ç¨æãããã¡ã¯ããªã¯ï¼ãã¼ã¿ãã¼ã¹ã®ãã¹ãã§ã使ããã¦ããï¼å
¨ã¦äºåå¼ã³åºããã¦ãã¾ãï¼å¶ç´ãã¹ãã§ :item_with_null_vendor_id
ã¨ãããã¡ã¯ããªãå®ç¾©ããªãã£ãã®ãåæ§ã®çç±ã§ãï¼
ãã¹ã宿
ããã§ï¼ãã¹ããå ¨ã¦æ¸ãçµãã¾ããï¼ããã¾ã§æ¸ãããã®ãå ¨ã¦ç¹ãã§ test/units/item_test.rb ã¨ãã¾ãï¼
ï¼åèï¼ä¾ã§ç»å ´ããªãã£ããã¿ã¼ã³: UNIQUE å¶ç´ã®ãã¹ã
ãã¼ã¿ãã¼ã¹ã®å¶ç´ã«ã¯ä¸ç¨®é¡ããã¾ãï¼
- CHECK
- FOREIGN KEY
- UNIQUE
ãã®ãã¡ï¼UNIQUE å¶ç´ã¯ä»åã®ä¾ã§ã¯ç»å ´ããªãã£ãã®ã§ï¼åèï¼ã¨ãã¦è£è¶³ãã¾ãï¼UNIQUE å¶ç´ããã¤ã¢ãã«ã¨ã㦠Foo ã¢ãã«ãå¥ã«ç¨æãã¾ããï¼ãã¹ãã®èª¬æã«ä½¿ããã°ããã®ã§ååãä¸èº«ãããªãé©å½ã§ããï¼å¿ è¦ååã§ãï¼ã¾ãã¯ï¼ãã¤ã°ã¬ã¼ã·ã§ã³ããï¼
UNIQUE å¶ç´ã¯ add_index
ã¡ã½ããã§ { :unique => true }
ãããã¨ã§è¨å®ã§ãã¾ãï¼æ¬¡ã«ï¼ActiveRecord ã¢ãã«ã¯ã©ã¹ã§ãï¼
UNIQUE å¶ç´éåã¯ãã°ã§ã¯ãªãå ¥åã¨ã©ã¼ãªã®ã§ validation ãè¨å®ãã¦ãã¾ãï¼
Validation ã®ãã¹ã
ããã§ã¯ UNIQUE å¶ç´ã«ã¤ã㦠validation ã®ãã¹ãããæ¸ãã¦ããã¾ãããï¼ãã¹ãã¡ã½ããå㯠"{ã¢ãã«å} with duplicate {UNIQUE 屿§} is invalid" ã¨ãã¾ãï¼
# test/units/foo_test.rb
test 'a foo with a duplicate bar is invalid' do
create(:foo)
foo = build(:foo)
assert foo.invalid?
assert foo.errors[:bar].any?
end
3 è¡ç®ã® create(:foo)
ã§ä½ã£ããªãã¸ã§ã¯ãã¨åã屿§å¤ããã¤ãªãã¸ã§ã¯ãã 4 è¡ç®ã§ä½ãï¼ãã®ãªãã¸ã§ã¯ãã invalid?
ã§ãããã¨ï¼5 è¡ç®ï¼ï¼bar
屿§ã«ã¤ãã¦ã¨ã©ã¼ã¨ãªããã¨ï¼6 è¡ç®ï¼ãã¢ãµã¼ã·ã§ã³ãã¦ãã¾ãï¼
ãã¼ã¿ãã¼ã¹ã®ãã¹ã
次㫠UNIQUE å¶ç´ã«ã¤ãã¦ãã¼ã¿ãã¼ã¹ã®ãã¹ããæ¸ãã¾ãï¼ãã¹ãã¡ã½ããåã¯ï¼"db can catch duplicate {UNIQUE 屿§ã®å±æ§å}" ã¨ãã¾ãï¼
# test/units/foo_test.rb
test 'db can catch duplicate bars' do
create(:foo)
assert_record_not_unique do
build(:foo).save!(validate: false)
end
end
æºåãã¦ããã assert_record_not_unique
ã¢ãµã¼ã·ã§ã³ãæ´»ç¨ãã¾ãï¼
ãããã«
ãã®ææ¸ã§ã¯ï¼ActiveRecord ã¢ãã«ãã¹ãã®æ¸ãæ¹ã«ã¤ãã¦ã¬ã¤ãã©ã¤ã³ã示ãï¼ä¾ã使ã£ã¦å ·ä½çã«è§£èª¬ãã¾ããï¼æå¾ã«ï¼ãã®ææ¸ã§ç»å ´ããã¬ã¤ãã©ã¤ã³ãã¾ã¨ãã¦ããã¾ãï¼
- ActiveRecord ã¢ãã«ã®ã¬ã¤ãã©ã¤ã³
- ActiveRecord ã¢ãã«ã¯ç©çã¢ãã«
- ã¢ãã«ã® validation ã¨ãã¼ã¿ãã¼ã¹æä½ãæ å½
- ãã¸ãã¹ãã¸ãã¯ã¯å¥ã¢ã¸ã¥ã¼ã«ã«ãã¦
include
= è«çã¢ãã«ï¼MVC ã® M ã«ç¸å½
- ã©ãããã¹ããããã®ã¬ã¤ãã©ã¤ã³
- ã¢ãã«ã® validation
- ãã¼ã¿ãã¼ã¹å¶ç´ã»åç §æ´åæ§
- ä½ããã¹ããããã®ã¬ã¤ãã©ã¤ã³
- æ£å¸¸å¤ â ã¨ã©ã¼ã«ãªããªã
- ç°å¸¸å¤ â ã¨ã©ã¼ã«ãªã
- ãã¹ããã¼ã¿æºåã®ã¬ã¤ãã©ã¤ã³
- factory_girl = ãã£ã¯ã¹ãã£ãªãã¬ã¼ã¹ã¡ã³ãå©ç¨
ããä¸ã¤ï¼ãã¡ã¯ããªåããã¹ãã¡ã½ããåã®å½åè¦åãã¬ã¤ãã©ã¤ã³ã¨ãã¦ç»å ´ãã¾ããï¼ãã¡ããã¾ã¨ãã¦ããã¾ãï¼
- æ£å¸¸å¤ãã¡ã¯ããªå
:{ã¢ãã«å}_with_boundary_value_attributes
â:{ã¢ãã«å}
ã®ã¨ã¤ãªã¢ã¹
- ç°å¸¸å¤ãã¡ã¯ããªå
:{ã¢ãã«å}_with_{ç°å¸¸ãª}_{屿§å}
- Validation ãã¹ãã¡ã½ããå
- "{æ£å¸¸å¤ãã¡ã¯ããªå} with boundary value attribute is valid"
- "{ç°å¸¸å¤ãã¡ã¯ããªå} is invalid"
- ãã¼ã¿ãã¼ã¹ãã¹ãã¡ã½ããå
- "db allows saving {æ£å¸¸å¤ãã¡ã¯ããªå}"
- "db can catch {ç°å¸¸ãª} {屿§å}"
- "db can catch duplicate {UNIQUE å¶ç´ã®å±æ§å}"
大äºãªãã¨ãªã®ã§äºåº¦è¨ãã¾ããï¼ãã®ææ¸ã¯ç§çãªãã®ã§ãï¼ãã£ã¦å ¨ã¦ã® Rails éçºã«é©ç¨ã§ãããã®ã§ã¯ããã¾ããï¼ActiveRecord ã¢ãã«ã®å®ç¾©ãããåããããã«ï¼ãã®ã¬ã¤ãã©ã¤ã³ã¯ã¨ã³ã¿ã¼ãã©ã¤ãºã¢ããªã±ã¼ã·ã§ã³éçºã主対象ã¨ãã¦ãã¾ãï¼ãã®ã¬ã¤ãã©ã¤ã³ã«å¿ å®ã§ããããã«ã¯ï¼ãã¼ã¿ãã¼ã¹è¨è¨ã¯ãã¾ã¨ããã§ãªãã¨ãããªãã§ããï¼RDBMS ã SQL ã®ãå¶ç´ããã¾ã¨ãã«æ±ãããã®ãæ¡ç¨ããå¿ è¦ãããã¾ãï¼ãã¼ã¿ãã¼ã¹ã NoSQL çã«ä½¿ã£ãã NoSQL ã使ã£ããããéçºã§ã¯ä½ã®å½¹ã«ãç«ã¡ã¾ããï¼ãããªå ´åã§ãï¼ã©ãã®ä½ãã©ã®ããã«ï¼ããã¦ï¼ããã¯ãªããã¹ãããã®ãèããä¸ã§åèã«ãªãããããã¾ããï¼ããä½ãã®åèã«ãªãã°å¹¸ãã§ãï¼
ããã§ã¯ï¼ä¸ã®ä¸ã« ActiveRecord ã¢ãã«ãã¹ããå å®ãã Rails ã¢ããªã±ã¼ã·ã§ã³ãå¢ãã¾ãããã«ï¼