あるオプションパラメータがあるかどうかで、条件が変わるような処理を書いてると、オプションがない場合、ActiveRecord::Relationが欲しくなるような場面があります。

例えば

@articles = Article
@articles = @articles.where(valid: true) if params[:valid]

みたいな感じになっちゃって@articles = Articleって何?な状態になります。

メソッド化しようとするとさらに困るのですが、scopedを使うと以下のように書けるようです。

@articels = Article.scoped
@articles = @articles.where(valid: true) if params[:valid]

なんか異臭がしなくなりましたね。

だから、どうした?って思う方もいるかもしれませんがメソッド化すると、

def self.valid(is_valid = nil)
  scoped.where(valid: true) if is_valid
  scoped
end

となります。scopedなしで書かこうとするとちょっと困ります。

そんだけ。