使用Sequel和PostgreSQL检测重复记录

时间:2013-05-13 10:29:00

标签: ruby postgresql sequel

我想检查一下新人在注册时使用的电子邮件地址是否与现有记录重复。

以下是代码:

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子句。

2 个答案:

答案 0 :(得分:1)

您需要在查询结束时添加.first,否则您将获得一个数组。

之后你可以测试@duplicate!= nil

答案 1 :(得分:0)

如果您写email_address = @duplicateif内的代码将始终被执行,因为if表达式的条件始终为真。除nilfalse之外的所有Ruby都在布尔上下文中评估为true

如果你写email_address == @duplicateif内的代码将永远不会被执行,因为你试图比较 一个字符串(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