2016-04-03 9 views
0

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 einer Arel::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?

Antwort

2

Ich weiß nicht, ob das für Sie funktioniert, aber ich fand, dass dies eine saubere Möglichkeit ist, in DESC-Reihenfolge zu bestellen. Sie verwenden eine andere Syntax als ich, aber es scheint, als ob Sie das suchen.

arel = Post.arel_table 
query = arel.project(Arel.select('*')) 
query.order(arel[:published_at].desc).to_sql 

Dies ist die beste Schätzung, die ich für das habe, was Sie versuchen zu tun.

+0

Was Sie beschreiben, ist eine normale 'SELECT ... FROM ... ORDER BY', während meine Frage ging 'ORDER BY' innerhalb einer Aggregatfunktion zu verwenden. – felixbuenemann

Verwandte Themen