
çã¿ã䌎ãããšã«ã€ããŠã話ããããšæããŸããäžè¬çã«ã¯
ARã§ãç¹ã«ãªã¬ãŒã·ã§ã³ã§åãããšã§ãã ç°¡åã«ããªãã®äººçãå°ç¡ãã«ããŠãã³ãŒããé
ããŠå€§é£ãã«ããããšãã§ããæšæºçãªåºã®è£œåã«å¯ŸããŠèŠåããŠãã ããã ç©èªã¯ãåãæµåºã®Rails 3.2ãšActiveRecordã«åºã¥ããŠããŸãã ãã¡ãããRails 4ã«ã¯æ°ãããŠäŸ¿å©ãªãã®ããããããããŸããããããåãæ¿ããå¿
èŠããããŸãããšã«ããåºç€ã¯åãã§ãã
ã»ãšãã©ã®å Žåããã®è³æã¯åå¿è
åãã§ã
ãARã䜿çšããå Žåãäœæè
ãActiveRecordãªããžã§ã¯ãããã®ä»ã®å°æè¢ã®åœ¢ã§ããŒãã«å
šäœã®å
容ãã¡ã¢ãªã«æœåºããã®ã¯éåžžã«èŠçã ããã§ãã ZenãåŠãã éçºè
ã«ãšã£ãŠããã®ãããã¯ã¯åœ¹ã«ç«ã€ãšã¯æãããŸããã圌ãã¯èªåã®äŸãšæèšã§ãããè£å®ããããšããã§ããŸããã
圌ãã¯äžçã«äœåç¹°ãè¿ããŸããã...
Relation ïŒããã³äžè¬çãª
ActiveRecordãªããžã§ã¯ãïŒã§äœæ¥ãéå§ããå Žåã1ã€ã®ããšãæ確ã«æ瀺ããå¿
èŠããããŸããéžæããå
·äœåããããã€ã³ããã€ãŸãSQLã¯ãšãªã®æ§ç¯ãåæ¢ãããã€ã³ãã§ãã èšãæãããšãããŒã¿ããã§ãããããã¡ã¢ãªå
ã®åŠçã«é²ããšãã§ãã ãªããããéèŠãªã®ã§ããïŒ ã¯ããããã¯åä»ã ããã§ãïŒ
Product.all.find{|p| p.id == 42}
ãµãŒããŒããã³ã°ã¢ããããããã¹ãŠã®RAMãååŸããããã«å€ãã®æ±ãããªãã¯ãå®è¡ã§ããŸãã ãããŠåãããšã§ãããèšãæããã°ïŒ
Product.find(42)
çµæãªãã§ããã«åäœããŸãã ãããã£ãŠã
findãš
findã¯ãŸã£ããåããã®ã§ã¯ãããŸããïŒ ãªãã§ïŒ ã¯ããæåã®ã±ãŒã¹ã§ã¯
Product.allãšèšã£ãŠ
足ã§æã¡ãŸãããããã¯ã
補åããŒãã«ã®ã³ã³ãã³ãå
šäœãæœåºããåè¡ã§ARãªããžã§ã¯ããæ§ç¯ããããšãæå³ããããããããããé
åãäœæããã¯ã©ã¹ã¡ãœããã§ãã
findããŠã©ãŒã¯ã¹ã«ãŒãã
ããã§ã
é
å ïŒäžè¬çã«ã
find㯠Enumerableããã®ãã®ã§ããããããã¯ãã§ã«è©³çŽ°ã§ãïŒã 2çªç®ã®ã±ãŒã¹ã§ã¯ããã¹ãŠãã¯ããã«åªããŠããŸã
ãfindã¯ARã¡ãœããã§ããã
pkã§æ€çŽ¢ããããã«èšèšãããŠããŸãã ã€ãŸãããªã¯ãšã¹ããçæããŸã
SELECT * FROM products WHERE products.id = 42;
ãããå®è¡ãã1è¡ãã¹ãŠãåãåããŸãã
è¯ãç¹ãšæªãç¹
ããã§ãARãæ±ãããšã倧ããªè²¬ä»»ã§ããçç±ãããã£ãã®ã§ã足å
ãæããªãããã«ããŸãããã ããã¯éåžžã«ç°¡åã§ããARãæäŸããã¡ãœããã䜿çšããå¿
èŠããããŸãã ããã«ãããŸãïŒ
whereãselectãpluckãincludesãjoinsãscopedãunscopedãfind_eachãªã©ãããã¥ã¡ã³ããŸãã¯
é£æ¥ããããã«ãããŸãã ãã ãã䜿çšããªãæ¹ãè¯ãã®ã¯åæãéåžžã«é£ãããåæã«éåžžã«ç°¡åã§ããä»ã®ãã¹ãŠã®ã¡ãœããã䜿çšããã®ã¯æãŸãããããŸãããæ®ãã®ã»ãšãã©ãã¹ãŠã®ã¡ãœããã
é¢ä¿ã
é
åã«å€æããããã§ãã
ã·ã³ãã«ãªã¬ã·ã
ä»ãç§ã¯ããã€ãã®æšæºãæäŸããŸãããç掻ã楜ã«ãããã¶ã€ã³ã¯ããŸããããŸãããããã°ãã°å¿ããããŸãã ããããèªè
ã«è³ªåããåã«ãhas_manyé¢æ°ãæãåºããŠãã ããã ç¥ã£ãŠãããã©ã¡ãŒã¿ãŒãšãç©æ¥µçã«äœ¿çšããŠãããã©ã¡ãŒã¿ãŒã«ã€ããŠèããŠãã ããã ããªãã®å¿ã«ãããããªã¹ãããããããæ°ããŸã...ãããŠä»è³ªåã¯æ¬¡ã®ãšããã§ãïŒããªãã¯ãããã®ãã¡ã®äœäººãå®éã«ç¥ã£ãŠããŸããïŒ
çãRails3ã«24åãRails4ã«12åã 12pcsã®éãã¯ã whereãgroupãªã©ã®ã¡ãœãããšãããã·ã¥ã§ã¯ãªããããã¯ã§Rails4ã«æž¡ãããçŽç²ãªSQLãæäœããã¡ãœããã«ãã£ãŠçããŸãã
ãªããããèããã®ã§ããïŒ ã¯ããããªãã®ã¬ãã«ãéåžžã«å€§ãŸãã«è©äŸ¡ããã»ãšãã©ã®ãªãã·ã§ã³ãç¥ã£ãŠãããªãã以äžã¯ããªãã«æ°ããç¥èãããããå¯èœæ§ãäœããšèšãããã«ã ãã®è©äŸ¡ã¯éåžžã«æ¡ä»¶ä»ãã§ãããããã£ãŠã芪æãªãèªè
ã¯ããšãã§ããªã/æ¯æã§ããªã/å¥åŠ/ãªã©ïŒå¿
èŠãªããšã匷調ããïŒããã«æããŠããããŸãæããªãã§ãã ããã
ã¬ã·ãåæ°
ããã§ã¯ãé çªã«è¡ããŸãããã
update_attributesãš
update_attribute ïŒãŸãã¯ãã¹ãŠã§ã¯ãªãïŒïŒã«ã€ããŠã¯èª°ããç¥ã£ãŠããŸãã æåã®-æ€èšŒãšã³ãŒã«ããã¯ã®åŒã³åºãã§ãã£ãŒã«ãã倧éã«æŽæ°ããŸãã é¢çœããªãã 2çªç®-ãã¹ãŠã®æ€èšŒãã¹ãããããã³ãŒã«ããã¯ãèµ·åããŸãããéžæãã1ã€ã®ãã£ãŒã«ãã®å€ã®ã¿ãæŽæ°ã§ããŸãïŒäžéšã®äººã«ãšã£ãŠã¯ã
ä¿åïŒæ€èšŒïŒfalseïŒã®æ¹ã䌌ãŠããŸã ïŒ ããããäœããã®çç±ã§ã圌ãã¯ãã°ãã°
update_columnãš
update_allãå¿ããŸãã ãã®ã¡ãœããã¯ãæ€èšŒãšã³ãŒã«ããã¯ã®äž¡æ¹ãã¹ãããããåæ¯ãªãã§ããŒã¿ããŒã¹ã«çŽæ¥æžã蟌ã¿ãŸãã
ã¬ã·ãçªå·2
ã³ã¡ã³ãã¯çŽ æŽããã
ã¿ããæ¹æ³ãæãåºãããŸããã 圌ãã¯ãã°ãã°åœŒã®ããšãå¿ããŠã
@product.updated_at = DateTime.now @product.save
ãŸãã¯
@product.update_attribute(:updated_at, DateTime.now)
ãã ãããã®ç®çã®ããã«ã¯ã次ã®ããã«ããã»ããç°¡åã§ãã
@product.touch(:updated_at)
ããã«ã
touchã«ã¯ç¬èªã®after_touch
ã³ãŒã«ããã¯ãšããªãã·ã§ã³
ïŒtouchã belongs_toã¡ãœããã«ãããŸãã
æ£ããå埩ããæ¹æ³
ããã¯ãã§ã«find_eachã«ã€ããŠè©±ããŠããŸããããããäžåºŠèšåãããããããŸããã
product.documents.map{âŠ}
ãããŠãããã¯å圢ã§ãããã©ããããå°ãå€ãèŠã€ãããŸããã
Relationã§äœ¿çšãããåŸæ¥ã®ã€ãã¬ãŒã¿ã«ã¯ã1ã€ã ãåé¡ããããŸãããããã¯ãããŒã¿ããŒã¹ãããã¹ãŠãäžåºŠã«åŒãåºããŸãã ãããŠããã¯ã²ã©ãã§ãã 察ç
§çã«ãããã©ã«ãã§ã¯ã
find_eachã¯äžåºŠã«1000åãæã¡ãåé¡ãããŸããïŒ
UPDïŒã³ã¡ã³ãã§æ¢ã«è¿°ã¹ãããã«ãraw-sqlã«æ瀺çã«æ圱ãããŠããªããã¹ãŠã®ã¡ãœããã¯to_aã«å§ä»»ãããŸããããããã¯ãšãªå
šäœãã¡ã¢ãªã«ãã§ããããããã®æäœãDBåŽã§ã¯ãªãRubyåŽã«ããçç±ã§ãã
default_scopeã«é¢ãããã³ã
default_scopeã®å
容ããããã¯ã§ã©ããããŸãã äŸïŒ
default_scope where(nullified: false)
éãã¯äœã§ããïŒ æåã®ãªãã·ã§ã³ã¯ãµãŒããŒã®èµ·åæã«å®è¡ããã
ç¡å¹åããããã£ãŒã«ããããŒã¿ããŒã¹ã«
ãªãã£ãå ŽåããµãŒããŒã¯èµ·åããŸããã åãããšã¯ç§»è¡ã«ãåœãŠã¯ãŸããŸãããã£ãŒã«ãããªãããã«ç§»è¡ãããŸãããããããè¿œå ããã ãã§ãã 2çªç®ã®ã±ãŒã¹ã§
㯠ã
Rubyãé
延ããŠãããšããäºå®ã«ããããããã¯ã¯ã¢ãã«ãã¢ã¯ã»ã¹ããã移è¡ãæ£åžžã«å®è¡ããããšãã«ã®ã¿å®è¡ãããŸãã
Has_many through
å¥ã®äžè¬çãªæ£è
ã¯
product.documents.collect(&:lines).flatten
ããã§ã¯ã補åã«ã¯å€ãã®è¡ãããå€ãã®ããã¥ã¡ã³ãããããŸãã 補åã«é¢é£ãããã¹ãŠã®ããã¥ã¡ã³ãã®ãã¹ãŠã®è¡ãååŸãããããšããããããŸãã ãããŠããã®å Žåãäžèšã®æ§é ãäœæããŸãã ãã®å Žåããªã¬ãŒã·ã§ã³ã®
ã¹ã«ãŒãªãã·ã§ã³ãåŒã³åºããŠã補åã«å¯ŸããŠä»¥äžãå®è¡ã§ããŸãã
has_many :lines, through: documents
ãããŠå®è¡ãã
product.lines
ããæ確ãã€å¹ççã«ãªããŸãã
JOINã«ã€ããŠå°ã
çµåã®ãããã¯ã®ç¶ãã§ã
ã€ã³ã¯ã«ãŒãã«ã€ããŠæãåºããŠãã ããã äœããããªã«ç¹å¥ãªã®ã§ããïŒ ã¯ããããã¯
LEFT JOINã§ãã ããªãé »ç¹ã«ãå·Š/å³çµåãæ瀺çã«èšè¿°ãããŠããããšãããããŸã
joins("LEFT OUTER JOIN wikis ON wiki_pages.wiki_id=wikis.id")
確ãã«æ©èœããŸãããRoRã®çŽç²ãªSQLã¯åžžã«å¥œãŸããŸããã
ãŸããã¬ãžããéžè±ããããšãªãã
çµåãšå€ãäžç·ã«äœ¿çšããå Žåã®å€ã®éããæãåºãå¿
èŠããããŸãã
usersããŒãã«ãããã
補åãªã©ã®ããŸããŸãªãšã³ãã£ãã£ã«
author_idãã£ãŒã«ããš
authorãªã¬ãŒã·ã§ã³ãããããã®äžã«
usersããŒãã«ããããšããŸãã
has_one :author, class: 'User', foreign_key: 'author_id'
ãã®ãããªå Žåã次ã®ã³ãŒãã¯æ©èœã
ãŸãã ã
products.joins(:author).where(author: {id: 42})
ãªãã§ïŒ
çµåã§ã¯ããªã¬ãŒã·ã§ãã«ã®ååã瀺ãããŸããããã¯joinimã§ãããããŒãã«ã«æ¡ä»¶ã課ããã
å Žæã§ããã where(users: {id: 42})
ããã¯ãçµåã§æ瀺çã«
ãAS authorããæå®ããããšã§åé¿ã§ããŸããããããçŽç²ãªSQLã§ãã
次ã«ãç°ãªãè§åºŠããçµåãèŠãŠãã ããã åå ãããã®ã¯äœã§ãããã¹ãŠãéå§ããã¯ã©ã¹ã®ãªããžã§ã¯ãã«ãªããŸãã
Product.joins(:documents, :files, :etc).first
ãã®å Žåãçµåã®æ°ã«é¢ä¿ãªã補åãååŸããŸãã 圌ãã¯çµåãããããŒãã«ãããã£ãŒã«ããåãåãããã®ã§ããã®æ¯ãèãã¯ããããåæºããŸãã ãããŠã圌ãã¯å察åŽããåãèŠæ±ããå§ããŸãïŒããã¥ã¡ã³ããåãåãããããã補åã«åå ãããä»ã®ãšã³ãã£ãã£ãšéä¿¡ããããã®çŽç²ãªSQLãæžããäžè¬ã«ãæ£ããè«çã³ãŒããæåã«æžããããšãã«èªè»¢è»ãçºæããŸãã ãããã£ãŠãç§ã¯ãŸãã«ãã®æ ¹æ ãæãåºããŸãïŒ
Product.joins(:documents, :files, :etc).where(...).pluck('documents.type')
ããã§ã¯ãããŒã¿ããŒã¹ããç®çã®ãã£ãŒã«ããæã€é
åãååŸããŸãã é·æïŒæå°éã®èŠæ±; ARãªããžã§ã¯ãã¯äœæãããŸããã çæïŒRails 3ã§ã¯ã
pluckã¯1ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ãåãå
¥ããŸãããããã§ã¯
pluck('documents.type', 'files.filename', 'files.path')
Rails 4ã§ã®ã¿å®è¡ã§ããŸãã
é¢ä¿ãæ§ç¯ãã
ãã
ã§ãé¢ä¿ã®
æ§ç¯ãæ±ãããšã®æ€èšã«ç§»ããŸãããã äžè¬ã«ããã¹ãŠã¯éåžžã«ç°¡åã§ãã
product.documencts.build(type: 'article', etc: 'etc').lines.build(content: '...')
product.saveãåŒã³åºããåŸããã¹ãŠã®é¢é£ä»ããæ€èšŒãèšå®ãé女ãšãšãã«ä¿åãããŸãã ãã®ãã¹ãŠã®æ¥œããã¢ã¯ã·ã§ã³ã«ã¯1ã€ã®æ³šæç¹ããããŸããããã¯ã
補åã èªã¿åãå°çšã§ãªãå Žåãããã³/ãŸãã¯ä»ã®ã¹ãã¬ãŒãžå¶éããªãå Žåã«ãã¹ãŠè¯å¥œã§ãã ãã®ãããªå Žåãå€ãã®äººã¯ãäžèšã®äŸã®
çµåãæã€åºã«äŒŒãåºãé
眮ããŸãã ã€ãŸãã
ããã¥ã¡ã³ããäœæããããã
補åã«ãã€ã³ãããŠãããã¥ã¡ã³ãã®è¡ãäœæããŸãã ããã©ã«ãã®åäœã¯æ²ãã£ãŠãããéåžžã¯ãšã©ãŒåŠçã«é¢ä¿ããŠããããšãããããŸããã
補åã¯åäœããŸããã ãããã£ãŠãä»å±è³æã§ã¯ãããã¯ãã¹ãŠæŸèæã§ããã«å²ãŸããééããæããŠãããªãåä»ãªãã®ã«ãªããŸãã ãã®å Žåã®å¯ŸåŠæ¹æ³
èªåä¿åã«ã€ããŠèŠããŠããããã©ã®ããã«æ©èœããããç解ããå¿
èŠããããŸãã 詳现ã«å
¥ãããšãªãã圌ã¯
ã³ãŒã«ããã¯ã«åãçµãã§ãããšèšã
ãŸã ã ãããã£ãŠãäžèšã®è£œåã®é¢ä¿ãä¿æããæ¹æ³ããããŸãã
product.autosave_associated_records_for_documents
ãã®å Žåãããã¥ã¡ã³ããä¿åããããã®ã³ãŒã«ããã¯ãåŒã³åºãããŠè¡ãä¿åãããŸãã
ã€ã³ããã¯ã¹ã«ã€ããŠäžèš
æåŸã«ãå€ãã®äººã¯ã€ã³ããã¯ã¹ã«åºã¥ããåé¡ã®ããã«åºäœãªããžã§ã¯ãã«é ãã¶ã€ãããããã€ã³ããã¯ã¹ã«ã€ããŠèšãå¿
èŠããããŸãã ActiveRecordãšããŒã¿ããŒã¹ã®æ©èœã®å€ãã劚害ããŠããã«è¬çœªããŸãããå人çãªæèŠãšããŠã¯ãããŒã¿ããŒã¹åŽã§ãã®ç¬éã«äœãèµ·ãã£ãŠããã®ããç解ããªããšARãããŸãåäœãããããšã¯ã§ããŸããã
åé¡1
äœããã®çç±ã§ãå€ãã®äººã¯ã
ãªã¬ãŒã·ã§ã³ã® é åºããœãŒãããåã«äŸåããªãããšã確信ããŠããŸãã ãã®èª€è§£ã®ããªãšãŒã·ã§ã³ã¯ã
é åºé¢ä¿ãš
é åºé
åã®éããç解ããŠããªãããšã§ãã ãã®ãããVARCHARãã£ãŒã«ãã®é åºãšç²Ÿç¥ã®è³ªåã§
default_scopeãæºããããšãã§ããŸãããããŒãžã®èªã¿èŸŒã¿ãé
ãã®ã¯ãªãã§ããïŒ ããã§ã¯ãããŒã¿ããŒã¹ããååŸãããã¬ã³ãŒãã¯ãããã§ãïŒâ ããã§ã®åé¡ã¯ããã®åã«ã€ã³ããã¯ã¹ããªãå Žåãããã©ã«ãã®ãœãŒããéåžžã«é«äŸ¡ã«ãªãããšã§ãã ããã©ã«ãã§ã¯ãARã¯
pkã§ãœãŒãããŸãã ç§ãã¡ããããšèµ·ãã
Products.first
ãã ãã
pkã«ã¯ã»ãŒåžžã«ã€ã³ããã¯ã¹ããããåé¡ã¯ãããŸããã ããããã¢ãã«ãžã®åŒã³åºãã§
é åºïŒïŒååïŒãã©ããªãããèšããšãåé¡ãå§ãŸããŸãã
åè ïŒãæã§ã説æãããšãã€ã³ããã¯ã¹ä»ãã®åã§äžŠã¹æ¿ããå Žåãå®éã®äžŠã¹æ¿ãã¯è¡ããããããŒã¿ããŒã¹ã«æ¢ã«ååšããããŒã¿ã¯ããã«æ£ããé åºã§éä¿¡ãããŸãã
第äºã®åé¡
è€åã€ã³ããã¯ã¹ã 誰ãããããã«ã€ããŠç¥ã£ãŠããããã§ã¯ãªããããã«å°ããªäººã
ã®èŒªããªã圌ããå¿
èŠãªã®ããç¥ã£ãŠããŸãã ã€ãŸããè€åã€ã³ããã¯ã¹ã¯ã2ã€ä»¥äžã®ããŒã¿ããŒã¹ãã£ãŒã«ãã«åºã¥ãã€ã³ããã¯ã¹ã§ãã ã©ãã§äŸ¿å©ã«ãªããŸããïŒ ããã䜿çšãã2ã€ã®äžè¬çãªå ŽæïŒ
- ããªã¢ãŒãã£ãã¯ãªé¢é£ä»ã
- æ«å®çãªå€å¯Ÿå€ã®é¢ä¿ããŒãã«ã
å€æ
çãªæ¥ç¶ã«ã€ããŠã¯ã
ããã§èª¬æã
ãŸãã ã å€ãã®å Žåãè€åã€ã³ããã¯ã¹ãäœæãããšäŸ¿å©ã§ãã 以äžã¯ã
off.manulaã®ãããã«æŽæ°ãããäŸ
ã§ã ã
class CreatePictures < ActiveRecord::Migration def change create_table :pictures do |t| t.string :name t.integer :imageable_id t.string :imageable_type t.timestamps end add_index :pictures, [:imageable_id, :imageable_type]
ããã«ãéåžžã®ã€ã³ããã¯ã¹ãšè€åã€ã³ããã¯ã¹ã®éãã«ã€ããŠã®
ããã€ãã®èšèããããŸãã ãã®ãããã¯ã¯å¥ã®ããã«é¢ãããã®ãªã®ã§ããã以äžè©³çŽ°ã«ã¯è§ŠããŸããã ããã«ã
ãã¹ãŠããã§ã«ç§ã®åã«æãããŠããŸããã
次ã«ãäžéãªã³ã¯ããŒãã«ã«ã€ããŠèª¬æããŸãã
ããç¥ãããŠãã
HBTM ã ããã§ãå Žåã«ãã£ãŠã¯ã
assembly_partsã«è€åã€ã³ããã¯ã¹ã
æçš¿ããããšãé©åã§ãïŒ
HBTMãªã³ã¯ãåç
§ïŒã ãã ããè€åã€ã³ããã¯ã¹ã®ãã£ãŒã«ãã®ã·ãŒã±ã³ã¹ã«ã¯ç¥èãããããšãèŠããŠããå¿
èŠããããŸãã 詳现ã¯
ãã¡ã ã
åé¡3
ãã€ã³ããã¯ã¹ã¯ã©ãã§ãå¿
èŠã§ãïŒã ããã¯ããã»ã©äžè¬çã§ã¯ãããŸãããããã¹ãŠã®äººã«ã²ã©ããã¬ãŒãããããŸãã ã€ã³ããã¯ã¹ã¯äžèœè¬ã§ã¯ãªããx10-x100ã®é床ãä¿èšŒãããã®ã§ã¯ãªããé©åãªå Žæã§äœ¿çšããé ã®äžã«æ¯ã£ãŠåç©Žã«æŒã蟌ãå¿
èŠã®ãªãããŒã«ã§ããããšãèŠããŠããå¿
èŠããããŸãã ããã§ãã€ã³ããã¯ã¹ã®çš®é¡ã«ã€ããŠèªãããšãã§ãã
ããã§ã€ã³ããã¯ã¹ãå¿
èŠãªçç±ãèŠã€ããããšãã§ããŸãã
ã·ã ãã¹ãŠã®ããã«
æåŸãŸã§èªãã§ãããŠããããšãã å
¥åãã¹ãäžæ£ç¢ºãªç¹ã«ã€ããŠã¯ãPMã«ãé£çµ¡ãã ãããä¿®æ£ãããŠããã ããŸãã ãŸããéçºäžã«ããŸããŸãªç¶æ³ã§èŠããŠããã¹ãããšã䜿çšããæ¹ãè¯ãããšã«ã€ããŠããçã¿ã䌎ããçµéšãçµéšãå
±æããŠããã ããã°å¹žãã§ãã