使用aasm在转换时将对象的状态持久保存到数据库的最佳方法是什么?我原以为这会自动发生,但事实并非如此.
(编辑:当我手动保存对象时,状态列确实会更新.但是在转换时没有保存.)
我找不到这个插件的很多有用的文档,所以如果你有一个有更好的文档的替代有限状态机实现的建议,这可能也有帮助.
如果你打电话给爆炸!转型事件方法的形式,国家将坚持下去.例如,假设您有一个具有以下事件的对象:
class Book < ActiveRecord::Base # ... aasm_event :close do transitions :to => :closed, :from => [:opened] end # ... end
调用book.close
会将状态设置为closed
,但不会自动保存.调用book.close!
将设置状态*和*自动保存AR对象.
正如Colin建议的那样,AASM将为您保留您的更改。马库斯所说的完全是错误的,除了该宝石的最新版本有一个错误。
在lib / persistence / active_record_persistence.rb的第180行(您可以通过运行gem:unpack来获取此信息),您应该看到以下注释:
将状态写入状态列,并使用update_attribute(绕过验证)将其持久化到数据库中
但是,在代码中,它实际上调用了save!
unless self.save
当基础模型验证失败时会发生此错误,因为默认情况下save方法不会绕过验证。一个快速的解决方法是改为:
unless self.save(false)
现在,转换确实确实将新状态保存到数据库中。