Rails 4(arel?)加入子查询

时间:2015-02-17 18:12:20

标签: ruby-on-rails-4 arel

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

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

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列。

实际情况比较复杂,但也许我错过了这个简化情景下的基本原则?

1 个答案:

答案 0 :(得分:3)

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