【问题标题】:Rails count vs. size model records when creating new record创建新记录时,Rails 计数与模型记录的大小
【发布时间】:2015-09-06 20:23:46
【问题描述】:

我的 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

因此,每次加载 View 时,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 进行了尝试,结果相同。

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

您可以使用count 方法代替size。 为了解释,你需要知道size是如何执行的:

  • 如果加载了集合,该方法将对集合中的元素进行计数(作为数组)
  • 如果没有加载集合,该方法执行查询。

在您的情况下,您希望像 count 方法那样执行查询: current_user.cart_items.count

【讨论】:

  • 就是这样。谢谢你。很好的解释。
【解决方案2】:

结帐new_record?:

如果此对象尚未保存,则返回 true ——即一条记录 因为该对象在数据库中尚不存在;否则,返回 假的。

所以你的情况是这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2021-12-31
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多