在Rails中使用第一种方法检查是否存在

时间:2015-07-16 10:15:50

标签: ruby-on-rails

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

mailcode = params[:q]
check = User.where("custom_mailcode = 'mailcode'").first

现在我遇到了if语句的问题。我想要做那样的事情:

if check == nil
  doing something
else
  doing something
end

但它不起作用,因为支票永远不会是零。我该如何解决这个问题?

6 个答案:

答案 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)

哈,我看到错误,错误不在您的支票中,而是在您的where子句中。您始终在寻找名为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)