Situation
所有している不動産の入居者を管理するアプリを作成中、
「指定日以前に入居していて、指定日以降に退居している。かつ、退去日が空欄のレコードも対象とする」
という結果の表示を行いたい。
前提:ransackは使わない
最初はransackで実装しようとしたのだが、簡単には行かなかった。
無理やり実現する方法だとransackを使うメリットが皆無のため、ransackなしで実装した。
以下の例において、
reff_date⇒ユーザーが入力した値
Resident⇒入居者のモデル
1.ビューにフォームを作成する
<div class="search_form"> <%= form_with url: 対象のパス, local: true, method: :get do |f| %> <%= f.date_field :reff_date %> <%= f.submit "検索", class: "btn btn-primary" %> <% end %> </div>
2.コントローラーで受け取る記述をする
def search @residents = Resident.looks(params[:reff_date]) reff_date = params[:reff_date] reff_date = reff_date.to_date end
3.モデルでwhere句を記述する
def self.looks(reff_date) @residents = Resident.where("start_date < ?", reff_date).where("finish_date = ? OR finish_date > ?", nil, reff_date) end
筆者のようにレコードを書き換えた結果、nilではなく単なる空白として値が保存されてしまった場合は、
def self.looks(reff_date) @residents = Resident.where("start_date < ?", reff_date).where("finish_date = ? OR finish_date > ?", "", reff_date) end
とすればよい。