仅针对新记录进行验证

时间:2014-07-23 08:03:21

标签: ruby-on-rails ruby validation

我的模型Order带有price属性。

数据库中的Order条记录很少,但没有从旧数据库导入的price属性(nil值)。这样的无效记录少于20个。

现在price属性是强制性的。

我需要添加price 的状态验证和保留旧记录。 我无法将nil值设置为零或一些随机值。

我对基于时间戳的条件验证有一些疯狂的想法,甚至是"允许" IDS。

这样的事情:

PERMITTED_IDS = [4, 8, 15, 16, 23, 42]
validates :price, presence: true, if: -> { |order| PERMITTED_IDS.exclude?(order.id) } 

是否有漂亮方便方式?

2 个答案:

答案 0 :(得分:2)

使用on: :create

以下内容仅在模型创建时验证。

validates :price, presence: true, on: :create

但是,你不能只使用allow_nil: true

validates :price, presence: true, allow_nil: true

答案 1 :(得分:0)

我会向imported类添加一个布尔Order属性,在导入时将其设置为true以查找旧记录。这使您可以轻松跳过这些记录的验证:

validates :price, presence: true, unless: :imported?

<强>更新

  

Stefan:旧的/导入的记录是否可编辑?

     

freemanoid: @Stefan是的,但我不能为他们设定价格为零。

上述解决方案不是一个选项,因为它允许所有旧记录的nil价格。

您可以使用需要为新记录定价的自定义验证,但如果价格已经nil,则在更新记录时允许nil。类似的东西:

validates :price, presence: true,
                  on: :create

validates :price, presence: true,
                  on: :update,
                  unless: Proc.new { |o| p.price_was.nil? }