aasm を使用して遷移時にオブジェクトの状態をデータベースに永続化する最良の方法は何ですか? これは自動的に起こると思っていましたが、そうではないようです。
(編集: オブジェクトを手動で保存すると、状態列は更新されます。ただし、トランジションでは保存されません。)
このプラグインに関する有用なドキュメントがあまり見つからないため、より適切なドキュメントを備えた代替の有限状態マシンの実装に関する提案があれば、それも役立つかもしれません。
aasm を使用して遷移時にオブジェクトの状態をデータベースに永続化する最良の方法は何ですか? これは自動的に起こると思っていましたが、そうではないようです。
(編集: オブジェクトを手動で保存すると、状態列は更新されます。ただし、トランジションでは保存されません。)
このプラグインに関する有用なドキュメントがあまり見つからないため、より適切なドキュメントを備えた代替の有限状態マシンの実装に関する提案があれば、それも役立つかもしれません。
あなたが強打を呼ぶならば!遷移イベントメソッドの形式では、状態は持続します。たとえば、次のイベントを持つオブジェクトがあるとします。
class Book < ActiveRecord::Base
# ...
aasm_event :close do
transitions :to => :closed, :from => [:opened]
end
# ...
end
呼び出すbook.close
と状態がに設定されますがclosed
、自動的には保存されません。呼び出すbook.close!
と状態が設定され、ARオブジェクトが自動的に保存されます。
Colin が示唆するように、AASM は変更を保持します。Markus が言ったことは、gem の最新バージョンにバグがあるという事実を除いて、完全に間違っています。
lib/persistence/active_record_persistence.rb の 180 行目 (gem:unpack を実行すると取得できます) に、次のようなコメントが表示されます。
状態列に状態を書き込み、update_attribute (検証をバイパス) を使用してデータベースに保持します。
ただし、コードでは、実際には代わりに save を呼び出します!
unless self.save
save メソッドはデフォルトで検証をバイパスしないため、基礎となるモデルが検証に失敗するとバグが発生します。簡単な修正は、代わりにこれを行うことです:
unless self.save(false)
これで、トランジションは実際に新しい状態をデータベースに保存します。
AASMは、移行後もオブジェクトの状態を維持すると思います。aasm / lib / persistence / active_record_persistence.rbの180〜189行目を参照してください
それがあなたが望む効果であるならば、あなたはトランジションを保存しなければならないと思います。ActiveRecord (aasm がその上にある) は、設計上、レコードを自動保存しません。
必要に応じて、コールバックで保存を行うことができます(そうするように聞こえます)。