创建新记录时,Rails计数与大小模型记录

时间:2015-06-21 07:00:43

标签: ruby-on-rails ruby

我的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并且结果相同。

2 个答案:

答案 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