ActiveRecord # существует? или спасение от ActiveRecord :: RecordNotFound - PullRequest
17 голосов
/ 22 мая 2009

Каков рекомендуемый способ решения следующих ситуаций:

Предположим, у меня есть модель с именем Cart, которая имеет отношение 1-1 к модели Person и тот же PK (идентификатор пользователя).

В методе index моего cart_controller я хочу проверить, существует ли Cart для текущего пользователя. Если я делаю Cart.find(the_user_id), а корзина не существует, то возникает исключение RecordNotFound.
Я вижу два пути решения этой проблемы:

1. спасение от исключения

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

2. использовать ActiveRecord # существует? Метод

 if Cart.exists?(the_user_id)
    @cart = Cart.find(the_user_id)
    #more code here
 else
    #the cart is empty message
 end

Из моих (ограниченных) знаний об обработке исключений я знаю, что не рекомендуется использовать исключения таким образом, но стоит ли каждый раз делать дополнительный запрос?

Ответы [ 4 ]

34 голосов
/ 22 мая 2009

Используйте find_by_id вместо find:

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

ноль, если он не существует, так что вы можете проверить «если @cart» в вашем контроллере / представлении при необходимости

23 голосов
/ 22 мая 2009

Вы можете попробовать запросить у пользователя объект для его корзины. Допустим, у вас есть пользователь, назначенный на @user, тогда, если у пользователя есть корзина, это будет @user.cart. Если @user.cart равно nil, то у них его нет.

Предполагается, что отношения между моделями установлены правильно.

2 голосов
/ 23 мая 2009

Почему бы тебе не сделать что-то вроде ...

@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 %>
0 голосов
/ 22 мая 2009

существует? приведет к еще одному SQL-выражению, если ребята из ActiveRecord не оптимизируют это (я бы на это не рассчитывал).

Поэтому я бы посоветовал использовать исключение, оно намного дешевле, чем оператор SQL.

...