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 %>