Rails 3:验证组合值

Posted

技术标签:

【中文标题】Rails 3:验证组合值【英文标题】:Rails 3: Validate combined values 【发布时间】:2011-02-01 18:34:28 【问题描述】:

在 Rails 2.x 中,您可以使用验证来确保您具有唯一的组合值,如下所示:

validates_uniqueness_of :husband, :scope => :wife

在相应的迁移中,它可能如下所示:

add_index :family, [:husband, :wife], :unique => true

这将确保丈夫/妻子组合在数据库中是唯一的。现在,在 Rails 3 中,验证语法发生了变化,范围属性似乎消失了。现在看起来像:

validates :husband, :presence => true

知道如何在 Rails 3 中实现组合验证吗? Rails 2.x 验证在 Rails 3 中仍然有效,所以我仍然可以使用第一个示例,但它看起来很“旧”,有没有更好的方法?

【问题讨论】:

【参考方案1】:

忍受我。 ActiveModel 中 validates 方法的工作方式是寻找 Validator。

:presence => true 查找 PresenceValidator 并将选项:true 传递给验证器的初始化程序。

我想你想要

validates :husband, :presence => true, :uniqueness => :scope => :wife

(唯一性验证器实际上是 ActiveRecord 的一部分,而不是 ActiveModel。开发人员如何设置它真的很有趣。它非常优雅。)

【讨论】:

这听起来很棒而且很干净,但是……它在我尝试过的示例“一个模型项目”中不起作用。你们有没有做过什么特别的事情?我使用了 2 个字符串,也尝试了 2 个整数,但验证通过了。 我正在使用validates :contents, :presence => true, :uniqueness => :scope => :comment_thread_id, :message => "has been said already, please add something meaningful" 哎呀,很抱歉,我的错。我尝试了错误的测试,它确实有效。感谢您的超快速和出色的回答! 我知道这是一个古老的(ish)问题,但我只是在尝试同样的方法并且无法让它像这样工作,我不得不做两个单独的验证语句: validates :husband , :presence => true 并验证 :husband_id, :uniqueness => :scope => :wife_id @fishwebby 我将这个validates :visibility, :presence => true, :inclusion => :in => VISIBILITIES 与rails 3.0.3 一起使用,我还没有遇到这个问题。

以上是关于Rails 3:验证组合值的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3 验证 IPv4 和 IPv6 格式

如何在 Rails 中验证日期?

Rails:从自定义验证器调用标准验证

Rails:我如何验证某个东西是布尔值?

Rails:验证两列的唯一性(一起)

Rails 中的 Authorize.net - 由于身份验证值无效,用户身份验证失败