railsでModelから引っこ抜いたデータの並び順を変えるOrderの使い方を極める


特に極める、というほどではないんですが、色々と実際に試してみたので備忘録代わりに。

基本的な使い方

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に分かれているのが、ポイントでした。。。