概要
ransackを使用している際、月度検索を使用したくなったので以下の通り実装した。
↓例:2020年12月を選択したら、2020/12/1-2020/12/31まで検索する
実装
検索用の述語(Predicate)を作成する。
add_predicateで述語を追加、述語名は「during_month」で実装。
# config/initializers/ransack.rb
Ransack.configure do |config|
config.add_predicate :during_month,
:arel_predicate => :between,
:formatter => proc { |v|
unless v.month == 12 # 12月度以外の処理
#月末日をenddayに代入 v.monthを+1して最後にdateを1引くことで月末日を取得している。
endday = Time.zone.parse("#{v.year}-#{v.month + 1}-1").to_date - 1
else # 12月度の処理
# 12月度の時はv.monthはインクリメントしない(エラー回避)
# v.yearを+1で翌年に、monthは1月固定、
# 最後に1日に固定したdateを1引くことで12月の末日をenddayに代入している。
endday = Time.zone.parse("#{v.year + 1}-1-1").to_date - 1
end
#検索月の初日から月末日まで
Time.zone.parse("#{v.year}-#{v.month}-1").to_date..endday
},
:type => :date
end
View側の実装
<%= search_form_for "検索オブジェクト", url: "アクション" do |f| %>
<%= f.label :search_day, "期間"%>
<%= raw sprintf(
f.date_select(
:search_day_during_month,
discard_day: true,
use_month_numbers: true,
date_separator: '%s'),
'年 ') + '月' %>
<div class="actions ransack-submit"><%= f.submit "検索" %></div>
<% end %>
参考
ransackで年度検索を実装する
https://qiita.com/tanakaworld/items/c7a2613589dadbb2ef4d
Custom Predicates · activerecord-hackery/ransack Wiki
https://github.com/activerecord-hackery/ransack/wiki/Custom-Predicates