验证跨多个列的单个值的唯一性

时间:2016-06-16 19:03:23

标签: ruby-on-rails validation activerecord rails-activerecord

我有一个ActiveRecord对象,它有四个String列。我想进行验证,验证某个值在所有四列中是唯一的。例如,假设有问题的四列名为abcd

FooObject.new( a: 'bar' ).save!

应该成功,但

FooObject.new( b: 'bar' ).save!

应该会失败,因为已经有FooObject abcd的值与为{{输入的值相匹配1}}。是否有一个干净,干净的方法来完成对象的验证?谢谢!

2 个答案:

答案 0 :(得分:0)

您可以尝试自定义方法:

validate :uniqueness_across_columns

def uniqueness_across_columns
  cols = [:a, :b, :c, :d]
  conditions = cols.flat_map{|x| cols.map{|i| arel_table[x].eq(self.try(i)) if self.try(i).present? }}

  !self.class.exists? conditions.compact.reduce(:or)
end

答案 1 :(得分:0)

arr = ["a", "b"]
arr.uniq{|x| x}.size //2
arr << "b"
arr.uniq{|x| x}.size // 2

2 == 2

因此该元素已存在于

列中

arr表示一行FoObject

的临时副本