我的模型有三个字段:
我想阻止用户在多个字段中使用相同的值。我不想在其他记录或范围内验证唯一性,仅在当前记录中。
失败的测试看起来像这样:
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
答案 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)
中看到的那样此任务没有特定的验证助手,您必须编写自己的验证方法。