一尘不染

Rails 3查询关联计数的条件

mysql

在带有mysql的Rails 3中,假设我有两个模型,Customers和Purchases,显然是purchase_to
customer。我想找到2个或更多订单的所有客户。我可以简单地说:

Customer.includes(:purchases).all.select{|c| c.purchases.count > 2}

有效地,上面的行查询Customer.all和Purchase.all的大小,然后在ruby中进行“选择”类型的处理。在大型数据库中,我更希望避免在ruby中进行所有这种“选择”计算,而让mysql进行处理,只给我列出合格的客户。这既快得多(因为对mysql进行了更好的调整),而且大大减少了数据库的带宽。

不幸的是,我无法将代码与rails中的构建块(位置,拥有,分组等)结合起来,以实现此目的,这在(伪代码)的行中有所体现:

Customer.joins(:purchases).where("count(purchases) > 2").all

我将选择直接的MySql解决方案,尽管我更喜欢在优雅的Rails框架中弄清楚这一点。


阅读 210

收藏
2020-05-17

共1个答案

一尘不染

在这一点上,关于这些东西的文档还很少。如果您要进行更多与此类似的查询,我会考虑使用Metawhere。使用Metawhere,您可以执行此操作(或类似的操作,不确定语法是否正确):

Customer.includes(:purchases).where(:purchases => {:count.gte => 2})

这样做的好处在于,MetaWhere仍使用ActiveRecord和arel来执行查询,因此它与“新” rails 3进行查询的方式一起使用。

另外,您可能不想.all在最后调用,因为这将导致查询对数据库执行ping操作。相反,您希望使用延迟加载,并且在您实际需要数据之前(在视图中或其他处理实际数据的方法中)才访问数据库。

2020-05-17