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
相同的查询。因此,使用其中任何一个都只是个人喜好的问题。但这是一个很好的建议。