@(Ruby on Rails)[rails, gem]

  1. 1
    2
    3
    4
  1.  
  2. # AASM is a continuation of the acts-as-state-machine rails plugin, built for plain Ruby objects.
    gem 'aasm', '~> 4.12', '>= 4.12.0'

instance method

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
  1. ##
    # check status
    ##
  2.  
  3. job.running? # => true
    job.may_run? # => false
  4.  
  5. job.aasm.current_state # stage3
    job.aasm_state # => 'sleeping'
    job.aasm.human_state # => 'sleeping'
    job.aasm.states(:permitted => true).map(&:name) # show all permitted states (from initial state)
    job.aasm.states(:permitted => false).map(&:name) # show all non permitted states
    job.aasm.events.map(&:name) # show all possible (triggerable) events from the current state
  6.  
  7. ##
    # change status 的方法要根據在 AASM 中 event 所定義的名稱
    ##
    job.sleep # => triggered :sleep
    job.sleep! # => triggered :sleep!

class method

  1. 1
  1. Job.aasm.states_for_select # 產生可以直接套用到 select 的 options

erb 中帶入 select options

  1. 1
  1. <%= select_tag :transaction_state, options_for_select(Transaction.aasm.states_for_select), class: '-control' %>

目錄

[TOC]

Automatic Scope

在 AASM 中內建了 Model Scope 讓我們使用:

  1. 1
    2
  1. # 假設 Order 有 paid 的狀態,那麼可以直接使用
    Order.paid

i18n

AASM 支援在 i18n 定義:

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  1. zh-TW:
    activerecord:
    attributes:
    order:
    status/waiting_for_payment: 等待付款
    status/paid: 已付款
    status/failed: 已出貨
    status/canceled: 已逾期
    status/expired: 已退款
    status/refunded: 已退款

使用範例

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
  1. # ./OnePageShop/app/models/order.rb
    class Order < ApplicationRecord
    # Concerns macros
    include AASM
  2.  
  3. # Attributes related macros
    aasm column: 'status', no_direct_assignment: true, requires_lock: true do
    # 等待付款
    state :waiting_for_payment, initial: true
    # 已付款
    state :paid
    # 已出貨
    state :shipped
    # 訂單逾期
    state :expired
    # 已退款
    state :refunded
  4.  
  5. after_all_transitions :generate_status_transition_log!
  6.  
  7. event :mark_as_paid do
    transitions from: %i(placed waiting_for_payment), to: :paid
    end
  8.  
  9. event :mark_as_shipped do
    transitions from: :paid, to: :shipped
    end
  10.  
  11. event :mark_as_expired do
    transitions from: :waiting_for_payment, to: :expired
    end
  12.  
  13. event :mark_as_refunded do
    transitions from: :paid, to: :refunded
    大专栏  [Gem] AASM 狀態機n class="keyword">end
    end
  14.  
  15. # ...
  16.  
  17. private
    # callback methods
    def can_not_be_destroyed
    throw :abort
    end
  18.  
  19. def generate_status_transition_log!
    status_logs.create!(status: aasm.to_state)
    end
    end
  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
  1. # ./OnePageShop/app/models/transaction.rb
    class Transaction < ApplicationRecord
    # Concerns macros
    include AASM
  2.  
  3. # Attributes related macros
    aasm column: 'status', no_direct_assignment: true, requires_lock: true do
    # 等待繳款
    state :waiting_for_payment, initial: true
    # 已付款
    state :paid
    # 交易失敗
    state :failed
    # 取消
    state :canceled
    # 逾期
    state :expired
    # 已退款
    state :refunded
  4.  
  5. after_all_transitions :generate_status_transition_log!
  6.  
  7. event :mark_as_paid do
    transitions from: :waiting_for_payment, to: :paid
    end
  8.  
  9. event :mark_as_paid do
    transitions from: :waiting_for_payment, to: :failed
    end
  10.  
  11. event :mark_as_canceled do
    transitions from: :waiting_for_payment, to: :canceled
    end
  12.  
  13. event :mark_as_expired do
    transitions from: :waiting_for_payment, to: :expired
    end
  14.  
  15. event :mark_as_refunded, after: :check_all_transactions_refunded! do
    transitions from: :paid, to: :refunded
    end
    end
  16.  
  17. # callbacks
    after_initialize :generate_trade_number
    after_create :generate_status_change_log!
    after_update :update_order_status!
  18.  
  19. private
    # callback methods
    def generate_status_change_log!
    status_logs.create!(status: aasm.current_state)
    end
  20.  
  21. def generate_status_transition_log!
    status_logs.create!(status: aasm.to_state)
    end
  22.  
  23. def update_order_status!
    return if payment_info.nil?
  24.  
  25. if self.paid?
    # set all waiting for payment transaction as canceled
    self.order.transactions.waiting_for_payment.each do |transaction|
    transaction.mark_as_canceled! if transaction.may_mark_as_canceled?
    end
  26.  
  27. self.order.mark_as_paid! if self.order.may_mark_as_paid?
    end
    end
  28.  
  29. def check_all_transactions_refunded!
    # 若沒有其餘等待付款或已付款的交易,則將訂單狀態改為已退款
    if !Transaction.where(order_id: self.order_id, status: %i(waiting_for_payment paid)).exists?
    self.order.mark_as_refunded!
    end
    end
    end

參考

[Gem] AASM 狀態機的更多相关文章

  1. (转帖) 有限狀態機FSM coding style整理 (SOC) (Verilog)

    来源:http://www.codesoso.net/Record/101092_95120_21.html 来源:http://www.cnblogs.com/oomusou/archive/201 ...

  2. 有限狀態機FSM coding style整理 (SOC) (Verilog)

    AbstractFSM在數位電路中非常重要,藉由FSM,可以讓數位電路也能循序地執行起演算法.本文將詳細討論各種FSM coding style的優缺點,並歸納出推薦的coding style. In ...

  3. SSIS 無法將保護的 XML 節點 "DTS:Password" 解密,錯誤為 0x8009000B "機碼用在特定狀態時無效

    发现之前部署的SSIS,执行失败,查看日志 來源: 描述: 無法將保護的 XML 節點 -- ::-- ::-- :: DataReader 來源 [] 描述: System.Exception: S ...

  4. Win10還原成最乾淨的狀態 不必重灌

    系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...

  5. Win10還原成最乾淨的狀態

    系統不穩定時我們想到的第一個選擇就是重灌,如果你的作業系統是win10將會有另外一個新選擇,就是透過程式進行還原,讓你的電腦回到剛安裝時的清爽. 工具資訊 [軟體名稱]微軟 Refresh Windo ...

  6. 檢查RAC狀態

    1.使用srvctl工具檢查RAC當前配置和狀態 $ srvctl config database -h Displays the configuration for the database. Us ...

  7. ES 處於“initializing”狀態,此時主節點正在嘗試將分片分配到集群中的數據節點。 如果您看到分片仍處於初始化或未分配狀態太長時間,則可能是您的集群不穩定的警告信號。

    指標要點: Cluster status: 如果集群狀態為黃色,則至少有一個副本分片未分配或丟失. 搜索結果仍將完成,但如果更多的分片消失,您可能會丟失數據. 紅色的群集狀態表示至少有一個主分片丟失, ...

  8. Flater-Provide狀態管理

    參考來源:http://www.jspang.com/posts/2019/03/01/flutter-shop.html#%E7%AC%AC24%E8%8A%82%EF%BC%9Aprovide%E ...

  9. memcached+狀態模式+工廠方法使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. Python笔记_第四篇_高阶编程_py2与py3的区别

    1. 性能: py3.x起始比py2.x效率低,但是py3.x现有极大的优化空间,效率正在追赶. 2. 编码: py3.x原码文件默认使用的utf-8编码,使得变量名更为宽阔. 3. 语法: * 去除 ...

  2. Adaboost算法及其代码实现

    . . Adaboost算法及其代码实现 算法概述 AdaBoost(adaptive boosting),即自适应提升算法. Boosting 是一类算法的总称,这类算法的特点是通过训练若干弱分类器 ...

  3. map的嵌套 + 例题(水果)

    水果 http://acm.hdu.edu.cn/showproblem.php?pid=1263 Problem Description 夏天来了~~好开心啊,呵呵,好多好多水果~~Joe经营着一个 ...

  4. 7.windows-oracle实战第七课 --约束、索引

    数据的完整性 数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则.数据的完整性使用约束.触发器.函数的方法来实现.在这三个方法中,约束易于维护,具备最好的性能,所以作为首选.  约束:not nu ...

  5. 使用mha 构建mysql高可用碰到几个问题

    根据网上配置,安装好mha ,建议到https://code.google.com/archive/p/mysql-master-ha/downloads  下载0.56版本 1.首先先确定各个主机之 ...

  6. PAT甲级——1005.SpellItRight(20分)

    Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output e ...

  7. Java之代码块

    package com.atguigu.java3;/* * 代码块(或初始化块) * * 1. 代码块的作用:用来初始化类.对象 * 2. 代码块如果有修饰的话,只能使用static. * 3. 分 ...

  8. Linux Centos下MySQL主从Replication同步配置(一主一从)

    MySQL 主从复制概念MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据 ...

  9. Jupyter_Notebook

    TA-lib指标库地址 http://github.com/xingbuxing/TA-Lib-in-chinese 1.Jupter是基于网页端写代码,属于一种交互式的编程,除了在上面写代码之外还可 ...

  10. NOIP2002 过河卒(DFS,DP)

    https://www.luogu.org/problem/P1002 题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如 ...