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に分かれているのが、ポイントでした。。。
Author And Source
この問題について(railsでModelから引っこ抜いたデータの並び順を変えるOrderの使い方を極める), 我々は、より多くの情報をここで見つけました https://qiita.com/makitokezuka/items/edca67ed23fa71b90997著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .