2016-04-03 1 views
0

私はActiveRecordの4.2/AREL 6.0/Postgresのを使用して、次の入力を持っている:Arel NamedFunctionノード内でORDER BYを使用するきれいな方法はありますか?

私が欲しい Arel::Tablecolumn
  • いくつかArel::Nodes::Orderingノード(orders
  • から

    • Arel::Attributes::AttributeAttributeで指定された列を含み、Orderingノードによって順序付けされた集計関数を使用してArel::Nodes::NamedFunctionを構築します。

      のように結果のSQLが何かを見ることができる:私の現在のソリューションは、まず、Arel::Nodes::SelectStatementを構築し、それに列と注文を追加し、SQLに変換し、リードSELECTキーワードを取り除く、それをラップすることです

      array_agg("posts"."id" ORDER BY "posts"."published_at" DESC) 
      

      そしてArel::Nodes::SqlLiteralNamedFunctionノードにそれを渡す:

      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

    答えて

    2

    これがうまくいくかどうかわかりませんが、これはDESCの順序で注文するきれいな方法であることがわかりました。あなたは私といくつかの異なる構文を使用していますが、これはあなたが探しているようです。

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

    これは、あなたがしようとしているものについて私が持っている最高の推測です。

    +0

    私の質問は集計関数の中で 'ORDER BY'を使うことについて書かれていましたが、あなたが記述しているのは普通の' SELECT ... FROM ... ORDER BY'です。 – felixbuenemann

    関連する問題