处理以下类型情况的推荐方法是什么:
假设我有一个名为Cart
的模型,它与模型Person
具有1-1关系,并且具有相同的PK(用户的id)。
在我index
的{{1}}方法中,我想检查当前用户是否存在cart_controller
。
如果我执行Cart
且购物车不存在,则会引发Cart.find(the_user_id)
异常。
我看到了解决这个问题的两种方法:
RecordNotFound
begin
@cart = Cart.find(the_user_id)
#more code here
rescue ActiveRecord::RecordNotFound
#the cart is empty message
end
从我(有限的)关于exeption处理的知识我知道不建议以这种方式使用异常,但是每次都要进行额外的查询吗?
答案 0 :(得分:34)
使用find_by_id而不是find:
@cart = Cart.find_by_id(params[:id])
如果它不存在则为零,因此您可以根据需要检查控制器/视图中的“if @cart”
答案 1 :(得分:23)
您可以尝试向用户对象询问其购物车。假设您已将用户分配到@user
,那么如果用户有购物车,则为@user.cart
。如果@user.cart
为nil
,那么他们就没有。{/ 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语句便宜得多。