タグ検索(プルダウンバージョン)

参考記事：https://qiita.com/yuuki-h/items/40d98847febbe0f81dfc

１．モデル作成
投稿テーブル：recruits(投稿モデル：Recruit)
タグに関するテーブル：tags(タグモデル：Tag)
投稿とタグを紐づける中間テーブル：recruit_tag_relations(中間モデル：Recruit_tag_relation)

・Tagモデル作成

```ruby:コマンドプロンプト
rails g model Tag name:string
```
・Recruit_tag_relationモデルの作成
```ruby:コマンドプロンプト
rails g model Recruit_tag_relation recruit:references tag:references
```
・データーベースに反映させる
```ruby:コマンドプロンプト
rails db:migrate
```

2．モデルのアソシエーションの設定
```ruby:recruit_tag_relation.rb
class RecruitTagRelation < ApplicationRecord
  belongs_to :recruit
  belongs_to :tag
end
```
```ruby:recruit.rb
class Recruit < ApplicationRecord

  # 以下を追記
  #recruitsテーブルから中間テーブルに対する関連付け
  has_many :recruit_tag_relations, dependent: :destroy
  #recruitsテーブルから中間テーブルを介してTagsテーブルへの関連付け
  has_many :tags, through: :recruit_tag_relations, dependent: :destroy
```
```ruby:tag.rb
class Tag < ApplicationRecord

  # 以下を追記
  validates :name, presence: true
  #Tagsテーブルから中間テーブルに対する関連付け
  has_many :recruit_tag_relations, dependent: :destroy
  #Tagsテーブルから中間テーブルを介してArticleテーブルへの関連付け
  has_many :recruits, through: :recruit_tag_relations, dependent: :destroy
end
```

3．デフォルトのタグを追加する(タグ1、2のところは営業・マーケティング等自分が初期で設定したいタグを入れてね！)
```ruby:db/seeds.rb
Tag.create([
  { name: 'タグ1' },
  { name: 'タグ2' },
  { name: 'タグ3' },
  { name: 'タグ4' },
  { name: 'タグ5' }
])
```
```ruby:コマンドプロンプト
rails db:seed
```

4．投稿の際にタグを選択し、投稿できるようにする
```ruby:recruits/new.html.erb
<%= form_for @recruit do |f| %>

#以下を追記
    <div class='form-group'>
        <%= f.collection_check_boxes(:tag_ids, Tag.all, :id, :name) do |tag| %>
            <div class='form-check'>
                <%= tag.label class: 'form-check-label' do %>
                    <%= tag.check_box class: 'form-check-input' %>
                    <%= tag.text %>
                <% end %>
            </div>
        <% end %>
    </div>
#ここまで
    <%= f.submit "募集する" %>
<% end %>
```

5．コントローラーでタグの情報を受け取れるようにする
```ruby:recruits_controller.rb
private
    def recruit_params
        params.require(:recruit).permit(:title,:job,:status, tag_ids: [])#, tag_ids: []を追加
    end
end
```

6．詳細ページでタグを表示する(いらなかったら割愛しても大丈夫！)
```ruby:recruits/show.html.erb
<% @recruit.tags.each do |tag| %>
    <span><%= tag.name %></span>
<% end %>
```

7．タグをプルダウン形式で検索できるようにする
```ruby:recruits/index.html.erb
<%= form_tag({controller:"recruits",action:"index"}, method: :get) do %>
  <li><%= select_tag :tag_search, options_from_collection_for_select(@tag, "id","name") %></li>
<%= submit_tag '検索' %>
<% end %>
```

```ruby:recruits_controller.rb
def index
    if params[:search] != nil && params[:search] != ''
        search = params[:search]
        @recruits = Recruit.joins(:company).where("title LIKE ? OR name LIKE ?", "%#{search}%", "%#{search}%")
        else
    @recruits = Recruit.all
    end  
#以下を追記
    @tag = Tag.select("name", "id")
        tag_search = params[:tag_search]
        if tag_search != nil
            @recruits = Tag.find_by(id: tag_search).recruits
        end
#ここまで
end
```

8．新たなタグを追加できるようにする
```ruby:recruits/index.html.erb
<%= form_tag({controller:"recruits",action:"index"}, method: :get) do %>
  <%= text_field_tag :tag %>
  <%= submit_tag 'タグを追加' %>
<% end %>
```

```ruby:recruits_controller.rb
def index
    if params[:search] != nil && params[:search] != ''
        search = params[:search]
        @recruits = Recruit.joins(:company).where("title LIKE ? OR name LIKE ?", "%#{search}%", "%#{search}%")
    else
        @recruits = Recruit.all
    end  
    @tag = Tag.select("name", "id")
        tag_search = params[:tag_search]
        if tag_search != nil
            @recruits = Tag.find_by(id: tag_search).recruits
        end
#以下を追記
    if params[:tag]
        Tag.create(name: params[:tag])
    end
#ここまで
end
```