2011-10-11 116 views
0

我有一个带有几个布尔列的表。:使用逻辑比较进行验证

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

我很感激一些关于如何验证这些布尔值的合法组合的指针。

我心目中什么是一样的东西,

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

这可能吗?

+0

只与您的问题相切,但我相信如果您尚未使用状态机,您会更好:http://www.shopify.com/technology/3383012-why-developers-应该是强制喂食状态机 –

+0

感谢您的建议。我有一个实时编程的背景,所以我熟悉状态机的价值,并在我的应用程序中的其他地方使用它,但不知道这个宝石。 – Snips

回答

1

听起来像是你的PurchaseOrder其生命周期中要经过几个州,如一个finite-state machine

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

它允许你定义:

  • 一系列状态的一个对象可以在
  • 是移动
  • 状态之间的对象,最后其中规定,你可以之间移动的事件,以及其中声明你不能在两者之间移动。例如,您可能希望允许您的PurchaseOrder从完整开票开票开票,但不能从开票开票开始→完成。 acts_as_state_machine允许您以声明风格进行设置。

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

+0

这非常有趣,谢谢。 – Snips

+0

当然可以。可能在更复杂的情况下证明有用。 – jefflunt