first_sign = self.alt_1 <=> 0
(2..6).each do |n|
unless (self.send("alt_#{n}") <=> 0) == first_sign
errors.add_to_base(_("All values' signs should be same."))
break
end
end
С помощью этого метода мы сначала получаем знак alt_1, а затем видим, совпадают ли знаки остальных элементов (от alt_2 до alt_6). Как только мы находим тот, который не соответствует, мы добавляем ошибку проверки и останавливаемся. Он будет работать максимум 6 итераций и минимум 2.
Другой более умный, но менее эффективный метод - использовать удобный метод Enumerable#all?
, который возвращает значение true, если переданный ему блок возвращает значение true для всех элементов:
range = 1..6
errors.add_to_base(_("All values' signs should be same.")) unless
range.all? {|n| self.send("alt_#{n}") >= 0 } ||
range.all? {|n| self.send("alt_#{n}") <= 0 }
Здесь мы сначала проверяем, все ли элементы больше 0, а затем, если все элементы меньше 0. Этот метод повторяет максимум 12 раз и минимум 6.