state_machine使用after_failure和ActiveRecord事务

时间:2013-09-26 11:08:21

标签: ruby activerecord state-machine

我正在使用ruby state_machine来管理处理文档。随着文档的进展,SM状态管理所需的额外验证。

如果任何步骤失败,例如文档尺寸错误,我想记录下来,以便我可以通知正在等待转换完成的用户。

我的计划是使用SM after_failure来填充模型中的failed_at时间戳。轮询用户界面将看到处理失败并显示相应的消息。

我的问题是,如果转换失败,它会回滚事务,包括after_failure方法。这意味着用户永远不会发现处理失败,并且不幸地无限期地坐在屏幕前。

在下面的示例中,我希望:fail_transaction方法在转换失败的情况下运行。我愿意接受任何想法或其他方式来通知用户失败。

注意:

  • :use_transaction =>似乎没有状态机的错误选项 有所作为。
  • 我考虑将失败转换放入工作队列以转义事务,但因为我正在使用delayed_job,所以队列条目也会被收回。
  • 这个项目仍然在Rails 2.3.x& ruby 1.8.x

示例代码:

state_machine :state, :initial => :new do

  state :new

  state :original_uploaded do
    validates_presence_of :original_file
  end

  state :original_converted do
    validates_presence_of :pdf
  end

  state :conversion_complete do
    validates :pdf_dimensions_correct
  end

  event :process do
    transition :new => :original_uploaded
    transition :original_uploaded => :original_converted
    transition :original_converted => :conversion_complete
  end

  after_transition :on => :process, :do => :process

  before_transition any => :original_converted, :do => :convert_original_to_pdf
  before_transition any => :conversion_complete, :do => :extract_pdf_metadata

  after_failure :on => :process, :do => :fail_conversion

end

def fail_conversion
  update_attribute(:failed_at, Time.now) # Should update dispite being invalid state
end

def convert_original_to_pdf
  #...
end

def extract_pdf_metadata
  #...
end

def pdf_dimensions_correct
  errors.add(...)
end

提前致谢!

0 个答案:

没有答案