【问题标题】:Detect duplicate records using Sequel and PostgreSQL使用 Sequel 和 PostgreSQL 检测重复记录
【发布时间】:2013-05-13 20:02:57
【问题描述】:

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

代码如下:

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 子句的构造。

【问题讨论】:

    标签: ruby postgresql sequel


    【解决方案1】:

    您需要在查询末尾添加 .first 否则您将获得一个数组。

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

    【讨论】:

    • 谢谢,工作。 “零”对我来说是新的。该声明似乎意味着如果没有结果(即没有重复)然后重定向..这与我的意图相反。如果结果为 0,则没有重复,因此继续。 ??无论如何,谢谢。
    • nil == NULL 这意味着你没有结果
    【解决方案2】:

    如果您编写email_address = @duplicate,则if 中的代码将始终被执行,因为if 表达式的条件始终为真。 Ruby 中除 nilfalse 之外的任何内容在布尔上下文中计算为 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
    

    【讨论】:

    • 非常感谢您的两个解决方案。我相信除了解决我眼前的问题之外,我还可以从这里进行概括。
    猜你喜欢
    • 2013-04-02
    • 2021-05-17
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多