当前位置: 首页 > 面试题库 >

Rails 3查询关联计数的条件

戚京
2023-03-14
问题内容

在带有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框架中弄清楚这一点。


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 如何以模块化方式构成Database.Esqueleto查询,以便在定义“基本”查询和相应的结果集之后,可以通过添加其他内部联接和where表达式来限制结果集。 另外,由于基本查询不是照此执行的,而是使用LIMIT和OFFSET的修改版本,因此如何将返回实体列表(或字段元组)的基本查询转换为对结果集进行计数的查询。 Yesod书中采用的以下不正确的Haskell代码段有望阐明我的目标。

  • 简介 Cabal-DB 的关联数据查询主要用了两个方法:->has('table') 和->belongs('table'), 因为其实数据库关联关系只有两种,一种是拥有(has)另一种是属于(belongs),如: 用户拥有更多个文章 文章拥有多个标签 文章属于一个用户 文章标签关联记录属于一个标签和一篇文章 语法 拥有关系查询语法: $row->has($name, $foreignKeyOr

  • 级联关系是一个数据库实体的概念,有 3 种级联关系,分别是一对一级联、一对多级联以及多对多级联。例如,一个角色可以分配给多个用户,也可以只分配给一个用户。大部分场景下,我们都需要获取角色信息和用户信息,所以会经常遇见以下 SQL。 在级联中存在 3 种对应关系。 一对多的关系,如角色和用户的关系。通俗的理解就是,一家软件公司会存在许多软件工程师,公司和软件工程师就是一对多的关系。 一对一的关系。每

  • subcompany.hbm.xml 子单位表 branch.java 指定表 我需要帮助编写条件查询使用提供的SQL。

  • 接口说明 为了让用户更清晰的比对场景中的数据,如历史数据对比、规划前后的数据对比等,Wish3DEarth团队新增了查询关联场景的接口,开发者可以通过该接口,来获取主屏与副屏之间的关联性。 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/contrasts/1.0.0/get 是否需要登录 否 请求字段说明 参数 类型 请

  • 一个user有多个tel,是一对多的关系,现在我只需要查最新的一条即可,没必要把tel全查出来,应该怎么写?