0

假设我有一些验证,我只想在我的记录处于特定状态时运行。这允许保存不完整的草稿记录,并且可以稍后填写其余内容。

validates_presence_of :intro, :codename, :body,
  if: lambda { |o| o.content_state == :review }

现在我想知道这条记录的内容是否可以认为是完整的,这将允许它移动到review状态。验证为将约束和要求应用于模型属性提供了一个极好的框架,我想利用它。

所以我得拿一个草稿的内容记录,然后把它当成review状态来验证,如果出现任何错误,说明内容还不完整。

但我设法做到这一点的唯一方法如下:

def content_completable?
  old_content_state = content_state
  self.content_state = 'review'
  return valid?
ensure
  self.content_state = old_content_state
end

这对我来说感觉很笨拙。它似乎有效,但是我正在使用实际的状态机为这些状态提供动力,其中的文档说手动分配状态名称不是一件好事。但我必须这样做,因为可能没有过渡回来。

我现在实际上不想更改模型,即使它是有效的。我只想知道如果模型处于不同的状态,它是否有效?

我希望 ActiveRecords#valid?方法能够接受一个哈希属性,该属性会覆盖模型上的当前值,但它似乎不能以这种方式工作。

有没有更好的方法来做我正在做的事情?

4

2 回答 2

0

您可以clone记录、修改状态并调用valid?克隆的记录。

于 2013-06-24T21:42:16.683 回答
0

您可以设置一个虚拟属性并首先对其进行测试:

attr_accessor :new_content_state

validates_presence_of :intro, :codename, :body,
  if: lambda { |o| (o.new_content_state || o.content_state) == :review }

def content_completable?
  self.new_content_state = 'review'
  return valid?
end

当然,您可能仍然需要在虚拟状态之后进行清理,但这取决于该模型持续多长时间。它的侵入性也较小,因为您仅将此属性用于有限的目的。

一种完全不同的方法是首先避免使用 AR 验证器。它们并不是为此目的而设计的,尽管乍一看似乎很优雅,但抽象却从...

于 2013-06-24T21:43:09.110 回答