Sql Arel连接子查询

Sql Arel连接子查询,sql,ruby-on-rails,join,arel,Sql,Ruby On Rails,Join,Arel,我是Rails和Arel的新手 我创建了一个连接查询,但看起来写得很糟糕 join_query = ActiveRecord::Base.connection.execute <<~SQL.strip_heredoc ( SELECT schools.name, sum(q.enrollment), count(*) FROM schools LEFT JOIN ( SELECT sites.s

我是Rails和Arel的新手 我创建了一个连接查询,但看起来写得很糟糕

join_query = 
ActiveRecord::Base.connection.execute <<~SQL.strip_heredoc
        (
          SELECT schools.name, sum(q.enrollment), count(*) FROM schools LEFT JOIN
            (
              SELECT sites.school_id, sites.enrollment  FROM sites JOIN projects ON
              sites.project_id = projects.id
              WHERE sites.school_id IS NOT NULL and projects.type IN ('Startup') AND projects.deleted_at IS NULL
            ) q
          ON q.school_id = schools.id
          GROUP BY schools.name
        )
      SQL
join_query.values
join\u查询=

ActiveRecord::Base.connection.execute这就是我能想到的给定SQL:

schools = Arel::Table.new("schools")
sites = Arel::Table.new("sites")
projects = Arel::Table.new("projects")

join = sites.project(:school_id, :enrollment)
  .join(projects).on(sites[:project_id].eq(projects[:id]))   
  .where(
    sites[:school_id].not_eq(nil)
    .and(projects[:type].in("Startup"))
    .and(projects[:deleted_at].eq(nil))
  )

q = Arel::Table.new(join).alias(:q)

schools.project(:name, q[:enrollment].sum, Arel.star.count)
  .join(join, Arel::Nodes::OuterJoin).on(q[:school_id].eq(schools[:id]))
  .group(schools[:name])
作为一名新手,以下是我经常访问的一些参考资料:

(官方文件)

(非常有用的备忘单,但不完整)

(左外连接示例)


(Arel综合指南)

太棒了!多亏了你,我终于成功了。别名起了作用。我从所学的东西中得出要点