:使用逻辑比较进行验证

时间:2011-10-11 13:27:55

标签: ruby-on-rails

我有一个包含几个布尔列的表。

在开票之前,需要将PurchaseOrder标记为完成(第一个布尔值)(第二个布尔值)。

我非常感谢如何验证这些布尔值的合法组合。

我的想法是,

:validates (!:complete and !:invoiced) or (:complete && :invoiced) or (:complete && !:invoiced)

这可能吗?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

听起来你的PurchaseOrder在其生命周期中经历了几个状态,如finite-state machine

我们在生产系统中使用的一件事是acts_as_state_machine,以帮助实现此行为。

它允许您定义:

  • 一个对象可以在
  • 中的一系列状态
  • 在状态之间移动对象的事件
  • 最后说明你可以在两者之间移动,哪些状态你不能在两者之间移动。例如,您可能希望允许PurchaseOrder从完成 - >发送到>>发票,而不是从发票 - >到 - >完成后退。 acts_as_state_machine允许您以声明式样式进行设置。

acts_as_state_machine将允许您定义这些复杂的行为。阅读它需要一些时间来理解它,但对于像这样的系统,它一直是一个救命。