创建新记录时的轨迹计数与大小模型记录
问题描述:
我在我的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
,它也有同样的结果。
答
可以使用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
的可能重复[确定是否ActiveRecord的对象是新的或创建的(http://*.com/questions/ 7842920 /如果主动记录对象是新建或创建的) –