email
и new_email
- это две различные столбцы. Каждое электронное письмо должно быть уникальным, поэтому, если электронное письмо добавляется в любой столбец, оно уже не может существовать ни в столбцах email
, ни в new_email
.Подтвердить уникальность значения для двух столбцов Рельсы
История событий: Я создаю первичный email
для активированных учетных записей и получаю второй new_email
, когда пользователь решает изменить свой адрес электронной почты, но еще не подтвердил новый с помощью подтверждения по электронной почте.
Большинство SO поиск дал scope
solution:
Я попытался validates :email, uniqueness: {scope: :new_email}
и validates :new_email, uniqueness: {scope: :email}
однако я уверен, что эта функция действует, чтобы создать новый ключ среди email1, email2
пары, которая не является желательным эффектом.
В настоящее время я судить справедливость моего кода со следующими два тестовых (которые неудовлетворительными)
test "new_email should not match old email" do
@user.new_email = @user.email
assert_not @user.valid?
end
test "new_email addresses should be unique" do
duplicate_user = @user.dup
duplicate_user.new_email = @user.email.upcase
duplicate_user.email = @user.email + "z"
@user.save
assert_not duplicate_user.valid?
end
Это работало отлично, спасибо за объяснение. –
Как ни странно, мне пришлось добавить '.downcase' в метод' emails_unique', так как встроенный в него один из них имел небольшую лазейку для чувствительности к регистру среди сообщений электронной почты. –
@AlexeiDarmin, если вы хотите, чтобы сравнение было нечувствительным к регистру, вы можете использовать 'LIKE' (в MySQL) или' ILIKE' (в PostgreSQL) – eirikir