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:验证组合值的主要内容,如果未能解决你的问题,请参考以下文章