使用 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 位于其之上)不会自动保存记录。

您可以在 打回来 如果你愿意(听起来你愿意)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top