Вы можете думать о Ruby, если тестируете либо логическое значение, либо для доступности данных (против nil
). Неявное преобразование из 0 в false, поддерживаемое C и (следовательно, другими языками, такими как C ++), было более историческим артефактом за несколько дней до того, как C имел отчетливый булев тип. Здесь он полагается на то, что 0 является удобным дозорным значением или имеет интуитивное значение. Для многих вещей (например, в некоторых странах, где размеры одежды колеблются от 0 до 8, результаты вызова функции POSIX libC) ноль не преобразуется красиво в логически эквивалентный логический, поэтому неплохо, что Ruby идет своим путем.
С этой точки зрения проблема с вашим кодом заключается в том, что current_user.first_visit - имя которого подразумевает логический тип - на самом деле содержит 0, а не false. В качестве альтернативы, если бы у вас был явно числовой current_user.visit_counter, было бы естественно и правильно использовать одно из:
current_user.visit_counter > 0
current_user.visit_counter >= 1
current_user.visit_counter != 0