Ich verwende Active 4.2/Arel 6.0/Postgres und haben folgende Eingänge:Gibt es eine saubere Möglichkeit, ORDER BY in einem Arel NamedFunction Node zu verwenden?
- Ein
Arel::Attributes::Attribute
von einerArel::Table
(column
) - Mehrere
Arel::Nodes::Ordering
Knoten (orders
)
Ich möchte um eine Arel::Nodes::NamedFunction
mit einer Aggregatfunktion zu erstellen, die die Spalte enthält, die von Attribute
angegeben wird und von den Knoten Ordering
bestellt wird.
Die resultierende SQL könnte ungefähr so aussehen:
array_agg("posts"."id" ORDER BY "posts"."published_at" DESC)
Meine aktuelle Lösung ist zunächst eine Arel::Nodes::SelectStatement
zu bauen, fügen Sie die Spalte und Aufträge, konvertieren zu SQL, Streifen der führenden SELECT
Stichwort, wickeln in einem Arel::Nodes::SqlLiteral
und passieren, dass an den NamedFunction
Knoten:
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])
Offensichtlich ist dies ein großer Hack.
Das Halten der ORDER BY
außerhalb der Aggregatfunktion ist keine Option, weil es mit dem GROUP BY
kollidieren würde, das verwendet wird, um zu aggregieren.
Also gibt es eine sauberere Möglichkeit, dies zu erreichen, ohne SelectStatement
/SelectManager
zu missbrauchen?
Was Sie beschreiben, ist eine normale 'SELECT ... FROM ... ORDER BY', während meine Frage ging 'ORDER BY' innerhalb einer Aggregatfunktion zu verwenden. – felixbuenemann