Railsでdefault_scope使うときの注意点
Railsが2.3.2以降のバージョンだとActiveRecordの機能でdefault_scopeなるものが使える。
これすごく良いのですが、注意が足らなくてエラーが出たことがあったのでメモ。
default_scopeの使い方としては、
User.where(deleted: 0).order(‘id DESC, name ASC’)
みたいな条件をよく使う場合はuser.rbに
class User < ActiveRecord::Base default_scope{ where(deleted: 0). order(‘id DESC, name ASC’) } end
とすれば、
@users = User.all
でUserモデルのレコードを引っ張ってくるときに、default_scopeで指定した条件で検索してオブジェクトを生成してくれる素敵な機能。
しかし、
User.joins(:friends)
とかすると、usersテーブルとfriendsテーブルががっちんこするので、users.idとfriends.idの2つのカラムがセレクトされることになる。
さっき、default_scopeの指定でorder(‘id DESC’)と指定しているので、本当だったらUserはidの降順でソートしたいわけだけど、idカラムが2ついるじゃねぇかと怒られます。
なので、joinsしてorderとかするときは
default_scope{ where(deleted: 0). order(‘users.id DESC, users.name ASC’) }
と親切に指定してあげると、気持よくなれます。
ピザ食べて気持ちよくなりたい。