Я пытаюсь сделать то же самое, и я думаю, что знаю, что не так. Проблема в том, что объект if или instance «base_item» ссылается на значение, для которого вы проверяете уникальность, а не на объект предполагаемого соответствия.
Возможно, вы действительно хотите проверить проверяемый элемент (в этом случае я лаю не на том дереве), но в случае уникальности более естественным является желание исключить определенные совпадения. Например, у меня есть поле is_deleted, и я хочу разрешить нарушение уникальности, если соответствующий объект был удален.
Я не могу найти способ ссылаться на соответствующий объект, который был найден в процедуре. Вы можете сделать это, создав собственную функцию проверки. Например, если вы хотите проверить уникальность имени, вы можете попробовать что-то вроде этого:
validate :full_validation
def full_validation
matches = self.class.find_all_by_name(self.name).select {|match| match.id != self.id && match.is_deleted==false}
return (matches.size>0)
end