Reputation: 3110
What is the best way to persist the object's state to the database on a transition using aasm? I had thought that this would happen automatically but this doesn't seem to be the case.
(Edit: when I manually save the object, the state column does get updated. But a save isn't done on transitions.)
I can't find much useful documentation for this plugin, so if you have a suggestion for an alternative finite state machine implementation with better documentation, that might help as well.
Upvotes: 8
Views: 4519
Reputation: 239944
If you call the bang! form of the transition event method, the state will persist. For example, say you have an object with the following event:
class Book < ActiveRecord::Base
# ...
aasm_event :close do
transitions :to => :closed, :from => [:opened]
end
# ...
end
Calling book.close
will set the state to closed
, but will not automatically save. Calling book.close!
will set the state *and* automatically save the AR object.
Upvotes: 17
Reputation: 2601
As Colin suggests, AASM will persist your changes for you. What Markus has said is flat out incorrect, except for the fact that the latest version of the gem has a bug.
On line 180 of lib/persistence/active_record_persistence.rb (you can get this by running gem:unpack), you should see the comment, which states:
Writes state to the state column and persists it to the database using update_attribute (which bypasses validation)
However, in the code, it actually calls save instead!
unless self.save
The bug occurs when the underlying model fails validation, because the save method does not bypass validation by default. A quick fix would be to do this instead:
unless self.save(false)
Now, transitions do indeed save the new state to the database.
Upvotes: 6
Reputation: 2353
I believe AASM will persist the state of the object after transition. See lines 180-189 in aasm/lib/persistence/active_record_persistence.rb
Upvotes: 0