0

У меня есть объект ActiveRecord, который имеет четыре столбца String. Я хотел бы сделать проверку, которая проверяет, что определенное значение уникально для всех четырех столбцов. Например, предположим, четыре колонки в вопросе названы a, b, c и d:Проверить уникальность одного значения для нескольких столбцов

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

удастся, но

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

должны не потому, что там уже FooObject чье значение либо a, b, c, или d соответствует введенному значению для b. Есть ли чистый, чистый способ выполнить эту проверку на объекте? Спасибо!

+0

@potashin Что я Я пытаюсь сделать несколько иначе - в этом примере говорится, что комбинация столбцов не должна быть уникальной. То, что я пытаюсь сделать, это убедиться, что значение не существует в * любом * из указанных столбцов для любых двух строк. Имеет ли это смысл? – Argus9

ответ

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 
0
arr = ["a", "b"] 
arr.uniq{|x| x}.size //2 
arr << "b" 
arr.uniq{|x| x}.size // 2 

2 == 2 

, следовательно, этот элемент уже существует в столбце

arr представляет собой временную копию одной строки FoObject

Смежные вопросы