Столбец цены представляет собой число с плавающей точкой, поэтому Rails автоматически преобразует строку «привет» в число с плавающей точкой, как указано в "hello".to_f # => 0.0
Затем он преобразуется обратно в строку "0.0"
, которая, очевидно, соответствует регулярному выражению.
В целом, использование регулярных выражений в нестроковых столбцах - плохая идея. Вместо этого используйте validates_numericality_of
. Если вам нужно то же ограничение, что и с регулярным выражением, сделайте это так:
class Product < ActiveRecord::Base
validates_numericality_of :price, :greater_than => 0, :less_than => 1000000
end
Мало того, что это безопаснее, но и легче читать и следовать. Обратите внимание, что он также автоматически отклонит цену, если она будет пустой.