Slide 1

Slide 1 text

RailsͰ ϞσϧͷεςʔλεΛѻ͏ ϕλʔϓϥΫςΟε

Slide 2

Slide 2 text

ࢲ(@ngmt83)ʹ͍ͭͯ • ट౎ݍ͕ۤख͗͢Δ΍΂ʔ΍ͭ • ϑϧελοΫΤϯδχΞ(༧ఆ) <- twitter portfolio ->

Slide 3

Slide 3 text

͍͖ͳΓͰ͕͢ Ϟσϧͷεςʔλε Ͱࠔͬͨ͜ͱ͋Γ·ͤΜ͔ʁ ͋Γ·͢ΑͶʁ

Slide 4

Slide 4 text

ྫ • SNSͷΞΧ΢ϯτ ༑ୡ, ༑ୡਃ੥த, ༑ୡղআࡁ, ϛϡʔτ, ϒϩοΫ • ఆ੍ֹαʔϏεͷϓϥϯ Free, Basic, Pro, ٳࢭத, ΞΧ΢ϯτ࡟আ, ͓ࢼ͠༻ϓϥϯ • ܾࡁ ϦΫΤετத, ঝೝࡁ, ࢧ෷͍଴ͪ, ܾࡁࣦഊ, Ωϟϯηϧࡁ, ෦෼ฦۚ

Slide 5

Slide 5 text

ࠔͬͨྫ • DBΛݟͯ΋ͲΜͳঢ়ଶ͔ͺͬͱΘ͔Γʹ͍͘ɺ෼ੳͮ͠Β͍ • ಛఆϝϯόʔ͔͠εςʔλε൑ఆ͕Ͱ͖ͳ͍ • ฉ͍ͨ͜ͱͷͳ͍εςʔλε͕ੜ·Ε͍ͯΔ • ໓ଟʹ࢖༻͞Εͳ͍εςʔλε͕࢒͍ͬͯΔ • ഉଞతͳ͸ͣͷεςʔλεཱ͕྆͢Δ • εςʔλε൑ఆͷͨΊʹύϑΥʔϚϯε͕མͪΔ • etc

Slide 6

Slide 6 text

ݪҼ • εςʔλεʹؔ͢Δઃܭڞ༗ෆ଍ or ߋ৽࿙Ε • εςʔλεछྨͷ૿Խɺεςʔλεؔ࿈৚݅ͷෳࡶԽ - ૝ఆ֎ͷεςʔλε - ͦͷ৔͠ͷ͗తʹ҆қʹ૿΍ͨ͠εςʔλε - εςʔλεA->B͸ભҠՄೳ͕ͩɺA->C͸ભҠͰ͖ͳ͍ - Ϟσϧx͕ଘࡏ͠ɺϞσϧy͕ଘࡏ͠ͳ͍৔߹͸εςʔλεD • ࠷ॳظʹա౓ʹॊೈੑΛ࣋ͬͨઃܭΛ͢Δ

Slide 7

Slide 7 text

݁࿦͔Β

Slide 8

Slide 8 text

ΠϯΫϦϝϯλϧʹվળ͠Α͏ 0. ঢ়ଶભҠਤΛॻ͘ 1. ਖ਼نԽ͞ΕͨDB͔Βεςʔλε৘ใΛಡΈ औΔ(εςʔλε৘ใΛӬଓԽ͠ͳ͍) 2. εςʔλε৘ใΛDB্ʹӬଓԽ͢Δ

Slide 9

Slide 9 text

ྫ • SNSͷΞΧ΢ϯτ(UserϞσϧ)ʹ͍ͭͯߟ͑Δ • ొ࿥ɺਖ਼ࣜొ࿥ɺୀձɺBAN͕͋Δ

Slide 10

Slide 10 text

ঢ়ଶભҠਤ State Machine Diagram Λॻ͘

Slide 11

Slide 11 text

ঢ়ଶભҠਤΛॻ͘

Slide 12

Slide 12 text

PlantUMLͩͱϨϏϡ͠΍͍͢ @startuml{super-simple-state- machine.png} title Userঢ়ଶભҠਤ0 [*] --> registered : ొ࿥͢Δ registered --> active : ਖ਼ࣜʹొ ࿥͢Δ active --> banned : BAN͞ΕΔ active --> Inactive : ୀձ͢Δ @enduml .puml

Slide 13

Slide 13 text

ਖ਼نԽ͞ΕͨDB͔Βεςʔλ ε৘ใΛಡΈऔΔ

Slide 14

Slide 14 text

Ϋϥεਤ (schema.rb͔Βࣗಈੜ੒΋Ͱ͖·͢) ※ΠϕϯτܥΤϯςΟςΟΛ࿙Β͞ͳ͍

Slide 15

Slide 15 text

User.rb class User < ApplicationRecord has_one :activation, class_name: 'UserActivation' has_one :deactivation, class_name: 'UserDeactivation' has_one :ban, class_name: 'UserBan' def status return 'active' if active? return 'banned' if banned? return 'inactive' if inactive? return 'registered' end def registered? return false if banned? || inactive? || active? true end def active? return false if banned? || inactive? return false unless activation.present? true end def banned? ban.present? end def inactive? deactivation.present? end def activate! raise StandardError unless registered? create_activation! end def ban! raise StandardError unless active? create_ban! end def deactivate! raise StandardError unless active? create_deactivation! end end user.rb user.rbଓ͖

Slide 16

Slide 16 text

ΞΧ΢ϯτౚ݁ػೳ Λ ௥Ճ࣮૷͍ͨ͠ ͔͠͠ εςʔλε͕ෳࡶԽɾɾɾ

Slide 17

Slide 17 text

εςʔλε৘ใΛ DB্ʹӬଓԽ͢Δ

Slide 18

Slide 18 text

Ϋϥεਤ (ΞϓϦ͔Βࣗಈੜ੒΋Ͱ͖·͢)

Slide 19

Slide 19 text

ঢ়ଶભҠਤΛߋ৽ @startuml{state.png} title Userঢ়ଶભҠਤ [*] --> registered registered --> active : ਖ਼ࣜʹొ࿥͢Δ active --> suspended : ౚ݁͞ΕΔ suspended --> active : ౚ݁ղআ͞ΕΔ suspended --> banned : BAN͞ΕΔ suspended --> Inactive : ୀձ͢Δ active --> banned : BAN͞ΕΔ active --> Inactive : ୀձ͢Δ @enduml puml

Slide 20

Slide 20 text

ঢ়ଶભҠਤΛߋ৽

Slide 21

Slide 21 text

ෳࡶͳঢ়ଶભҠʹ͸ AASM ͱ͍͏gemΛ͓͢͢Ί͠·͢

Slide 22

Slide 22 text

AASMʹΑΔঢ়ଶભҠ aasm do state :registered, :initial => true state :active, :suspended, :banned, :inactive event :activate do transitions from: :registered, to: :active end event :suspend do transitions from: :active, to: :suspended end event :unsuspend do transitions from: :suspended, to: :active end event :ban do transitions from: [:active, :suspended], to: :banned end event :deactivate do transitions from: [:active, :suspended], to: :inactive end end user.rb಺ͷaasm࣮૷෦෼(؆қίʔυ)

Slide 23

Slide 23 text

AASMʹෳࡶͳঢ়ଶભҠ has_many :suspensions, class_name: 'UserSuspension' has_one :active_suspension, lambda { where(removed_at: nil) }, class_name: ‘UserSuspension' aasm do … event :suspend do transitions from: :active, to: :suspended, guard: :without_active_suspension? after do suspensions.create! end end … end def without_active_suspension? return false if active_suspension true end user.rbͷౚ࣮݁૷෦෼

Slide 24

Slide 24 text

ऄ଍ • ਖ਼نԽͤͣʹΰϦԡ͢ύλʔϯ΋͋Δ

Slide 25

Slide 25 text

·ͱΊ • εςʔλε؅ཧ͸ΠϯΫϦϝϯλϧʹվળ͠Α͏ - ʮεςʔλεʹؔ͢Δઃܭڞ༗ෆ଍ or ߋ৽࿙Εʯରࡦ →PlantUMLͱϨϏϡͰઃܭڞ༗ɾߋ৽Λ࿙Β͞ͳ͍ - ʮεςʔλεछྨͷ૿Խɺεςʔλεؔ࿈৚݅ͷෳࡶԽʯରࡦ →AASM gemͰεςʔλε؅ཧɾ࣮૷Λ؆୯ʹ - ʮ࠷ॳظʹա౓ͳॊೈੑΛ࣋ͬͨઃܭΛ͢Δʯରࡦ →࠷ॳ͸খ࢝͘͞ΊΔɻDBઃܭ͕ਖ਼نԽ͞Ε͍ͯΕ͹͍͍ͩͨޙͰͲ ͏ʹ͔Ͱ͖Δ