default_scopeを個別に外す。

default_scopeを全部外すにはunscopedだったのですが、特定の条件だけ外すにはどうしたらよいのか調べていたら、こちらにたどり着きました。

default_scopeのorderをキャンセルする – とある技術屋の戯言

Model.reorder(‘id DESC’)

おーなるほどと思いつつ、他にもあるのかとドキュメントを見に行ったら・・・([ show source ]をクリック)

Module: ActiveRecord::QueryMethods

# File activerecord/lib/active_record/relation/query_methods.rb, line 56
56: def reorder(*args)
57: ActiveSupport::Deprecation.warn "reorder is deprecated. Please use except(:order).order(…) instead", caller
58: relation = clone

ん?

class Article < ActiveRecord::Base
  default_scope where(:disclosed => true).order('disclosed_at DESC')
end

Article.all #=> SELECT "articles".* FROM "articles" WHERE ("articles"."disclosed" = 't') ORDER BY disclosed_at DESC
Article.except(:where).all #=> SELECT "articles".* FROM "articles" ORDER BY disclosed_at DESC
Article.except(:order).all #=> SELECT "articles".* FROM "articles" WHERE ("articles"."disclosed" = 't')

ほほー。

タイトルとURLをコピーしました