ೖ ໊લRails Developer Meetup 2019 ౻ଜେհ
View Slide
ࣗݾհ• ౻ଜେհ• גࣜձࣾϚνϚν• Rails ྺ 10 • https://twitter.com/ffu_• https://github.com/fujimura
͜ͷൃදʹ͍ͭͯ• ౻ଜ໊લʹͩ͜ΘΓ͕͋Δ• ໊લʹ͍ͭͯͷৄ͍͠આ໌͕ͳ͍ͱৗʑࢥ͍ͬͯͨ• Rails͚ͩͲɺ໊લେࣄͩ͠ɺͦΖͦΖߟ͑Λ·ͱΊ͍ͨͳͱࢥͬͨ• ͪͳΈʹ WEB+DB Press Ͱ໊લʹ͍ͭͯͷهࣄΛॻ͍͍ͯΔ
໊લͱ• ϓϩάϥϚʔ໊લΛຖ͍ͬͯΔ• ॏཁͳ͜ͱΘ͔͍ͬͯΔ• ͚Ͳɺ໊ͦͦલͬͯԿʁඞཁͳͷʁͳΜͰॏཁͳͷʁྑ໊͍લͷج४ʁ• ࣮Α͘Θ͔Βͳ͍
͓͠ͳ͕͖• ໊લศར• ໊લͷΈ• ͳ໊ͥલॏཁͳͷ͔• ྑ໊͍લͱ• ࣮ ѱ໊͍લ
໊લศར• ·໊ͣલ͕͍͔ʹศརͳπʔϧͰ͋Δ͔Λ֬ೝ͠·͢
໊લΛΘͣʹϓϩάϥϜΛॻ͍ͯΈΑ͏• ໊લͳ͠ͰϓϩάϥϜॻ͚Δ• Lazy K ͱ͍͏ϓϩάϥϛϯάݴޠͰૉΛੜ͢ΔίʔυʢͷҰ෦ʣ• ͭΒ͍ʂ(SII(S(K(S(S(K(SII(S(S(KS)(S(K(S(KS)))(S(K(S(S(KS)(SS(S(S(KS)K))(KK)))))(S(S(KS)(S(KK)(S(KS)(S(S(KS)(S(KK)(S(KS)(S(S(KS)(S(KK)(SII)))(K(SI(KK)))))))(K(S(K(S(S(KS)(S(K(SI))(S(KK)(S(K(S(S(KS)K)(S(S(KS)K)I)...
໊લΛͬͯϓϩάϥϜΛॻ͍ͯΈΑ͏• Ruby ͱ͍͏ϓϩάϥϛϯάݴޠͰૉΛੜ͢Δίʔυ• ಡΊΔʂ• ཧղͰ͖Δʂrequire 'prime'Prime.each
ͦͦɺͳΜͷͨΊʹ໊લΛ͚ͭΔͷ• ୯ʹศར͔ͩΒɺΑΓਂ͍త͕͋Δ• ໊લͷҙຯΛ͔ͭͬͯɺࡉ෦Λཧղͤͣ࠶ར༻͢ΔͨΊ• ࠷ऴతʹɺੜ࢈ੑͷͨΊ
࠶ར༻ʹΑΔੜ࢈ੑͷ্ʮٕज़ʯͷࠜװ• զʑͳͥ Ruby on Rails ͕ಈ͘ͷ͔Βͳ͍͚Ͳ͑Δ• RailsɺMRIɺσʔλϕʔεɺͦͷଞϛυϧΣΞɺCPU…• ࡉ෦Λཧղͤͣʹ࠶ར༻Ͱ͖Δ͜ͱ͕ٕज़ͷఆٛͷͻͱͭ• ͜ΕͰਓྨͷੜ࢈ੑ্͕͖ͬͯͨ• ৠؾػؔɺిؾɺίϯϐϡʔλʔ• ϓϩάϥϜͦͷҰͭ
໊લศར ·ͱΊ• ໊લ͕͋Δͱɺ࣮Λಡ·ͳͯ͘ϓϩάϥϜΛ࠶ར༻Ͱ͖Δ• ࠶ར༻Ͱ͖Δͱɺੜ࢈ੑ্͕͕Δ• ศརͲ͜ΖͰͳׂ͍ΛՌ͍ͨͯ͠Δ
໊લͷ͘͠Έ• ໊લ͕͍͔ʹϓϩάϥϛϯάͱ͍͏ٕज़ʹͱͬͯॏཁͳπʔϧͰ͋Δ͔Θ͔Γ·ͨ͠• ࠓ໊લͷΈΛ֬ೝ͠·͢
໊લͬͯͳʹ• Կ͔ʹ͍ͭͨϥϕϧͷ͜ͱΓΜ͝
໊લͷҙຯͬͯͳʹ• ϥϕϧ͕ରΛʮࢦࣔʯ͍ͯ͠Δ͜ͱ• ʮΓΜ͝ʯͬͯݴ༿ͷҙຯʁΓΜ͝ͷ͜ͱͰ͠ΐɺͱ͍͏ͷΛ͘͠ݴͬͨܗΓΜ͝
ϓϩάϥϜʹ͓͚Δ໊લͬͯͳʹ• ॲཧʹ͍ͭͨϥϕϧͷ͜ͱ• ϝιουͷྫfind_or_initialze_bymodel = Model.find(params[:id])unless modelModel.new(paramsend
ϓϩάϥϜʹ͓͚Δ໊લͷҙຯͬͯͳʹ• ͦͷݴ༿͕ࢦࣔ͢͠ରʁ• ڍಈʁ• ͳΜ͔ײతʹҧ͍ͦ͏• ֬ೝ͠·͢
ରΛࢦࣔ͢Δ͜ͱͩͬͨΒ• ʮ౻ଜେհʯͷҙຯɺ͜͜Ͱ͍ͬͯΔਓؒɺͱͳΔ• ʮΓΜ͝ʯͷҙຯɺੈքʹଘࡏ͢ΔΓΜ͝ͷશͯɺͱͳΔ• ※ ͜͜ΒΜͰࢦࣔઆʹແཧ͕͋Δ͜ͱ͕Θ͔ΔɻখઆͷதͷΓΜ͝ͱ͔• find_or_initialize_by ͷରԿͳΜͩʁ• ͏·͍͔͘ͳͦ͏
ڍಈͩͬͨΒ• ActiveRecord::Relation#find_or_initialize_by params Λड͚औͬͯΫΤϦΛΈཱͯͯϨίʔυΛ୳ͯ͠…ɻ• ͜Εڍಈɻ͋ΔछϓϩάϥϜʢ࣮ʣͷҙຯͱ͍͑ͦ͏Ͱ͋Δ͕ɺͦΕʹ͚ͨϥϕϧͱͯ͠ͷ໊લͷҙຯͰͳ͍• ͜Εͩͱத͕Θ͔Δ͜ͱ͕ҙຯ͕Θ͔Δ͜ͱʹͳͬͯ͠·͏• ͏·͍͔͘ͳͦ͏
ײతʹΘ͔͍ͬͯΔ• ࢦࣔͩΊɺڍಈͩΊ• ͔͠͠զʑActiveRecord::Relation#find_or_initialize_byͱ͍͏ϝιου໊ͷҙຯ͕Θ͔Δ• ʮݟ͚ͭΔ͔ɺͳ͔ͬͨΒ࡞Δʯ• ײతʹ͜͏͍͏ʮৼΔ͍ͷઆ໌ʯ͕ҙຯͰ͋Δɺͱࢥ͍ͬͯΔͷͰ• ※ ͍͑ͯΕΦοέʔɺͱ͍͏ʮҙຯͷ༻આʯ͕ϕʔε
ϓϩάϥϜʹ͓͚Δ໊લͷҙຯ = ৼΔ͍ͷઆ໌• find_or_initialize_by ͷҙຯʮݟ͚ͭΔ͔ɺͳ͔ͬͨΒ࡞Δʯ• ҙຯ = ৼΔ͍ͷઆ໌• ͬ͘͠Γ͘Δʂ
໊લͷ͘͠Έ ·ͱΊ• ϓϩάϥϜʹ͓͍ͯɺ• ໊લॲཧʹ͍ͭͨϥϕϧ• ໊લͷҙຯɺৼΔ͍ͷઆ໌
ͳΜͰ໊લॏཁͳͷ• ໊લ͕ศརͳͷΘ͔Γ·ͨ͠• ΈΘ͔͖ͬͯͨ• Ͱɺ໊લ͕ʮѱ͍ʯͱԿ͕ى͜Δͷʁઆ໌͠·͢
ѱ໊͍લͰى͖Δ͜ͱ• ཧղͷίετ͕ߴ͍• צҧ͍Ͱόά͕ൃੜ͢Δ• => ੜ࢈ੑ͕Լ͕Δ• ςΫϊϩδʔͷత࠶ར༻ʹΑΔੜ࢈ੑͷ্ɻͦΕΛѱ໊͍લ͛Δ• ʮΑ͍ʯ໊લॏཁ
͡Ό͋ɺԿ͕Α໊͍લͳͷ• ʰίʔυɾίϯϓϦʔτʱͰௐͯΈ·ͨ͠• ʮ໋໊ʹ͓͍ͯ࠷ॏཁͳߟྀ͖͢ɺม͕දݱ͢ΔͷΛਖ਼֬ʹશʹݴ͍ද͍ͯ͠Δ͜ͱʯ• McConnell, Steve. Code Complete (Kindle Location 6490). MicrosoftPress. Kindle Edition) ༁ஶऀ• ʮਖ਼֬ʯͰʮશʯͳ໊લͬͯͲ͏͍͏ঢ়ଶͰ͔͢ʁ => ॻ͍ͯͳ͍• Կ͕ྑ໊͍લͳͷ͔ॻ͍ͯͳ͍ͷͰɺߟ͑ͯΈ·ͨ͠
Α໊͍લ = ໊લͷҙຯͱ࣮ࡍͷڍಈ͕߹͍ͬͯΔͷ• ཁɺݴ͍ͬͯΔ͜ͱͱ͍ͬͯΔ͜ͱ͕Ұக͍ͯ͠Δ໊લ• ͦΓΌͦ͏ͩΑͶɺͱ͍͏ఆٛͳΜͰ͕͢ɺࡉ͔͘ཧղ͢ΔՁ͕͋Δ• ৄ͘͠આ໌͠·͢
໊લͷҙຯͱڍಈ͕߹͍ͬͯͳ͍ͱ• ໊લͷҙຯ͕ڍಈʹରͯ͠ڱ͗͢Δ• ݴ͍ͬͯΔ͜ͱΛ͍ͬͯͳ͍• ໊લͷҙຯ͕ڍಈʹରͯ͗͢͠Δ• ͍ͬͯΔ͜ͱΛݴ͍ͬͯͳ͍• ͷ͍ͣΕ͔
ύλʔϯ 1: ໊લͷҙຯ͕ڱ͗͢Δ• ʮެ։Λ࠶ઃఆʯͬͯҙຯͳͷʹɺ࣌ࠁΛ࠶ઃఆͰ͖ͯ͠·͏• ͬͯΔ͜ͱ໊͕લͷΘΓʹ͍class Articledef reset_publish_date(date)update!(publish_at: date)endend
ύλʔϯ 2: ໊લͷҙຯ͕͗͢Δ• check ͨ݁͠ՌͲ͏ͳΔͷʁ• login ͍ͯ͠Δͷ͕ਖ਼ʁ͍ͯ͠ͳ͍ͷ͕ਖ਼ʁ• ໊લ͔ΒΘ͔Βͳ͍• check ͷҙຯ͕͗͢Δͷ͕ݪҼbefore_action :check_loginprivate def check_loginunless current_userredirect_to login_pathend; end
Α໊͍લͷ͏Ұͭͷج४ γϯϓϧ͞• ࠷ίϯύΫτͰత֬ͳදݱΛ͏͠• ੈͷதʹ employee ͱ͍͏ݴ༿͕͋Δdef person_who_is_hired_by_companydef empolyee
͜͜·Ͱͷ·ͱΊ• Α໊͍લ = ໊લͷҙຯͱ࣮ࡍͷڍಈ͕߹͍ͬͯΔɺγϯϓϧͳ໊લ• ͗ͨ͢Γڱ͗ͨ͢Γ͢Δͱѱ໊͍લʹͳΔ
࣮ ѱ໊͍લ• ۩ମྫΛ͓ಧ͚͠·͢
User#check_paidclass Userdef check_paid# ...endend
User#check_paid ͱ͍͏໊લ͔Βߟ͑ΒΕΔڍಈ• ࢧ͍͕ࡁΜ͔ͩΛ Boolean Ͱฦ͢• ࢧ͍͕ࡁΜͰ͍ͳ͍߹Ϣʔβʔʹ self.errors ΛՃ͢Δ• ࢧ͍͕ࡁΜͰ͍ͳ͍߹ྫ֎Λు͘• check ͷҙຯ͕͗ͯ͢ɺͲΕ͔Θ͔Βͳ͍
User#check_paid ղମ• ͦΕͧΕԼهͷ༷ʹ࣮͞Ε͍ͯΕɺΉ͜ͱͳ͍ͣ• check Λ͏ͷΛΊΔ͚ͩͰ໊લ͕ྑ͘ͳΓ·͢class User# ࢧ͍͕ࡁΜ͔ͩΛ Boolean Ͱฦ͢def paid?# ...end# ࢧ͍͕ࡁΜͰ͍ͳ͍߹ϢʔβʔʹΤϥʔใΛՃ͢Δdef add_error_if_not_paid# ...endend
Notification#user (1)• ௨Λड৴͢ΔϢʔβʔͷ໊લΛ'user'ͱͨ͠class Notificationbelongs_to :userend
Notification#user (2)• ʮ͕ࣗૹͬͨ௨Λফ͢ʯͨΊʹɺԼهͷΑ͏ͳίʔυΛॻ͍ͨ• Notification#user ͕ड৴ऀͳͷ͔ૹ৴ऀͳͷ͔ɺ໊લ͔ΒΘ͔Βͳ͍sent_notifications = Notification.where(user: current_user)# user = ड৴ͨ͠ਓͳͷͰɺࣗͷ௨͕ফ͑Δsent_notifications.delete_all
Notification#user (3)• 'recipient'ͱ͓͚ͯ͠ɺ໊લ͔Βड৴ऀͰ͋Δ͜ͱ͕Θ͔ΔͷͰɺ͜ͷΑ͏ͳࣄނى͖ͳ͍• ໘ͰׂʹԠ໊ͨ͡લΛ͚ͭΔΑ͏ʹ͠·͠ΐ͏# ໊લ͔Β໌Β͔ʹมsent_notifications = Notification.where(recipient: current_user)
༨ஊ• ͔͜͜Β໊લʹ·ͭΘΔ༨ஊͰ͢
UserRegistrationService ͷ’Service'ͬͯඞཁʁUserRegistrationService.new.perform!UserRegistration.new.perform! # Service͍Βͳ͘ͳ͍ʁ
໊લͷωλݩ• schema.org• Google, Microsoft, Yahoo, Yandex ͕࡞ͬͨΠϯλʔωοτ༻ͷޠኮू• ςʔϒϧઃܭΜͩ࣌͜͜ΛݟΕ݁ߏࡌ͍ͬͯΔ
ࣙॻ.app• ໊લͷͨΊʹ࠷ॏཁͳπʔϧࣙॻ• Mac OS X ͷ ࣙॻ.app ਆ• ͳΜͱӳӳࣙయɺྨޠࣙయɺӳࣙయɺӳࣙయ͕ɺશ෦ແྉͰೖ͍ͬͯΔ• ʮڥઃఆʯ͔ΒՃͰ͖ΔͷͰɺ·ͩͷํ͍·͙͢Ճ͠Α͏