Валидации в рельсах используют метапрограммирование внутри?Как это на самом деле работает? - PullRequest
4 голосов
/ 20 сентября 2019

Мы видели, что в рельсах мы выполняем проверки для определенного столбца примерно так -
validates :first_name, presence: true
что на самом деле делает это утверждение?Я думаю, что он создает метод класса для нашего класса Model с именем метода - "first_name".Этот метод вызывается, как только кто-то делает object.first_name и ищет значение этого параметра, в случае, если значение пусто, возникает ошибка, в противном случае возвращается true.
Я не уверен, что я прав.Было бы здорово, если бы кто-нибудь мог объяснить, пожалуйста, весь этот цикл.Спасибо!

1 Ответ

1 голос
/ 20 сентября 2019

Если в вашей модели есть строка validates :attribute, presence: true, это относится к атрибуту, хранящемуся в базе данных, а не к пользовательскому методу.

Ваша проверка будет искать запись в таблице вашей модели в базе данныхи убедитесь, что атрибут first_name не равен nil.

РЕДАКТИРОВАТЬ: как указано ниже, mrzasa фактически не извлекает новый экземпляр вашей записи при проверке, но использует атрибуты, находящиеся в настоящий момент в памяти

Если это так, это добавит ошибку проверки в вашу запись, и вы не сможете ее сохранить.

Я бы настоятельно рекомендовал прочитать https://guides.rubyonrails.org/active_record_validations.html#validations-overview, если вы хотите знать, как работают проверки.

...