16527


多対多関係のOrderモデルとProductモデルを持っていて、

一つのorderは複数のproductsと紐付いています。

orderを持っているproductsの中で一番値段の高いproductの価格を見て、orderをソートしたいです。

自分が書いたコードはこんな感じです:  
`@orders =
Order.group(arel_table[:id]).order(Product.arel_table[:price].maximum)`

こうやって昇順のソートはうまく行けましたが、以下のように降順でordersをソートをかけると  
`@orders =
Order.group(arel_table[:id]).order(Product.arel_table[:price].maximum.desc)`

こんなエラーメッセージが返された :  
`undefined method ``desc' for #<Arel::Nodes::Max:0x007fb2ab9104a0>`

降順にソートするにはどう書けばいいですか？

<https://stackoverflow.com/questions/32517474/rails-4-error-when-trying-to-
sort-by-using-arel-table-maximum-desc>  
↑英語のstackoverflowにも質問してます。


CC BY-SA 3.0
2015-09-11T08:00:46.360
16514
2015-09-11T23:06:40.430
2017-05-23T12:38:55.307
-1
12285
question
ruby-on-rails mysql
Rails 4 : arel_table.maximum.descでソートを行うときエラー発生


SQLが2回発行されますが、こんな感じで実現できるのでは？

[code]

    order_ids = Order.joins(:products).group('orders.id').order('maximum_products_price desc').maximum('products.price').keys
    sanitized_query = ActiveRecord::Base.send(:sanitize_sql_array, ["field(id, ?)", order_ids])
    Order.order(sanitized_query)
    
[/code]

集計処理が絡むSELECTはActiveRecordとあまり相性が良くないのでクエリを分けたり、生SQLを書いたりして、コードのスマートさをあえて捨てた方が素早く実装できる気がします。

参考: [Rails - MySQL+ActiveRecordで、与えられた配列順にorderしたい時 -
Qiita](http://qiita.com/chezou/items/8c0481044c954c4bca3b)

### EDIT

Arelで完結させるのであれば、こんなふうに書けそうです。

[code]

    @orders = Order
                .group(arel_table[:id]) # Order.arel_table[:id] の間違い？
                .order(Arel::Nodes::Descending.new(Product.arel_table[:price].maximum))
    
[/code]

上のコードはArelのコードを参考にしています。

[Module: Arel::OrderPredications — Documentation for rails/arel
(master)](http://www.rubydoc.info/github/rails/arel/Arel/OrderPredications#desc-
instance_method)

試してみてください。


CC BY-SA 3.0
2015-09-11T13:26:59.177
16527
2015-09-11T23:06:40.430
2015-09-11T23:06:40.430
85
85
16514
answer