当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用rubyist-aasm(作为状态机)在转换时保持状态列》经验,为你挑选了2个好方法。

使用aasm在转换时将对象的状态持久保存到数据库的最佳方法是什么?我原以为这会自动发生,但事实并非如此.

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

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



1> Ryan McGeary..:

如果你打电话给爆炸!转型事件方法的形式,国家将坚持下去.例如,假设您有一个具有以下事件的对象:

class Book < ActiveRecord::Base
  # ... 

  aasm_event :close do
    transitions :to => :closed, :from => [:opened]
  end

  # ...
end

调用book.close会将状态设置为closed,但不会自动保存.调用book.close!将设置状态*和*自动保存AR对象.



2> Jaryl..:

正如Colin建议的那样,AASM将为您保留您的更改。马库斯所说的完全是错误的,除了该宝石的最新版本有一个错误。

在lib / persistence / active_record_persistence.rb的第180行(您可以通过运行gem:unpack来获取此信息),您应该看到以下注释:

将状态写入状态列,并使用update_attribute(绕过验证)将其持久化到数据库中

但是,在代码中,它实际上调用了save!

unless self.save

当基础模型验证失败时会发生此错误,因为默认情况下save方法不会绕过验证。一个快速的解决方法是改为:

unless self.save(false)

现在,转换确实确实将新状态保存到数据库中。

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有