创建新记录时的轨迹计数与大小模型记录

创建新记录时的轨迹计数与大小模型记录

问题描述:

我在我的Rails应用程序中有一个购物车。我试图显示当前用户购物车中的物品数量,并在用户添加物品时异步更新。我在同一控制器操作中显示(并更新)此计数器,您可以在其中创建新购物车项目。该行为是这样的:创建新记录时的轨迹计数与大小模型记录

在查看

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

所以每次查看加载current_user.cart_items.size计数时间是一个,因为太多Action正在实例化一个新的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://*.com/questions/ 7842920 /如果主动记录对象是新建或创建的) –

可以使用count方法,而不是使用size。 对于解释,你需要知道如何size执行:

  • 如果一个集合被加载,该方法将计算在收集元素(如数组)
  • 如果没有加载的集合,该法执行查询。

在您的情况,您要执行一个查询作为count方法做: current_user.cart_items.count

+0

就是这样。谢谢。很好的解释。 – BigRon

结帐new_record?

返回true如果此对象尚未保存 - 也就是说,该对象的记录 不会在数据库中还不存在;否则,返回 错误。

所以你的情况你有这样的事情:

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