ActiveRecord的#存在?或从ActiveRecord :: RecordNotFound救援

时间:2009-05-22 09:05:14

标签: ruby-on-rails exception activerecord

处理以下类型情况的推荐方法是什么:

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

在我index的{​​{1}}方法中,我想检查当前用户是否存在cart_controller。 如果我执行Cart且购物车不存在,则会引发Cart.find(the_user_id)异常。 我看到了解决这个问题的两种方法:

1。从例外救援

RecordNotFound

2。使用ActiveRecord#存在?方法

 begin
    @cart = Cart.find(the_user_id)
    #more code here
 rescue ActiveRecord::RecordNotFound
    #the cart is empty message
 end

从我(有限的)关于exeption处理的知识我知道不建议以这种方式使用异常,但是每次都要进行额外的查询吗?

4 个答案:

答案 0 :(得分:34)

使用find_by_id而不是find:

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

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

答案 1 :(得分:23)

您可以尝试向用户对象询问其购物车。假设您已将用户分配到@user,那么如果用户有购物车,则为@user.cart。如果@user.cartnil,那么他们就没有。{/ p>

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

答案 2 :(得分:2)

你为什么不这样做......

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

答案 3 :(得分:0)

存在?除非ActiveRecord的人员对此进行了优化(我不会指望这一点),否则会产生一个SQL语句。

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