除非在rails唯一性验证中使用

时间:2010-05-21 14:05:49

标签: ruby-on-rails validation

我刚开始使用Rails,并尝试开发一个简单的应用程序。我需要验证提交给应用程序的三个值 - 每个值必须符合相同的验证标准。

验证非常简单: 如果unqiue,null或等于“p”或“d”,则值有效。

以下是我的中途:

validates_uniqueness_of :value1, :value2, :value3, :allow_nil => true

我想我可以使用:除非检查值是“p”还是“d”,但是我无法弄清楚如何。

我想我正在尝试将validates_uniqueness_of与validates_inclusion_of结合使用。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。我可能会选择这样的东西:

validates_uniqueness_of :wallport_id, :allow_nil => true, :unless Proc.new { |u| u.wallport_id == 'p' or u.wallport_id == 'd' }

您还可以将额外的逻辑分解为自己的方法,如下所示:

validates_uniqueness_of :wallport_id, :unless :has_nonunique_wallport_id

NONUNIQUE_WALLPORT_IDS = ['p', 'd', nil]

def has_nonunique_wallport_id
  NONUNIQUE_WALLPORT_IDS.include? wallport_id
end

或将整个验证推送到自己的方法中,如下所示:

validate :has_valid_wallport_id

def has_valid_wallport_id
  # check wallport id and return either true or false
end

最好的方法可能取决于您发现哪些内容最易读,您可能希望将哪些功能暴露给代码的其他部分(例如,是否有其他人需要知道有效的非独特wallport ID?)以及哪些内容你期望可能会改变(例如,你以后会添加更多有效的非唯一ID吗?)。还有一些不同的方法可以进行实际检查,这也可以归结为您认为最具可读性的内容以及您认为系统可能发展的方式。