More than 1 year has passed since last update.

Railsのdefault_scopeは悪だ!(default_scope is evil) ということらしい
http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html

rails default_scopeは悪と言われることがあって、自分もはまったことあるのでほぼ使わないようにしてた.
railsドキュメントのサンプルはあまりよくない例だと思う.
でも、元のテーブルに属性を指定するのではなく、以下のように参照専用/既存のデータを表すために使えばわかりやすいし、強力だと思う.

class PublishedArticle < Article
  default_scope -> { where(status: :published) }
  has_many :comments
end
class Last7Days < Article
  default_scope ->{
    where( created_at: 7.days.ago..Time.zone.now )
  }

  def days_remain_till_get_older
    return 0 if created_at < 7.days.ago
    ((created_at - 7.days.ago) / (60*60*24)).ceil
  end
end

ふつうのscope使ってできるケースもあるが、このようにクラスに切り出せたほうが有効な場面も多い.
STIにも似てるけど、typeカラムのようなものは不要なので自由度高く条件を設定できる.
CQRSの考えとも親和性が高いと思う.

modelがreadonlyであることを保証したい場合は以下が参考

http://stackoverflow.com/questions/5641410/is-there-an-easy-way-to-make-a-rails-activerecord-model-read-only
http://d.hatena.ne.jp/akishin999/20130718/1374100143