せたがやえんじにあぶろぐ

Ruby | Rails | iPhone | Web

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’) }

と親切に指定してあげると、気持よくなれます。

ピザ食べて気持ちよくなりたい。