ЯoomeR

プログラミング~実装とエラー解決と、時々、AI~

nilを含むn以上の値の検索方法[Rails]

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

とすればよい。