特に極める、というほどではないんですが、色々と実際に試してみたので備忘録代わりに。
基本的な使い方
controller
#Userテーブルのカラム、nameでソート どっちの書き方でもOK
User.order(:name)
User.order('name')
#Userテーブルのカラム、nameで、降順にソート
User.order('name DESC')
=> 昇順のASCは通常省略されている、と考える
#2つのカラムname,emailでソート
User.order(:name, :email)
#2つのカラムでソートだけど、名前だけ降順
User.order({ name: :desc }, :email)
## ちょっと変わった使い方
controller
#.unscopeで一度並び替えたものをキャンセル
User.order(:email).unscope(:order)
=> User.all と同じ結果となる(orderがキャンセルされている)
※ちなみに、unscopeには、whereとかselectとかもハッシュで渡すとキャンセル出来るらしい。
何に使うかは不明。
INCLUDE/JOINした他のテーブルのカラムでORDER BY
ここがかなり詰まったので。。。
controller
#Userテーブルに紐づくCountryテーブルの国名で並び替えたい場合。
User.joins(:country).includes(:country).order("countries.name")
ポイント
・orderで他のテーブルを使う場合は、joinsでINNER JOINをしてあげないと探せない
・でも、この後国名を一覧で表示するときとかはjoinsだと、N+1問題起こしてしまうので、includesもあわせて行う(なんか無駄な気がする。。。)
・で、order()内のモデル名は必ず複数形(joinは単数形だから結構はまった。。。)
joinsは、1行のSQLでINNER JOINを発行しているけど、includeは、2行のSQLに分かれているのが、ポイントでした。。。