我的模型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) }
是否有漂亮和方便方式?
答案 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? }