У меня есть модель, в которой я хочу проверить количество затяжек, сделанных пользователем. Это должно быть только неотрицательное целое число. Проблема в том, что когда я ввожу строку, она автоматически заменяет строку на 0 при сохранении перед применением регулярного выражения. Как заставить ввод быть только неотрицательным целым числом без преобразования строки в 0?
class User < ApplicationRecord
validates :number_of_tightenings, format: { with: /\A[0-9]+\z/,
message: "You have to input a number >= 0." }
end
Я думал, что мою проблему невозможно решить с помощью валидатора численности, но почитав глубже, я обнаружил, что это можно сделать с помощью validates :number_of_tightenings, numericality: { greater_than_or_equal_to: 0 }.





Вы можете использовать проверку числового значения ActiveRecord. (https://edgeguides.rubyonrails.org/active_record_validations.html#numericality)
class User < ApplicationRecord
validates :number_of_tightenings,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
end
# schema.rb
t.integer "number_of_tightenings"
only_integer указывает, что это должно быть целое число (а не число с плавающей запятой). greater_than_or_equal_to указывает, что отрицательные целые числа не допускаются.
Это приведет к следующему поведению:
User.create(number_of_tightenings: 4) #=> <User id: 8, number_of_tightenings: 4, created_at: "2020-12-16 12:03:47", updated_at: "2020-12-16 12:03:47">
User.create(number_of_tightenings: "5") #=> <User id: 6, number_of_tightenings: 5, created_at: "2020-12-16 11:54:39", updated_at: "2020-12-16 11:54:39">
User.create(number_of_tightenings: "-5") #=> <ActiveModel::Errors:0x00007faa18df2180 @base=#<User id: nil, number_of_tightenings: -5, created_at: nil, updated_at: nil>, @messages = {:number_of_tightenings=>["must be greater than or equal to 0"]}, @details = {:number_of_tightenings=>[{:error=>:greater_than_or_equal_to, :value=>-5, :count=>0}]}>
User.create(number_of_tightenings: "test") #=> <ActiveModel::Errors:0x00007faa182836c8 @base=#<User id: nil, number_of_tightenings: 0, created_at: nil, updated_at: nil>, @messages = {:number_of_tightenings=>["is not a number"]}, @details = {:number_of_tightenings=>[{:error=>:not_a_number, :value=>"test"}]}>
Если вы хотите хранить только положительные целые числа, почему вы хотите хранить их в виде строк и пытаться проверять их с помощью регулярного выражения? Когда столбец был целочисленным, вы могли использовать валидатор числового значения Rails .