gpt4 book ai didi

ruby-on-rails - 检查 Rails 中的 Controller 是否存在记录

转载 作者:行者123 更新时间:2023-12-03 05:13:38 26 4
gpt4 key购买 nike

在我的应用程序中,用户可以创建业务。当他们触发我的 BusinessesController 中的 index 操作时,我想检查业务是否与 current_user.id 相关:

  • 如果是:显示该业务。
  • 如果否:重定向到new 操作。

我试图使用这个:

if Business.where(:user_id => current_user.id) == nil
# no business found
end

但即使业务不存在,它也总是返回 true...

如何测试数据库中是否存在记录?

最佳答案

为什么你的代码不起作用?

where 方法返回一个 ActiveRecord::Relation 对象(其作用类似于包含 where 结果的数组),>它可以为空,但永远不会nil

Business.where(id: -1) 
#=> returns an empty ActiveRecord::Relation ( similar to an array )
Business.where(id: -1).nil? # ( similar to == nil? )
#=> returns false
Business.where(id: -1).empty? # test if the array is empty ( similar to .blank? )
#=> returns true
<小时/>

如何测试是否至少存在一条记录?

选项 1:使用 .exists?

if Business.exists?(user_id: current_user.id)
# same as Business.where(user_id: current_user.id).exists?
# ...
else
# ...
end
<小时/>

选项 2:使用 .present? (或 .blank? ,与 .present 相反?)

if Business.where(:user_id => current_user.id).present?
# less efficiant than using .exists? (see generated SQL for .exists? vs .present?)
else
# ...
end
<小时/>

选项 3: if 语句中的变量赋值

if business = Business.where(:user_id => current_user.id).first
business.do_some_stuff
else
# do something else
end

此选项可能会被某些 linter(例如 Rubocop)视为代码异味。

选项 3b:变量赋值

business = Business.where(user_id: current_user.id).first
if business
# ...
else
# ...
end

您还可以使用.find_by_user_id(current_user.id)代替.where(...).first

<小时/>

最佳选择:

  • 如果您不使用Business对象:选项 1
  • 如果您需要使用Business对象:选项 3

关于ruby-on-rails - 检查 Rails 中的 Controller 是否存在记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16682699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com