selase
(Selase Krakani)
17.Февраль.2025 16:22:19
125
SubStrider:
В скрипте миграции я вижу, что дубликаты адресов электронной почты не импортируются. Как именно определяется дубликат? Я заметил, что xyz@gmail.com считается тем же самым, что и xyz+1@gmail.com и xy.z@gmail.com .
Есть ли ещё какие-либо подобные правила?
По сути, всё именно так. Проверка на уникальность выполняется для приведённого к нижнему регистру и нормализованного варианта указанного адреса электронной почты.
def unique_email
email_exists =
if self.normalize_emails?
self
.class
.where("lower(email) = ? OR lower(normalized_email) = ?", email, normalized_email)
.exists?
else
self.class.where("lower(email) = ?", email).exists?
end
self.errors.add(:email, :taken) if email_exists
end
Мы нормализуем адрес, удаляя все точки и игнорируя всё, что идёт после + в имени пользователя.
def normalize_email
self.normalized_email =
if self.email.present?
username, domain = self.email.split("@", 2)
username = username.gsub(".", "").gsub(/\+.*/, "")
"#{username}@#{domain}"
end
end
3 лайка