令人困惑的`count`和`size`之间的区别

时间:2017-02-23 16:23:34

标签: ruby-on-rails ruby ruby-on-rails-4 collections

我在ProductOrder之间有@order个关系:

所以我创建了一个新的@order = Order.new(products: [my_product]) ,并为其分配了这样的产品:

>> @order.products
=> #<ActiveRecord::Associations::CollectionProxy [#<Product id: 145, title: "Some Product" ...>]>

这在控制台中显示如下:

>> @order.products.count
=> 0

>> @order.products.to_a.count
=> 1

>> @order.products.size
=> 1

>> @order.products.count
=> 0

由于某种原因,我不明白我得到以下结果:

size

我现在要使用size方法,因为我想知道我有多少产品。但我希望count applyExtraFilter() { this.moreFilter = !this.moreFilter; this.allItems = this.listings; if (this.deliveryConcession[0].checked) { this.allItems = this.allItems.filter(fil => fil.seatingConcession.parking == this.deliveryConcession[0].checked); } if (this.deliveryConcession[1].checked) { this.allItems = this.allItems.filter(fil => fil.seatingConcession.parking == this.deliveryConcession[2].checked); } if (this.deliveryConcession[2].checked) { this.allItems = this.allItems.filter(fil => fil.seatingConcession.parking == this.deliveryConcession[3].checked); } if (this.seatConcession[0].checked) { this.allItems = this.allItems.filter(fil => fil.seatingConcession.parking == this.seatConcession[0].checked); } if (this.seatConcession[1].checked) { this.allItems = this.allItems.filter(fil => fil.seatingConcession.parking == this.seatConcession[1].checked); } if (this.seatConcession[2].checked) { this.allItems = this.allItems.filter(fil => fil.seatingConcession.parking == this.seatConcession[3].checked); } this.setPage(1); } 会为任何类型的集合返回相同的结果。

2 个答案:

答案 0 :(得分:3)

请在size上查看此文档,了解Rails:Rails ActiveRecord Size Documentation
此外,count的文档也在这里:Rails ActiveRecord Count Documentation

Ruby和ActiveRecord方法lengthsizecount彼此完全不同。

您的第一个示例:>> @order.products.count正在尝试调用Rails ActiveRecord count方法(计算数据库中的记录),而另一个>> @order.products.to_a.count示例正在尝试调用Ruby {{1}方法(计算内存中容器中没有连接到数据库的项目)。

因此,在使用count时回答您的问题,您只是在内存中而不是在DB中创建对象。您可以阅读>> @order = Order.new(products: [my_product])上的文档。我发布了上面的链接,告诉您它为什么能够告诉您收集的长度或DB中的记录数,具体取决于其使用的上下文。 / p>

希望这有帮助!

答案 1 :(得分:2)

sizeproducts集合的内存大小。您将看到在运行该方法时,日志中没有SQL查询。但是,如果你运行count,你会发现它实际上产生了一个sql查询(在rails控制台中尝试这个)并且因为这个顺序没有持久化,所以你回到了0.

你应该使用哪一个?根据对象生命周期的位置,无论您认为真实的来源。