Ruby on rails 使用Rails中的第一种方法检查存在性

Ruby on rails 使用Rails中的第一种方法检查存在性,ruby-on-rails,Ruby On Rails,我想检查我的数据库中是否已经存在记录。在我的函数中,我有以下代码: mailcode = params[:q] check = User.where("custom_mailcode = 'mailcode'").first 现在我遇到了if语句的麻烦。我想这样做: if check == nil doing something else doing something end 但它不起作用,因为支票从来都不是零。我怎样才能解决这个问题?你可以这样做 if check.present

我想检查我的数据库中是否已经存在记录。在我的函数中,我有以下代码:

mailcode = params[:q]
check = User.where("custom_mailcode = 'mailcode'").first
现在我遇到了if语句的麻烦。我想这样做:

if check == nil
  doing something
else
  doing something
end
但它不起作用,因为支票从来都不是零。我怎样才能解决这个问题?

你可以这样做

if check.present?
  ...
else
  ...
end
你可以试试


User.where(“custom_mailcode='mailcode')。任何?

您可以执行以下操作:

if check = User.where(custom_mailcode: params[:q]).first
  p check
else
  doing something else
end   

哈,我看到了错误,错误不在您的支票中,而是在您的where子句中。您总是在寻找一个名为
mailcode
的固定字符串,而不是变量的值。最简单的修复方法就是以不同的方式编写:

check = User.where(custom_mailcode: params[:q]).first
或者使用适当的字符串插值

check = User.where("custom_mailcode = '#{mailcode}'").first
您应该避免,因为这会使您的应用程序容易受到SQL注入攻击;只是展示了进行字符串插值的正确方法

然后你就测试一下

if check == nil

但我个人更喜欢
check.nil?
如果您打算使用用户记录,可以使用
find\u by

user = User.find_by(custom_mailcode: params[:q]) # User / nil
if user
  # ...
else 
  # ...
end
find_by
与where返回第一条记录或nil不同

如果不打算使用数据库值,请使用
.any?
它将发出一个
COUNT
SQL查询,该查询速度稍快,占用的内存较少

# ActiveRecord only loads a boolean into memory
if User.where(custom_mailcode: params[:q]).any?
  # ...
else 
  # ...
end

我假设您希望修改或读取用户(如果找到)。可以这样完成:

mailcode = params[:q]
user = User.find_by(custom_mailcode: mailcode)
if user
  # do something with the user
else
  # backup logic
end
或者,正如经常需要的那样,如果尚未找到对象,则可能需要创建该对象。为此,有一个
find\u或
create\u速记:

mailcode = params[:q]
user = User.find_or_create_by(custom_mailcode: mailcode)
user.update(meaning_of_life: 42)

这很奇怪,如果找不到与给定where子句匹配的用户,则调用
。首先
将返回
nil
,因此它应该可以正常工作。对我来说,这听起来很经典。如果该项存在或不存在,您打算如何处理该项?仅供参考
其中(…)。首先
通常通过
find_by(…)
完成。作为补充,您可能希望将该条件定义为命名范围。类似于
named_scope:with_mailcode,lambda{| code | where(:custom_mailcode=>code)}
?返回true或false,因此如果check==nil
,则不会执行
,如果check
,则只执行
。调用
。首先对关系执行
操作将返回
nil
或第一个对象,因此,虽然此操作更具可读性,但如何解决此问题?使用
查找方式(ustom\U mailcode:params[:q])
,而不是
。其中(自定义邮件代码:params[:q]).first
后者只是一种糟糕的风格。不,返回值是相同的-如果您不需要用户使用
any?
count
来发出计数查询。是的,我很擅长显然不真正阅读您的评论。我不同意样式参数,我发现
where first
组合非常可读,而且它允许像您通常所做的那样,组合各种where子句,并产生与
find\u by
相同的查询。因此,使用其中任何一个都只是个人喜好的问题。但这是一个很好的建议。