我必须更新与 CTE 建立关系的搜索构建器。这是必要的,因为首先构建了一个复杂的关系(包括 DISTINCT、JOIN 等),然后必须对其结果进行排序——所有这些都在一个查询中。
以下是对事物的简化看法:
rel = User.select('DISTINCT ON (users.id) users.*').where(<lotsastuff>)
rel.to_sql
# SELECT DISTINCT ON (users.id) users.*
# FROM "users"
# WHERE <lotsastuff>
rel2 = User.from_cte('cte_table', rel).order(:created_at)
rel2.to_sql
# WITH "cte_table" AS (
# SELECT DISTINCT ON (users.id) users.*
# FROM "users"
# WHERE <lotsastuff>
# ) SELECT "cte_table".* FROM "cte_table"
# ORDER BY "cte_table"."created_at" ASC
它的美妙之处在于rel2
响应如预期的那样count
。
该from_cte
方法由似乎已被放弃的“posgres_ext”gem 提供。因此,我正在寻找另一种rel2
从rel
.
Arel 文档提到了一个在这里似乎没有帮助的案例。
关于如何到达那里的任何提示?非常感谢!
PS:我知道如何通过首先选择所有用户 ID 来对查询执行此操作,然后使用IN
这些 ID 构建一个查询并在那里订购。但是,我很好奇这是否也可以通过一个查询(有或没有 CTE)来实现。