前提・実現したいこと
現在Railsで子育ての相談サイトを作成しています。
検索機能として年齢月齢の範囲検索を実装しようとしていますが、どのように実装すればよいかわかりません。
現状、DBの相談テーブルは年齢、月齢それぞれint型でカラムを分けています。
下記ビューのように、年齢月齢それぞれにgteq(以上)、lteq(以下)と記載しても正しい検索ができません。
例えば、0歳9ヶ月〜1歳11ヶ月で検索すると、月齢9〜11ヶ月内でしか検索されず、1歳1〜8ヶ月は検索されません。
下記の例のように年齢、月齢を組み合わせた値で検索する必要がありますが、
どのように実装すればよいかがわかりません。
どうすればよいか教えていただきたく、何卒お願いします。
例: 1歳3ヶ月 → 103
【環境】
MacBook Catalina ver.10.15.7
Rails 6.0.3
ruby 2.7.1
該当のソースコード
【コントローラー】
Ruby
1#app/controllers/application_controller.rb 2class ApplicationController < ActionController::Base 3 before_action :set_search 4 5 def set_search 6 @q = Consultation.ransack(params[:q]) 7 @q.sorts = 'updated_at desc' if @q.sorts.empty? 8 @search_consultations = Kaminari.paginate_array(@q.result).page(params[:page]).per(5) 9 end 10end
【ビュー】
slim
1= search_form_for @q do |f| 2. 3. 4 .form-group 5 .form-inline 6 .col 7 = f.label :child_age, '年齢:' 8 .col 9 = f.select :child_age_gteq, options_for_select((0..3).to_a), { include_blank: '選択'}, class: 'selectpicker form-control' 10 | 歳 11 .form-inline 12 .col 13 = f.label :child_age, '月齢:' 14 .col 15 = f.select :child_moon_age_gteq, options_for_select((0..11).to_a), { include_blank: '選択'}, class: 'selectpicker form-control' 16 | ヶ月 17 | 〜 18 .form-inline 19 .col 20 = f.label :child_age, '年齢:' 21 .col 22 = f.select :child_age_lteq, options_for_select((0..3).to_a), { include_blank: '選択'}, class: 'selectpicker form-control' 23 | 歳 24 .form-inline 25 .col 26 = f.label :child_age, '月齢:' 27 .col 28 = f.select :child_moon_age_lteq, options_for_select((0..11).to_a), { include_blank: '選択'}, class: 'selectpicker form-control' 29 | ヶ月 30. 31. 32 = f.submit '検索する', class: 'btn btn-primary' 33
追記(2020/12/24)
DBの相談テーブルのchild_age(年齢)、child_moon_age(月齢)をカラムを削除し、child_age_moon_age(月齢の累積)として管理することとしました。出入力に関しては年齢、月齢を分けるために相談モデル(app/models/consultation.rb)にattr_accessor :age, :moon_age
追加しました。
しかし、ransackで:age, :moon_age
メソッドを定義する方法がわかりません。
どのようにすれば定義できるのか教えていただきたく、何卒お願いします。
【ビュー】
slim
1= search_form_for @q do |f| 2. 3. 4 .form-inline 5 .col 6 = f.label :age, '年齢:' 7 .col 8 = f.select :age_gteq , options_for_select((0..3).to_a), { include_blank: '選択'}, class: 'selectpicker form-control' 9 | 歳 10 .form-inline 11 .col 12 = f.label :moon_age, '月齢:' 13 .col 14 = f.select :moon_age_gteq, options_for_select((0..11).to_a), { include_blank: '選択'}, class: 'selectpicker form-control' 15 | ヶ月 16 | 〜 17 .form-inline 18 .col 19 = f.label :age, '年齢:' 20 .col 21 = f.select :age_lteq, options_for_select((0..3).to_a), { include_blank: '選択'}, class: 'selectpicker form-control' 22 | 歳 23 .form-inline 24 .col 25 = f.label :moon_age, '月齢:' 26 .col 27 = f.select :moon_age_lteq, options_for_select((0..11).to_a), { include_blank: '選択'}, class: 'selectpicker form-control' 28. 29. 30 = f.submit '検索する', class: 'btn btn-primary'
【エラー】
ActionView::Template::Error (undefined method `age_gteq' for #<Ransack::Search:0x00007fbf79f8ff80>): 24: .col 25: = f.label :age, '年齢:' 26: .col 27: = f.select :age_gteq , options_for_select((0..3).to_a), { include_blank: '選択'}, class: 'selectpicker form-control' 28: | 歳 29: .form-inline 30: .col