はじめに

例えばアンケートなんかで「興味のある事にチェックしてください(複数可)」のようなフォームがあった場合に、アンケートテーブルと興味のある事テーブルを連携させるやり方について。railsではcollection_check_boxes というヘルパーを使うと簡潔に書くことができます。

モデル

アンケート(Questionnaire)と興味のある事(Hobby)にアソシエーションを設定します。中間テーブルとしてhobby_questionnaires を使用するhas_many :through を指定しています。

# app/models/questionnaire.rb
class Questionnaire < ActiveRecord::Base
  has_many :hobby_questionnaires
  has_many :hobbies, :through => :hobby_questionnaires
end
# app/models/hobby.rb
class Hobby < ActiveRecord::Base
  has_many :hobby_questionnaires
  has_many :questionnaries, :through => :hobby_questionnaires
end

ビュー

# app/views/questionnaries/_form.html.erb
・・・省略
<div class="form-group">
  <%= form.label :hobbies, class: 'col-sm-2 control-label' %>
  <div class="col-sm-10">
    <div class="checkbox">
      <%= collection_check_boxes(:questionnarie, :hobby_ids, Hobby.all, :id, :name) do |b| %>
        <%= b.label { b.check_box + b.text } %>
      <% end %>
    </div>
  </div>
</div>

コントローラー

ストロングパラメーターに指定を追加します。

# app/controllers/questionnaries_controller.rb
class QuestionnariesController < ApplicationController
  ・・・省略
    def post_params
      params.require(:instance).permit(・・・省略, {:hobby_ids => []})
    end
end