我在Product
和Order
之间有@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);
}
会为任何类型的集合返回相同的结果。
答案 0 :(得分:3)
请在size
上查看此文档,了解Rails:Rails ActiveRecord Size Documentation
此外,count
的文档也在这里:Rails ActiveRecord Count Documentation
Ruby和ActiveRecord方法length
,size
和count
彼此完全不同。
您的第一个示例:>> @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)
size
是products
集合的内存大小。您将看到在运行该方法时,日志中没有SQL查询。但是,如果你运行count
,你会发现它实际上产生了一个sql查询(在rails控制台中尝试这个)并且因为这个顺序没有持久化,所以你回到了0.
你应该使用哪一个?根据对象生命周期的位置,无论您认为真实的来源。