我的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
因此,每次加载视图时,由于Action正在实例化新的cart_item,因此current_user.cart_items.size
计数太多了。
我在控制台中尝试了验证:
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 :(得分:1)
您可以使用count
方法而不是size
。
要获得解释,您需要了解size
的执行情况:
在您的情况下,您希望以count
方法执行查询:
current_user.cart_items.count
答案 1 :(得分:0)
结帐new_record?
:
如果尚未保存此对象(即记录),则返回true 对于该对象尚未存在于数据库中;否则,返回 假的。
所以在你的情况下,你会有这样的事情:
@cart_item = current_user.cart_item.new
@cart_items.new_record? # false