AREL:具有显式列的公用表表达式

时间:2016-10-07 19:13:32

标签: ruby-on-rails common-table-expression arel

AREL README简要介绍了CTE,但未提及如何处理CTE中的显式列列表。例如。 CTE如:

WITH my_query (col1, col2, col3, col4) AS ( SELECT a, b, a, b FROM my_table )

我能够使用复杂的SqlLiteral生成上述内容,但是有更好的方法吗?

示例解决方案:

cte_table = Arel::Table.new(:source_qry) cte_qry = Arel::Nodes::SqlLiteral.new("source_qry (col1, col2, col3, col4)") user_qry = Arel::Nodes::SqlLiteral.new("(SELECT a, b, a, b FROM my_table)") cte_table_qry = Arel::Nodes::As.new(cte_qry, user_qry) cte_table.project(%w(col1 col2)).with(cte_table_qry)

1 个答案:

答案 0 :(得分:0)

我认为Arel暂时不会处理这个问题。我不知道如何彻底解决这个问题,但可以建议如何改进你的解决方案:

cte_table = Arel::Table.new(:source_qry)
cte_qry = Arel.sql("source_qry (col1, col2, col3, col4)")

my_table = Arel::Table.new(:my_table)
user_qry = my_table.project(my_table[:a], my_table[:b], my_table[:a], my_table[:b])

cte_table_qry = Arel::Nodes::As.new(cte_qry, user_qry)

cte_table.project(cte_table[:col1], cte_table[:col2]).with(cte_table_qry)