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

一覧画面のFatController/Modelになる理由と向き合ってみた

 一覧画面のFatController/Modelになる理由と向き合ってみた

I consider why controller and model get fat on Ruby on Rails index action.
And I implement the result of three solutions.

4edb44c4292fa5bd1cbe463d0e80ecbd?s=128

Kaoru Hotate

May 30, 2019
Tweet

Transcript

  1. Ұཡը໘Ͱ 'BU$POUSPMMFS 'BU.PEFMʹͳΔཧ༝ͱ ޲͖߹ͬͯΈͨ อཱ ֜ ,BPSV )PUBUF !QVSVOLBPSV

  2. ࣗݾ঺հ  อཱ ֜ ,BPSV)PUBUF !QVSVOLBPSV .FE1FFSͱ͍͏ձࣾʹ ۈ຿͍ͯ͠·͢ 3BJMTϝΠϯͰ ͨ·ʹ4XJGUΛॻ͍ͯ·͢

  3. ࠓ೔࿩͢͜ͱ  Ұཡը໘ͷॲཧ͸ɺ ͍͍ͩͨಉ͡Α͏ͳ಺༰Λॻ͘ͷʹɺ ͪ͝Όͪ͝Ό͢Δ͜ͱ͕ଟ͍ Ұཡը໘͸ɺ࡞੒ɾߋ৽ͳͲͷॲཧʹൺ΂ͯ ςετ͕ް͔͔͘Εͳ͍έʔε͕ଟ͍ͷͰɺ ௥Ճ։ൃΛ͠΍͍͢ίʔυΛॻ͍ͯɺ কདྷόά͕ग़ͳ͍Α͏ʹ͍ͨ͠ ͱ͍͏͜ͱͰɺߟ͑ͨ࿩Λ͠·͢

  4. JOEFY͕Ԛ͘ͳΓ΍͍͢Օॴ   ϦΫΤετʹԠͯ͡ ϑΟϧλϦϯάɾιʔτΛ͔͚Δ  %#ʹଘࡏ͠ͳ͍ΧϥϜΛදࣔ͢Δ  Πϯελϯεม਺͕ଟ͘ͳΔ

  5. JOEFY͕Ԛ͘ͳΓ΍͍͢Օॴ   ϦΫΤετʹԠͯ͡ ϑΟϧλϦϯάɾιʔτΛ͔͚Δ  %#ʹଘࡏ͠ͳ͍ΧϥϜΛදࣔ͢Δ  Πϯελϯεม਺͕ଟ͘ͳΔ

  6. ίʔυྫ 

  7. ௥Ճ։ൃ   Ωʔϫʔυݕࡧ͍ͨ͠  ݴޠͰߜΓ͍ͨ

  8. ௥Ճ։ൃ   ιʔτ৚݅Λը໘্͔Βબ୒͍ͨ͠  ঢॱɾ߱ॱ΋ը໘্Ͱબ୒͍ͨ͠ ˞PSEFSΛTDPQFͰ͸ͳ͘ϝιουͰఆٛ͢Δ৔߹͸ɺ $POUSPMMFSʹQSJWBUFϝιου࡞Δ͔.PEFMʹΫϥεϝιου࡞Δ͔ ͲͪΒʹ͠Ζ͠ΜͲ͍ɻɻɻ

  9. ௥Ճ։ൃO 

  10. 1030ʹ੾Γग़͢ 10301MBJO0ME3VCZ0CKFDU

  11.  app/models 配下に、 ApplicationRecordを継承しないクラスを定義 呼び出される場所 or ⽤途::model名にすること が多いです。 Api::Article(APIで使う)とか Admin::Article(管理画⾯から使う)とか

  12.  1. フィルタリングを⾏うfinder ソートを⾏うsorterを別クラスに定義する 2. Finderとsorterを それぞれ呼び出す

  13. 

  14. 

  15. None
  16. 1030ʹͨ͠ϝϦοτ   ੹຿ຖʹDMBTT͕෼͔Ε͍ͯͯɺ͋ͱ͔Βݟͨࡍʹ ίʔυΛ௥͍΍͍͢ɻςετ΋ॻ͖΍͍͢  ୭Ͱ΋ಉ͡Α͏ʹॲཧΛॻ͘͜ͱ͕Ͱ͖ΔͷͰɺ มͳίʔυ͕ੜ·ΕͮΒ͍  'BU$POUSPMMFSɺ'BU.PEFMʹͳΓͮΒ͍

  17. JOEFY͕Ԛ͘ͳΓ΍͍͢Օॴ   ϦΫΤετʹԠͯ͡ ϑΟϧλϦϯάɾιʔτΛ͔͚Δ  %#ʹଘࡏ͠ͳ͍ΧϥϜΛදࣔ͢Δ  Πϯελϯεม਺͕ଟ͘ͳΔ

  18. ίʔυྫ 

  19.  WJFX DPOUSPMMFS

  20. ݱঢ়ͷ໰୊఺   Πϯελϯεม਺͕૿͑ɺ $POUSPMMFS͕গͪ͠͝Όͪ͝Ό͍ͯ͠Δ ʮϒΫϚࡁΈʯͷΑ͏ͳ߲໨͕૿͑Δͱਏ͍  WJFXʹϩδοΫΛॻ͍͍ͯΔ ˣ͜Μͳײ͡Ͱ͔͖͍ͨ

  21. ੜ42-Ͱઃఆ͢Δ 42-4VHPJ 2VFSZ-BOHVBHF

  22. 

  23. 

  24. मਖ਼ޙͷ໰୊఺   ৚݅ͷઃఆ࿙ΕͳͲͰόά͕ੜ·Ε΍͍͢  7JFX͔ΒϩδοΫ͸ফ͕ͤͨɺ 'BU$POUSPMMFS ·ͨ͸.PEFM ʹͳΓͦ͏ɻ 

    ࣮૷ʹ΋͕͔͔࣌ؒΔ  42-͋Γ͖ͷ࣮૷ͬͯɻɻɻ
  25. JOEFY͕Ԛ͘ͳΓ΍͍͢Օॴ   ϦΫΤετʹԠͯ͡ ϑΟϧλϦϯάɾιʔτΛ͔͚Δ  %#ʹଘࡏ͠ͳ͍ΧϥϜΛදࣔ͢Δ  Πϯελϯεม਺͕ଟ͘ͳΔ

  26. 

  27. ໰୊఺   Πϯελϯεม਺͕৭ʑͳϝιουͰఆٛ͞Εɺ ॲཧΛ௥͍ͮΒ͍  Πϯελϯεม਺Λ΋ͱʹɺ ผͷΠϯελϯεม਺Λఆٛ͢Δ͜ͱ΋͋Δ  QSFQBSF@IPHFϝιουͷॱ൪Λม͑Δͱ

    ಈ͔ͳ͍͜ͱ΋͋Δ  Πϯελϯεม਺ಉ࢜ͷ໊લিಥ͕ى͖Δ͜ͱ΋͋Δ Ұ෦ͷॲཧΛมߋ͍͚ͨͩ͠Ͱ΋ɺ શ෦ͷίʔυΛಡΉඞཁ͕͋Δ
  28. 

  29. վળ݁Ռ   Πϯελϯεม਺͕৭ʑͳϝιουͰఆٛ͞Εɺ ॲཧΛ௥͍ͮΒ͍ Πϯελϯεม਺ΛJOEFYΞΫγϣϯͷΈͰఆٛͰ ͖ΔͱϧʔϧΛ͚ͭΕ͹ղܾ  Πϯελϯεม਺ಉ࢜ͷ໊લিಥ͕ى͖Δ͜ͱ΋͋Δ !GJMUFSJOH@JUFNT<DBUFHPSJFT>ͷΑ͏ʹݺͼग़ͤΔ

    ͷͰɺ ໊લিಥ͸๷͛Δ
  30. վળ݁Ռ   Πϯελϯεม਺Λ΋ͱʹɺ ผͷΠϯελϯεม਺Λఆٛ͢Δ͜ͱ΋͋Δ ͦͷͨΊɺQSFQBSF@IPHFϝιουͷॱ൪Λม͑Δͱ ಈ͔ͳ͍͜ͱ΋͋Δ ະղܾ

  31. 

  32. 7JFX.PEFMͰ ఆٛ͢Δ 7JFX.PEFM7JFXʹ౉͍ͨ͠ม਺Λ·ͱΊͨ0CKFDU

  33. 

  34. վળ݁Ռ   Πϯελϯεม਺Λ΋ͱʹɺ ผͷΠϯελϯεม਺Λఆٛ͢Δ͜ͱ΋͋Δ ͦͷͨΊɺQSFQBSF@IPHFϝιουͷॱ൪Λม͑Δͱ ಈ͔ͳ͍͜ͱ΋͋Δ Πϯελϯεม਺Ͱ͸ͳ͘ɺޓ͍ͷϝιουΛ ݺͼग़͢͜ͱͰղܾ

  35. ·ͱΊ   ࣮૷͕Θ͔ΓͮΒ͍ݪҼ͕Ͳ͜ʹ͋Δ͔ΛΈͯɺ ͦͷݪҼʹର͍͔ͯͭ͘͠ͷमਖ਼ύλʔϯΛ஌͓ͬͯ ͘ͱɺׂͱ؆୯ʹϦϑΝΫλϦϯά͕Ͱ͖Δɻ  1030΋ɺ42-΋ɺ7JFX.PEFM΋ɺશͯͷ࣮૷ʹର ࣮ͯ͠ࢪ͢Δͱݴ͏ΑΓ΋ɺ࢖͍Ͳ͜ΖΛҙࣝͯ͠࢖ ༻͢Δͱ͍͍ίʔυʹͳΔ