私はActiveRecordの4.2/AREL 6.0/Postgresのを使用して、次の入力を持っている:Arel NamedFunctionノード内でORDER BYを使用するきれいな方法はありますか?
私が欲しいArel::Table
(
column
)
Arel::Nodes::Ordering
ノード(orders
)から
Arel::Attributes::Attribute
Attribute
で指定された列を含み、Ordering
ノードによって順序付けされた集計関数を使用してArel::Nodes::NamedFunction
を構築します。のように結果のSQLが何かを見ることができる:私の現在のソリューションは、まず、
Arel::Nodes::SelectStatement
を構築し、それに列と注文を追加し、SQLに変換し、リードSELECT
キーワードを取り除く、それをラップすることですarray_agg("posts"."id" ORDER BY "posts"."published_at" DESC)
そして
Arel::Nodes::SqlLiteral
にNamedFunction
ノードにそれを渡す:select = Arel::Nodes::SelectStatement.new select.cores.last.projections << column select.orders = orders sql = select.to_sql.sub(/^SELECT /, '') literal = Arel::Nodes::SqlLiteral.new(sql) array_agg = Arel::Nodes::NamedFunction.new('array_agg', [literal])
明らかに、これは巨大なハックです。
集計関数の外に
ORDER BY
を格納することは、集計に使用されたGROUP BY
と競合するため、オプションではありません。これを悪用することなくこれを達成するためのよりクリーンな方法がありますか
SelectStatement
/SelectManager
?
私の質問は集計関数の中で 'ORDER BY'を使うことについて書かれていましたが、あなたが記述しているのは普通の' SELECT ... FROM ... ORDER BY'です。 – felixbuenemann