【问题标题】:Rails 4 (arel?) join on subqueryRails 4(arel?)加入子查询
【发布时间】:2015-02-17 18:12:20
【问题描述】:

我的产品表在不同日期有每个产品的多个版本。

我想找到按 version_id 分组的每个 max(date)。 我想要一个 ActiveRecord::Relation 对应于该最大日期和 version_id 的行。

在 app/models/product.rb 中:

    def self.latest_versions
      select("max(date) as max_date").
      select("version_id").
      group("version_id")
    end

如何将 Product 与此“临时表”结合起来,以获取与返回的日期和版本 ID 匹配的所有产品?我显然不能在上面的方法中选择 :id 因为它不是 Group By 列。

实际场景更复杂,但我可能遗漏了属于这种简化场景的基本原则?

【问题讨论】:

    标签: ruby-on-rails-4 arel


    【解决方案1】:
    def self.latest_versions
      t = Product.arel_table
    
      subquery = t.
        project(
          t[:date].maximum.as("max_date"),
          t[:version_id]
        ).
        group(t[:version_id]).
        as('subquery')
    
      Product.
        joins(Arel::Nodes::InnerJoin.new(subquery,
              Arel::Nodes::On.new(
                t[:version_id].eq(subquery[:version_id]).and(
                t[:date].eq(subquery[:max_date])))))
    end
    

    【讨论】:

    • 太棒了!我试图使用join(subquery, Arel::Nodes::OuterJoin)(在其他地方建议过的东西),但它在导航时遇到了麻烦。 Rails(或其他)会抱怨无法访问 SelectManager 和其他相关对象(取决于我沮丧的编码尝试的排列方式;))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2014-05-16
    相关资源
    最近更新 更多