Ruby
RubyOnRails

rails キーワード検索とプルダウン検索の両方を一つのメソッドで実装

検索機能にはいろんな種類が。。。

webアプリを作成していると、検索機能を作ることがよくあると思いますが、キーワードだけで検索とかはあまりないですよね。。。どちらかというと、キーワードもあるけど、こちら側で用意した項目でプルダウンで選んで検索することも多いと思います。
二つメソッド作ればよくない?とも思うんですが、コントローラーが太るので一つに集約します。
そういう場合のやり方をメモります。

作りたいもの

プルダウンからできるもの

問題を検索する機能で、授業は国語、算数、理科、社会のどれかに属します。
プルダウンでこの4つの科目のうちのどれかを検索すると、対応した問題が表示されます。
ex国語=>文学史や漢字、算数=>掛け算、文章題

キーワード検索からできるもの

この問題は直接、問題名を検索することもできます。「文学史」と打ち込めば文学史が表示されるようにします。

実装MVC

Model

スクリーンショット 2018-01-30 20.49.22.gif

problem.rb
validates :problem_name, presence:true
validates :submit_name, presence:true
#problem_nameとsubmit_nameは確実になければいけないようにする

View

search.html.erb
 <%= form_tag(comics_search_path, method: "get") do %>
    <%= text_field_tag :keyword , params[:keyword],placeholder: "作品名・サークル名など"%>
 <% end %>
#キーワード検索するタブを作る

<%= form_tag(comics_search_path, method: "get") do %>
 <%= select_tag "submit_name", options_for_select([["国語", "国語"],["算数","算数"],["理科","理科"],["社会","社会"]]) %>
<% end %>
#プルダウン検索バー生成

<%= @submits_searched %>
#検索結果出力場所

*公式
railsにおけるプルダウン検索view
select_tag "カラム名", options_for_select([["画面表示したい名前","データの実際の値"],["画面表示したい名前","データの実際の値"]])

Controller

problem_controller
def search 
submit_name_ids = Submit.where("submit_name = ?", params[:submit_name]) .pluck(:id)
#プルダウンで選ばれたsubmit_nameと同一のsubmi_nameを持つレコードを取得し、そのidを全て列挙する

problem_name_ids = Submit.where("problem_name LIKE (?)", "#{params[:problem_name]}").pluck(:id)
#キーワードで検索された名前と同じproblem_nameと同じproblem_nameを持つレコードのidを全て列挙する

@submit_searched = Submit.where("submit_id IN (?) or submit_id IN (?)", submit_name_ids, problem_name_ids)
#submit_name_idsかproblem_name_idsに当てはまるものをsubmitテーブルから探して、
#@submit_searchedに代入。

改善したいところ

データの中身が文字列になってしまっているので、数値データを入れた方が検索が早くなるのではと考えています。。。。
そこもいずれ書いてきます。