Posted at

tapで作る条件付きActiveRecord_Relation

More than 3 years have passed since last update.

def hoge_search

relation = HogeModel.preload(:fuga)
relation = relation.where('created_at >= ?', params[:created_at_start]) if params[:created_at_start].present?
relation = relation.where('created_at <= ?', params[:created_at_end]) if params[:created_at_end].present?
relation = relation.where('updated_at >= ?', params[:updated_at_start]) if params[:updated_at_start].present?
relation = relation.where('updated_at <= ?', params[:updated_at_end]) if params[:updated_at_end].present?
relation
end

管理ツールなどでよくある、フォームの入力値によって検索条件が変わる、という要件があるとき、上記のようなコードを書いて苦々しく思った経験があるんじゃないでしょうか?

できればチェインは繋げたいですよね。

これを tap を使ってきれいに繋げてみましょう。

def hoge_search

HogeModel
.preload(:fuga)
.tap { |r| break r.where('created_at >= ?', params[:created_at_start]) if params[:created_at_start].present? }
.tap { |r| break r.where('created_at <= ?', params[:created_at_end]) if params[:created_at_end].present? }
.tap { |r| break r.where('updated_at >= ?', params[:updated_at_start]) if params[:updated_at_start].present? }
.tap { |r| break r.where('updated_at <= ?', params[:updated_at_end]) if params[:updated_at_end].present? }
end

つながりましたね!

すっきりは・・・してないかもですね!!(´༎ຶ۝༎ຶ)