验证同一记录中的重复字段

时间:2014-11-28 14:59:40

标签: ruby-on-rails activerecord

我的模型有三个字段:

  • 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 

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

正如您在官方指南(http://guides.rubyonrails.org/active_record_validations.html

中看到的那样

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