In Memory로 state machine의 statesman을 사용해 보도록 하겠습니다.

statesman을 사용해 봤어요.


rails에서 state machinestatesman를 원해서 썼어요.
왜냐면ruby toolbox 그럼statemachines의 클래스에 들어가지 않았습니다. 자주 사용하고 유지보수도 지속됩니다.
(ruby 오랜만이에요. 이제 루비 toolbox도 잘 안 쓰죠)

In Memory로 이동


statesman의 특징은 state machine의class와 이전 역사를 저장하는transsitionclass와 모델을 분리해서 제작하는 것이 기본적인 부분이죠.
state machine도 모델에 함부로 자란 것이 아니라 스스로 정의하고 넣은 것이기 때문에 다양한 기능을 함부로 추가하는 것이 아니라 놀라지 않는다.
액티비티 같은 모델이 있다면 state machine로 제작된 반include Statesman::Machine, 모델에서 제작state_machine 방법으로 거기에 state machine의 실례를 설정하면 먼저 움직인다.
class Activity < ApplicationRecord
  def state_machine
    @state_machine ||= ActivityStateMachine.new(self)
  end
end

class ActivityStateMachine
  include Statesman::Machine
  
  state :pending, initial: true
  state :done
  
  transition from: :pending, to: :done
end
이렇게 호출state_machine 사용
> activity = Activity.new
> activity.state_machine.current_state?
=> "pending"
> activity.state_machine.can_transition_to?(:done)
=> true
> activity.state_machine.transition_to!(:done)
=> true

# 状態遷移が出来ました
> activity.state_machine.current_state
=> "done"
대체로 이런 상태의 관리는 DB를 사용하지 않고 In Memory를 사용해서 하지만 기본적으로 상태 이동의 기록을 지정하는transsition class로 하는 것이 평소의 용례에 더 적합할 수 있다.어쨌든 이렇게 되면 Activity 모델의 상태를 저장할 수 없습니다
> activity.save

# ここで保存した activity をロードしなおしたとすると
> activity2 = Activity.last
# 状態を確認すると initial state に戻ってしまってます
> activity2.state_machine.current_state
=> "pending"

(기본) RDB 사용 상태 저장


transition class를 만들어 DB에 저장하면 된다.
이런 방법은 README의 방법입니다. 상세한 상황은 참고해 주십시오. initializers/statesman.rb도Active Record의 어댑터를 설정하고transion class를 만들며migration을 더하면 됩니다.
rails g statesman:active_record_transition Activity ActivityTransition
단, 이것은 처음 이동했을 때의 기억일 뿐, 참고만 제공한다.
제작된migration 파일은 미묘합니다. id의 관련으로 떨어질 수 있습니다.rake db:rollback도 index에서 삭제되었기 때문에 add_foreign_key의 위치를 마지막으로 변경했습니다.
# これを migration ファイルの最後に置いておくと、まず foreign_key が消えるので、他の add_index も rollback 可能になる
add_foreign_key :activity_transitions, :activities
(이해하기 어려운 설명일 수도 있어요. 안 돼요!)

좋은 웹페이지 즐겨찾기