【问题标题】:ActiveRecord query: order by a sum on an included modelActiveRecord 查询:按包含模型的总和排序
【发布时间】:2011-03-15 13:50:35
【问题描述】:
  • 项目 has_many :items
  • 项目属于_to :project

我正在尝试按项目的总价对项目进行排序。比如:

Project.includes(:items).order('SUM(items.price)')

使用此代码,ActiveRecord 仅返回第一个项目。我错过了什么?

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    我还没有尝试过 v3 的东西,但我想应该是这样的

    Product.joins(:items).group('products.id').order('SUM(items.price)')
    

    【讨论】:

      【解决方案2】:
      Project.find_by_sql "
        select projects.* 
        from projects 
        left join (
          select project_id, sum(price) as items_sum
          from items 
          group by project_id) as sums on
        project.id = sums.project_id
        order by sums.items_sum
      

      以上 SQL 应该适用于大多数数据库系统(MySQL、PostgreSQL、...)。

      AR 记录includes 主要用作预加载解决方案。而且我不确定您是否可以这样使用它 - 对父表的记录进行排序。

      【讨论】:

      • 感谢格雷格的快速回答。不通过 find_by_sql 就没有办法做到这一点?
      • 可以传递整个连接字符串:join参数。这是品味问题,但对我来说,干净的 SQL 看起来比混合的 AR / SQL 更好。也许 Rails 3 AREL 更灵活,因为允许在干净的 AR 中编写 SQL。但我对 AREL 还不是很了解。
      • 干净的 sql 虽然很漂亮,但基本上违背了 ORM 的目的。
      • AR/ORM 的目的是为程序员节省时间。对于基础操作,AR 服务非常好。对于复杂的查询,有时编写纯 SQL 会更快。
      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      相关资源
      最近更新 更多