使用rubyist-aasm(作为状态机)在转换时保持状态列

时间:2009-03-25 18:42:03

标签: ruby-on-rails aasm acts-as-state-machine

使用aasm在转换过程中将对象状态持久保存到数据库的最佳方法是什么?我原以为这会自动发生,但情况似乎并非如此。

(编辑:当我手动保存对象时,状态列确实会更新。但是在转换时没有保存。)

我找不到这个插件的很多有用的文档,所以如果你有一个有更好的文档的替代有限状态机实现的建议,这可能也有帮助。

4 个答案:

答案 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内进行保存(听起来就像这样)。