【问题标题】:Validate against duplicate fields in same record针对同一记录中的重复字段进行验证
【发布时间】:2014-11-28 14:59:39
【问题描述】:

我有一个包含三个字段的模型:

  • url1
  • url2
  • url3

我想防止用户在多个字段中使用相同的值。我不想针对其他记录或范围验证唯一性,仅在当前记录内。

失败的测试如下所示:

expect(build(:post, url1: "foo", url2: "foo").to_not be_valid

activerecord 是否为这种情况提供验证,还是我应该自己编写?

编辑:

按照 Nermin 的建议,我创建了自己的验证器。我需要添加一些逻辑,因为我允许字符串为空白,但显然我不希望空白与返回误报相比。

  validate :unique_urls_on_post

  def unique_urls_on_post
    #avoid duplicate url but still allow blank
    my_array = []
    [iurl1, url2, url3].each do |i| 
      my_array << i unless i.length < 1 #empty string don't go in the array
    end 
    unless my_array.uniq.length == my_array.count
      errors.add(:url1, "has to be unique")
      errors.add(:url2, "has to be unique")
      errors.add(:url3, "has to be unique")
      false
    end 
  end 

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    您可以创建自定义验证

    validate :unique_url_on_user
    
    ...
    def unique_url_on_user
      unless url1 != url2 != url3
        errors.add(:url2, "has to be unique") # or any kind of message
        false
      end
    end
    

    【讨论】:

    • 谢谢你的想法,无论如何你不能比较 ruby​​ 中的 3 个值
    【解决方案2】:

    正如您在官方指南中看到的 (http://guides.rubyonrails.org/active_record_validations.html)

    此任务没有特定的验证助手,您必须编写自己的验证方法。

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 2020-05-16
      • 2013-02-15
      • 2019-08-30
      相关资源
      最近更新 更多