我想检查数据库中是否已存在记录。在我的函数中,我有这段代码:
mailcode = params[:q]
check = User.where("custom_mailcode = 'mailcode'").first
现在我遇到了if语句的问题。我想要做那样的事情:
if check == nil
doing something
else
doing something
end
但它不起作用,因为支票永远不会是零。我该如何解决这个问题?
答案 0 :(得分:1)
你可以尝试
User.where(“custom_mailcode ='mailcode'”)。any?
答案 1 :(得分:1)
如果您打算使用用户记录,则可以使用find_by
user = User.find_by(custom_mailcode: params[:q]) # User / nil
if user
# ...
else
# ...
end
find_by
与返回第一条记录或nil不同。
如果您不打算使用数据库值而不是使用.any?
,那么它将发出COUNT
SQL查询,该查询速度稍快,使用的内存更少。
# ActiveRecord only loads a boolean into memory
if User.where(custom_mailcode: params[:q]).any?
# ...
else
# ...
end
答案 2 :(得分:0)
你可以做到
if check.present?
...
else
...
end
答案 3 :(得分:0)
您可以执行以下操作:
if check = User.where(custom_mailcode: params[:q]).first
p check
else
doing something else
end
答案 4 :(得分:0)
mailcode
的固定字符串,而不是变量的值。最简单的解决方法就是以不同的方式写出:
check = User.where(custom_mailcode: params[:q]).first
或者使用正确的字符串插值
check = User.where("custom_mailcode = '#{mailcode}'").first
你应该避免,因为这会使你的应用程序容易受到SQL注入攻击;只是显示了进行字符串插值的正确方法。
然后你只需要测试
if check == nil
但我个人更喜欢check.nil?
。
答案 5 :(得分:0)
我假设您要修改或读取用户(如果已找到)。这可以这样完成:
mailcode = params[:q]
user = User.find_by(custom_mailcode: mailcode)
if user
# do something with the user
else
# backup logic
end
或者,正如通常所需,您可能想要创建对象(如果尚未找到)。为此目的有一个find_or_create_by
简写:
mailcode = params[:q]
user = User.find_or_create_by(custom_mailcode: mailcode)
user.update(meaning_of_life: 42)