初心者です。ransackでの検索のチェックボックスの選択肢を天気情報のマスタテーブルのカラムとしていたんですが、「砂あらし」や「竜巻」などトランザクションデータにない項目も表示されてしまい、それで検索かけると検索結果になにも表示されないので、トランザクションデータにある項目だけチェックボックスに表示させたいと考えました。
調べたところ、joinsやincludesで2つのテーブルを結合するとできそうでした。
ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い
joinsで結合して、groupで集合化することでデータにある項目だけ表示することできました(includesではできず、joinsでできたんですが、理由はわかりません)。
huntsテーブル(釣果を登録するテーブル)
string :weather_main
・・・
weathersテーブル(マスタ)
string :weather_main(Clear、Cloud など)
string :weather_name(晴れ、くもり など)
・・・
アソシエーション
hunt.rb
belongs_to :weather, foreign_key: 'weather_main', primary_key: 'weather_main'
weather.rb
has_many :hunts, foreign_key: 'weather_main', primary_key: 'weather_main'
コントローラー
hunts_controller.rb
def index
# weathersテーブルをhuntsテーブルのweather_mainにあるものに絞り込んで検索の選択肢をviewに渡す
@weather = Weather.joins(:hunts).group('weather_main')
end
ビュー
hunts/index.html.erb
<%= search_form_for @search do |f| %>
<%= f.collection_check_boxes :weather_main_in, @weather, :weather_main, :weather_name %>