2015-06-21 3 views
0

У меня есть корзина для покупок в моем приложении Rails. Я пытаюсь отобразить количество элементов, которые в настоящее время находятся в корзине пользователя, и обновлять их асинхронно, когда пользователь добавляет элементы. Я показываю (и обновляю) этот счетчик в том же самом действии контроллера, где вы можете создавать новые элементы корзины. Поведение как этот:Rails count vs. size записи модели при создании новой записи

В представлении

<%= link_to "#{current_user.cart_items.size} Items in Cart", cart_items_path, class: "btn btn-default" %> 

В контроллере

def index 
    @cart_item = current_user.cart_item.new # instantiate a new cart_item to be used in a form to create a new cart_item in this index action 
end 

Таким образом, каждый раз, когда View загружается счетчик current_user.cart_items.size является слишком много, так как Действие создает экземпляр нового cart_item.

Я попробовал его в консоли, чтобы проверить:

2.2.1 :022 > current_user.cart_items.size 
=> 2 
2.2.1 :023 > current_user.cart_items.new 
=> #<CartItem id: nil, user_id: 1, product_id: nil, created_at: nil, updated_at: nil> 
2.2.1 :024 > current_user.cart_items.size 
=> 3 

Есть ли способ не рассчитывать объект, который только создан экземпляр еще не спасен?

Примечание: Я попытался это с build тоже на месте new и имела тот же результат.

+0

возможный дубликат [Определить, если ActiveRecord объект является новым или создания] (http://stackoverflow.com/questions/ 7842920/define-if-activerecord-object-is-new-or-created) –

ответ

1

Вы можете использовать count метод вместо использования size. Для объяснения, вы должны знать, как size выполняет:

  • Если загружен сбор, метод будет считать элементы коллекции (в виде массива)
  • Если нет загруженной коллекции, способ выполнить запрос.

В вашей ситуации, вы хотите, чтобы выполнить запрос как count метод сделать: current_user.cart_items.count

+0

Вот и все. Спасибо. Отличное объяснение. – BigRon

0

заказ new_record?:

Возвращает истину, если этот объект не был сохранен еще - то есть, запись для объекта не существует в базе данных еще; в противном случае возвращает false.

так в вашем случае, если вы хотите иметь что-то вроде этого:

@cart_item = current_user.cart_item.new 
@cart_items.new_record? # false