使用 rubyist-aasm 保留转换时的状态列(充当状态机)
-
22-08-2019 - |
题
使用 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)
现在,转换确实将新状态保存到数据库中。
我相信 AASM 会在转换后保留对象的状态。请参阅 aasm/lib/persistence/active_record_persistence.rb 中的第 180-189 行
我认为如果这是你想要的效果,你必须在过渡中保存。根据设计,ActiveRecord(aasm 位于其之上)不会自动保存记录。
您可以在 打回来 如果你愿意(听起来你愿意)。
不隶属于 StackOverflow