Ruby on Railsで検索条件に期間を指定して、検索する方法を紹介します。
【Rails】検索条件に期間の範囲を指定する方法
検索条件のひとつに期間の範囲を指定する場合の例です。ここでは申請期間の範囲を指定します。
request_date_fromに申請期間範囲の最初の日付、request_date_to申請期間範囲の最後の日付を指定することになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ・・・ <label> <legend>申請期間</legend> <div> <%= f.text_field :request_date_from, class: 'datepicker', placeholder: '指定なし', name: :request_date_from, value: @filter_params[:request_date_from] %> </div> <span>-</span> <div> <%= f.text_field :request_date_to, class: 'datepicker', placeholder: '指定なし', name: :request_date_to, value: @filter_params[:request_date_to] %> </div> </label> ・・・ |
Viewから受け取った条件をコントローラで受け取り、サービスで検索処理を行います。申請期間が指定された場合、絞り込み検索を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Test::Filter include ActiveModel::Model attr_accessor \ :request_date_from , :request_date_to, def search(request) assign_attributes request if request.present? and request.is_a?(ActionController::Parameters) || request.is_a?(Hash) query = ::Test.all # 申請期間範囲を指定 query = query.merge(::Test.request_date_from request_date_from) if request_date_from.present? query = query.merge(::Test.request_date_to request_date_to) if request_date_to.present? query end end |
絞り込み検索を行うスコープをモデルに指定します。>=と<=はそれぞれgteqとlteqメソッドで書くことができます。
1 2 3 4 5 6 7 8 9 10 11 | class Test < ApplicationRecord ... # 申請日_From >= scope :request_date_from, -> (value) { where(Test.arel_table[:request_date].gteq(value)) } # 申請日_To <= scope :request_date_to, -> (value) { where(Test.arel_table[:request_date].lteq(value)) } ... |