Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是否存在ActiveRecord?或从ActiveRecord中营救::RecordNotFound_Ruby On Rails_Exception_Activerecord - Fatal编程技术网

Ruby on rails 是否存在ActiveRecord?或从ActiveRecord中营救::RecordNotFound

Ruby on rails 是否存在ActiveRecord?或从ActiveRecord中营救::RecordNotFound,ruby-on-rails,exception,activerecord,Ruby On Rails,Exception,Activerecord,处理以下情况的建议方法是什么: 假设我有一个名为Cart的模型,它与模型Person具有1-1关系,并且具有相同的PK(用户id)。 在我的购物车控制器的索引方法中我想检查当前用户是否有购物车。 如果我执行了Cart.find(用户id)且购物车不存在,则引发RecordNotFound异常。 我认为有两种方法可以解决这个问题: 1.破例解救 2.使用ActiveRecord#是否存在?方法 根据我对exeption处理的(有限的)了解,我知道不建议以这种方式使用异常,但是每次进行额外的查询是否

处理以下情况的建议方法是什么:

假设我有一个名为
Cart
的模型,它与模型
Person
具有1-1关系,并且具有相同的PK(用户id)。

在我的
购物车控制器的
索引
方法中
我想检查当前用户是否有
购物车
。 如果我执行了
Cart.find(用户id)
且购物车不存在,则引发
RecordNotFound
异常。
我认为有两种方法可以解决这个问题:

1.破例解救 2.使用ActiveRecord#是否存在?方法
根据我对exeption处理的(有限的)了解,我知道不建议以这种方式使用异常,但是每次进行额外的查询是否值得?将导致更多的SQL语句,除非ActiveRecord人员对此进行了优化(我不会指望)


因此,我建议使用异常,它比SQL语句便宜得多。

您可以尝试向用户对象询问它的购物车。假设您已将该用户分配给
@user
,那么如果该用户有购物车,它将是
@user.cart
。如果
@user.cart
nil
,则它们没有


这假设您已正确设置了模型之间的关系。

使用按id查找,而不是查找:

@cart = Cart.find_by_id(params[:id])

如果它不存在,则为零,这样您可以根据需要在控制器/视图中检查“if@cart”

为什么不执行类似于

@cart = @user.cart || @user.cart.new
不用担心异常或if/else语句。 那么在你看来,你可能会有类似

<% if @cart.empty? # or whatever method you use to determine 
     # if there is nothing in the cart...maybe .blank? is fine? 
%>
    <p>Your cart is empty</p>
<% else %>
    <!-- loop through objects in your cart -->
<% end %>

你的车是空的


+1,好的。在这种情况下,这听起来是最好的办法。不幸的是,我的问题存在吗?vs rescue并没有让争论持续下去,我希望答案是好的,我不知道你们所说的持续争论是什么意思。如果您使用cart=cart.find(:id),那么如果未找到它,您将得到一个错误,您必须使用rescue捕获该错误。如果您使用cart=cart.find\u by_id(:id),那么cart将为nil,您可以对其进行测试@user.cart将是nil,或者是非常容易测试的cart。你可以做一些类似的事情,比如@cart=@user.cart#做cart的其他东西#不做cart的东西endYes,在这种情况下,这绝对是最好的选择。但我考虑的是一般情况,当我必须直接调用一个模型(无关联)(例如按id查找)时。似乎我也得到了答案,使用find_by_id,它不会引发执行选项。实际上,在您的情况下,您需要使用购物车。find_by_user_id(user_id)ActiveRecord现在有一个非常好的查询缓存。你真的不应该在控制流中使用异常。同意,没有必要使用异常,因为这不是一个真正的异常情况,它很可能会经常发生。+1是的,@user.cart是应该做的事情,并且不直接调用cart模型。我接受了李·欧文的回答,因为他是第一个应该是
@user.build\u cart
+1有趣的人。很高兴知道。谢谢在这种情况下,我将使用@user.cart。John的答案比我的更接近你的问题域,但如果模型不属于另一个(即单例模型或根模型),请将if视为一个额外的工具。爱死它了+1.
@cart = @user.cart || @user.cart.new
<% if @cart.empty? # or whatever method you use to determine 
     # if there is nothing in the cart...maybe .blank? is fine? 
%>
    <p>Your cart is empty</p>
<% else %>
    <!-- loop through objects in your cart -->
<% end %>