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ͷౚ࣮݁෦