うまとま君の技術めも

2015年新卒入社した社畜の勉強内容などなど

Railsでdefault_scopeの解除方法

環境

default_scopeの設定方法

orderwhere文などをdefault_scopeメソッドに渡してあげればおk

class User < ActiveRecord::Base
  ...
  default_scope { order(email: :asc) }
  default_scope { where(deleted_at: nil) }
  ...
end

orderの解除方法

reorderorderのみ解除できる。

User.all
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL  ORDER BY `users`.`email` ASC"
User.reorder(nil)
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL
User.reorder(id: :desc)
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL  ORDER BY `users`.`id` DESC"

特定のscopeの解除方法

exceptまたはunscopeで解除することが出来る。
unscopeの方はexceptよりも細かい設定をすることが出来るようです。

User.all
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL  ORDER BY `users`.`email` ASC"
User.except(:order)
User.unscope(:order)
    #=> "SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL
User.except(:where)
User.unscope(:where)
User.unscope(where: :deleted_at)
    #=> "SELECT `users`.* FROM `users`  ORDER BY `users`.`id` DESC"

感想

今回は環境がRails4だったのでRails3などでは結果が違うかもしれないですね。

参考