AASM 状态机库使用教程
1. 项目介绍
AASM(Acts As State Machine)是一个用于为 Ruby 类添加有限状态机的库。AASM 最初作为 acts_as_state_machine
插件开发,但已经发展成为一个更通用的库,不再仅限于 ActiveRecord 模型。AASM 目前支持多种 ORM,包括 ActiveRecord、Mongoid、NoBrainer 和 Dynamoid,并且可以用于任何 Ruby 类,无论其父类是什么。
AASM 的主要功能包括:
- 定义状态和事件
- 支持回调和守卫
- 支持多个状态机在同一个类中
- 自动生成状态常量
- 支持 ActiveRecord 的自动保存和事务支持
2. 项目快速启动
安装
首先,你需要在你的 Ruby 项目中安装 AASM gem。可以通过 Bundler 来安装:
# Gemfile
gem 'aasm'
然后运行 bundle install
来安装 gem。
基本使用
以下是一个简单的例子,展示如何在一个 Ruby 类中使用 AASM 定义状态机。
class Job
include AASM
aasm do
state :sleeping, initial: true
state :running, :cleaning
event :run do
transitions from: :sleeping, to: :running
end
event :clean do
transitions from: :running, to: :cleaning
end
event :sleep do
transitions from: [:running, :cleaning], to: :sleeping
end
end
end
在这个例子中,我们定义了一个 Job
类,并使用 AASM 定义了三个状态:sleeping
、running
和 cleaning
。我们还定义了三个事件:run
、clean
和 sleep
,每个事件都有相应的转换规则。
使用状态机
创建一个 Job
实例并触发事件:
job = Job.new
job.sleeping? # => true
job.may_run? # => true
job.run
job.running? # => true
job.may_run? # => false
job.run # => raises AASM::InvalidTransition
3. 应用案例和最佳实践
应用案例
AASM 广泛应用于需要状态管理的场景,例如订单处理、任务调度、工作流管理等。以下是一个订单处理的例子:
class Order
include AASM
aasm do
state :pending, initial: true
state :paid, :shipped, :cancelled
event :pay do
transitions from: :pending, to: :paid
end
event :ship do
transitions from: :paid, to: :shipped
end
event :cancel do
transitions from: [:pending, :paid], to: :cancelled
end
end
end
最佳实践
- 定义清晰的状态和事件:确保状态和事件的命名清晰,易于理解。
- 使用回调:利用 AASM 提供的回调功能,在状态转换前后执行特定的逻辑。
- 守卫条件:使用守卫条件来控制状态转换的合法性。
- 多状态机支持:如果一个类需要管理多个独立的状态机,可以使用 AASM 的多状态机支持。
4. 典型生态项目
AASM 作为一个通用的状态机库,可以与其他 Ruby 项目和框架无缝集成。以下是一些典型的生态项目:
- ActiveRecord:AASM 与 ActiveRecord 集成,支持自动保存和事务管理。
- Mongoid:AASM 支持 Mongoid ORM,适用于 MongoDB 数据库。
- Rails:AASM 可以与 Rails 框架结合,用于管理复杂的状态转换逻辑。
- Sidekiq:结合 Sidekiq 进行后台任务的状态管理。
通过这些集成,AASM 可以帮助开发者更高效地管理应用程序中的状态转换逻辑。