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.

Kaoru Hotate

May 30, 2019
Tweet

More Decks by Kaoru Hotate

Other Decks in Technology

Transcript

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

    !QVSVOLBPSV

    View Slide

  2. ࣗݾ঺հ

    อཱ ֜ ,BPSV)PUBUF

    !QVSVOLBPSV
    .FE1FFSͱ͍͏ձࣾʹ
    ۈ຿͍ͯ͠·͢
    3BJMTϝΠϯͰ
    ͨ·ʹ4XJGUΛॻ͍ͯ·͢

    View Slide

  3. ࠓ೔࿩͢͜ͱ

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

    View Slide

  4. JOEFY͕Ԛ͘ͳΓ΍͍͢Օॴ

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

    View Slide

  5. JOEFY͕Ԛ͘ͳΓ΍͍͢Օॴ

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

    View Slide

  6. ίʔυྫ

    View Slide

  7. ௥Ճ։ൃ

    Ωʔϫʔυݕࡧ͍ͨ͠
    ݴޠͰߜΓ͍ͨ

    View Slide

  8. ௥Ճ։ൃ

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

    View Slide

  9. ௥Ճ։ൃO

    View Slide

  10. 1030ʹ੾Γग़͢
    10301MBJO0ME3VCZ0CKFDU

    View Slide


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

    View Slide


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

    View Slide


  13. View Slide


  14. View Slide

  15. View Slide

  16. 1030ʹͨ͠ϝϦοτ

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

    View Slide

  17. JOEFY͕Ԛ͘ͳΓ΍͍͢Օॴ

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

    View Slide

  18. ίʔυྫ

    View Slide


  19. WJFX
    DPOUSPMMFS

    View Slide

  20. ݱঢ়ͷ໰୊఺

    Πϯελϯεม਺͕૿͑ɺ
    $POUSPMMFS͕গͪ͠͝Όͪ͝Ό͍ͯ͠Δ
    ʮϒΫϚࡁΈʯͷΑ͏ͳ߲໨͕૿͑Δͱਏ͍

    WJFXʹϩδοΫΛॻ͍͍ͯΔ
    ˣ͜Μͳײ͡Ͱ͔͖͍ͨ

    View Slide

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

    View Slide


  22. View Slide



  23. View Slide

  24. मਖ਼ޙͷ໰୊఺

    ৚݅ͷઃఆ࿙ΕͳͲͰόά͕ੜ·Ε΍͍͢
    7JFX͔ΒϩδοΫ͸ফ͕ͤͨɺ
    'BU$POUSPMMFS ·ͨ͸.PEFM
    ʹͳΓͦ͏ɻ
    ࣮૷ʹ΋͕͔͔࣌ؒΔ
    42-͋Γ͖ͷ࣮૷ͬͯɻɻɻ

    View Slide

  25. JOEFY͕Ԛ͘ͳΓ΍͍͢Օॴ

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

    View Slide


  26. View Slide

  27. ໰୊఺

    Πϯελϯεม਺͕৭ʑͳϝιουͰఆٛ͞Εɺ
    ॲཧΛ௥͍ͮΒ͍
    Πϯελϯεม਺Λ΋ͱʹɺ
    ผͷΠϯελϯεม਺Λఆٛ͢Δ͜ͱ΋͋Δ
    [email protected]ϝιουͷॱ൪Λม͑Δͱ
    ಈ͔ͳ͍͜ͱ΋͋Δ
    Πϯελϯεม਺ಉ࢜ͷ໊લিಥ͕ى͖Δ͜ͱ΋͋Δ
    Ұ෦ͷॲཧΛมߋ͍͚ͨͩ͠Ͱ΋ɺ
    શ෦ͷίʔυΛಡΉඞཁ͕͋Δ

    View Slide


  28. View Slide

  29. վળ݁Ռ

    Πϯελϯεม਺͕৭ʑͳϝιουͰఆٛ͞Εɺ
    ॲཧΛ௥͍ͮΒ͍
    Πϯελϯεม਺ΛJOEFYΞΫγϣϯͷΈͰఆٛͰ
    ͖ΔͱϧʔϧΛ͚ͭΕ͹ղܾ
    Πϯελϯεม਺ಉ࢜ͷ໊લিಥ͕ى͖Δ͜ͱ΋͋Δ
    [email protected]<DBUFHPSJFT>ͷΑ͏ʹݺͼग़ͤΔ
    ͷͰɺ
    ໊લিಥ͸๷͛Δ

    View Slide

  30. վળ݁Ռ

    Πϯελϯεม਺Λ΋ͱʹɺ
    ผͷΠϯελϯεม਺Λఆٛ͢Δ͜ͱ΋͋Δ
    ͦͷͨΊɺ[email protected]ϝιουͷॱ൪Λม͑Δͱ
    ಈ͔ͳ͍͜ͱ΋͋Δ
    ະղܾ

    View Slide


  31. View Slide

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

    View Slide


  33. View Slide

  34. վળ݁Ռ

    Πϯελϯεม਺Λ΋ͱʹɺ
    ผͷΠϯελϯεม਺Λఆٛ͢Δ͜ͱ΋͋Δ
    ͦͷͨΊɺ[email protected]ϝιουͷॱ൪Λม͑Δͱ
    ಈ͔ͳ͍͜ͱ΋͋Δ
    Πϯελϯεม਺Ͱ͸ͳ͘ɺޓ͍ͷϝιουΛ
    ݺͼग़͢͜ͱͰղܾ

    View Slide

  35. ·ͱΊ

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

    View Slide