我有一个ActiveRecord对象,它有四个String
列。我想进行验证,验证某个值在所有四列中是唯一的。例如,假设有问题的四列名为a
,b
,c
和d
:
FooObject.new( a: 'bar' ).save!
应该成功,但
FooObject.new( b: 'bar' ).save!
应该会失败,因为已经有FooObject
a
,b
,c
或d
的值与为{{输入的值相匹配1}}。是否有一个干净,干净的方法来完成对象的验证?谢谢!
答案 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