使用aasm在转换过程中将对象状态持久保存到数据库的最佳方法是什么?我原以为这会自动发生,但情况似乎并非如此。
(编辑:当我手动保存对象时,状态列确实会更新。但是在转换时没有保存。)
我找不到这个插件的很多有用的文档,所以如果你有一个有更好的文档的替代有限状态机实现的建议,这可能也有帮助。
答案 0 :(得分:14)
如果您调用转换事件方法的 bang!形式,则状态将保持不变。例如,假设您有一个具有以下事件的对象:
class Book < ActiveRecord::Base
# ...
aasm_event :close do
transitions :to => :closed, :from => [:opened]
end
# ...
end
调用book.close
会将状态设置为closed
,但不会自动保存。调用book.close!
将设置状态*并*自动保存AR对象。
答案 1 :(得分:4)
正如科林所说,AASM会坚持你的改变。 Markus所说的是不正确的,除了最新版本的宝石有一个错误。
在lib / persistence / active_record_persistence.rb的第180行(你可以通过运行gem:unpack得到这个),你应该看到注释,其中说明:
将状态写入状态列并将其持久保存到数据库中 使用update_attribute(绕过验证)
但是,在代码中,它实际上调用了save!
unless self.save
当底层模型验证失败时会发生错误,因为默认情况下save方法不会绕过验证。快速修复就是这样做:
unless self.save(false)
现在,转换确实将新状态保存到数据库中。
答案 2 :(得分:0)
我相信AASM会在过渡后保持对象的状态。参见aasm / lib / persistence / active_record_persistence.rb
中的第180-189行答案 3 :(得分:-3)
我认为你必须保存过渡,如果那是你想要的效果。 ActiveRecord(aasm位于其上方)不会按设计自动保存记录。
如果您愿意,可以在callback内进行保存(听起来就像这样)。