3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails]ransackでの月度検索の実装(Custom Predicates)

Last updated at Posted at 2020-12-08

概要

ransackを使用している際、月度検索を使用したくなったので以下の通り実装した。

↓例:2020年12月を選択したら、2020/12/1-2020/12/31まで検索する
Image from Gyazo

実装

検索用の述語(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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?