🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

1581閲覧

[Rails]gemのransackを使用した日付の範囲検索が上手くいきません

mball

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2019/11/02 07:53

#前提・実現したいこと
日付の範囲検索において、検索フォームで入力された範囲内にイベントが開催されていれば、表示されるようにしたい。

#発生している問題・エラーメッセージ
検索フォームの期間 9/21〜9/28
イベント1の開催期間 9/24〜9/26
→検索後の画面にイベント1は表示される

検索フォームの期間 9/21〜9/28
イベント2の開催期間 9/18〜9/30
→検索後の画面にイベント2は表示されない

イベント2も表示されるようにしたい。

#該当のソースコード

gemのransackを使用して検索フォームを作っています。
また、イベント開催日のカラム名はstart_on、イベント終了日のカラム名はend_onです。

ビューファイルは以下の通りです。

ruby

1 <div class="conditions search-form"> 2 <%= search_form_for @search do |f| %> 3 4 <%= f.label :end_on, '期間', class: "search-form__element search-form__label" %> 5 <%= f.date_field :end_on_gteq, include_blank: true, class: "search-form__element search-form__data-field" %> 〜  6 <%= f.date_field :end_on_lteq, include_blank: true, class: "search-form__element search-form__data-field" %>   7 8 <%= f.label :category_id, 'カテゴリ', class: "search-form__element search-form__label" %> 9 <%= f.check_box :category_id_eq_any, { multiple: true }, 1, '' %>グルメ 10 <%= f.check_box :category_id_eq_any, { multiple: true }, 2, '' %>お祭り 11 <%= f.check_box :category_id_eq_any, { multiple: true }, 3, '' %>花火 12 <%= f.check_box :category_id_eq_any, { multiple: true }, 4, '' %>よさこい 13 <%= f.check_box :category_id_eq_any, { multiple: true }, 5, '' %>その他 14 15 <%= f.submit '検索', class: "search-form__element search-form__submit" %> 16 <% end %> 17 </div>

event_controller.rbの該当部分は以下の通りです。

ruby

1def index 2 @search = Event.ransack(params[:q]) #ransackメソッド推奨 3 @events = @search.result.includes(:category).order(:start_on) 4 @allevents = Event.where('start_on >= ?', Date.today).order(:start_on) 5end

#試したこと
f.date_field :start_on_gteqにしましたが、実現できませんでした。
gemのransackを使った期間内の日付を取得する範囲検索はできないのでしょうか、、?

#補足情報(FW/ツールのバージョンなど)
Rails 5.2.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

難しいかもしれないですね。
範囲の中にある値が入るか、というのは出来ますが 範囲と範囲の重複の評価はちょっとややこしいから
a1 .. a2 の範囲と b1..b2 の範囲が重なっているかの判定は
b1 < a2 and b2 > a1
ransacでできるのは
a1 < b1 and b1 < a2
ん?
ああ、なんか出来そう
期間 開始日 を end_on_gt
期間 終了日 を start_on_lt
にしたらどうでしょう

投稿2019/11/02 21:16

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mball

2019/11/02 23:49

できました! ransackへの理解が足りていないので大変助かりました、、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問