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