2013-05-13 2 views
0

Я хочу проверить, не является ли адрес электронной почты, который использует новый человек при регистрации, является дубликатом существующей записи.Обнаружение дублирующих записей с использованием Sequel и PostgreSQL

Вот код:

post '/signup' do 
    email_address = params['email_address'] 
    username = params['username'] 
    password = params['password'] 
    @duplicate = DB[:users].select(:email_address).where('email_address = ?', email_address) 
    if email_address = @duplicate 
     redirect "/?msg=Email address already in use. Try again" 
     return 
    end 
end 

Это блокирует все попытки, даже если адрес электронной почты не является дубликатом и перенаправляет с сообщением об ошибке.

Если я заменю @duplicate на duplicate (без знака @), то тот же результат, все попытки заблокированы. Если я использую == вместо =, тогда повторяющиеся адреса электронной почты игнорируются и никакие попытки не блокируются.

Я знаю, что запрос:

DB[:users].select(:email_address).where('email_address = ?', email_address) 

правильно, потому что я тестировал. Поэтому я предполагаю, что проблема заключается в построении предложения if.

ответ

0

Если вы пишете email_address = @duplicate код внутри if будет всегда excuted, так как условие для выражения if всегда верно. Все в Ruby, кроме nil и false, оценивается как true в булевом контексте.

Если вы пишете email_address == @duplicate код внутри if никогда не будет выполняться, так как вы пытаетесь сравнить строку (email_address) с объектом класса Sequel::Postgres::Dataset (@duplicate).

Лучший подход может быть

post '/signup' do 
    # same code as yours... 
    @duplicate = DB[:users].where(email_address: email_address).count 
    unless @duplicate.zero? 
     # redirect and return 
    end 
end 
+0

Большое спасибо за ваши решения. Я считаю, что я могу обобщить здесь, в дополнение к решению моей непосредственной проблемы. – user1903663

1

Вам нужно добавить. Сначала в конце вашего запроса в противном случае вы получите массив.

После этого вы можете проверить, если @duplicate! = Ноль

+0

спасибо, работает. «Ноль» для меня нова. Утверждение, по-видимому, означает, что ни один результат (т. Е. Не дубликат) не перенаправляется. Это противоположность тому, что я намерен. Если результат равен 0, то дубликат не повторяется. ?? В любом случае, благодарю Вас. – user1903663

+0

nil == NULL это означает, что у вас нет результата –

Смежные вопросы