0

多対多の関係を持つモデルのフォームを作成する最良の方法は何ですか?

詳細に:

User、Task、TaskAssignment の 3 つのモデルがあります。


ユーザーモデル

class User < ActiveRecord::Base   
  has_many :task_assignments
  has_many :tasks, through: :task_assignments
end

タスク モデル

class Task < ActiveRecord::Base
  has_many :task_assignments
  has_many :users, through: :task_assignments
end

TaskAssignment モデル (結合テーブル)

has_and_belongs_to_manyTaskAssignment モデルに追加のフィールドが必要なため、 を使用できません。

class TaskAssignment < ActiveRecord::Base
  belongs_to :task
  belongs_to :user
end

新しいタスクを作成することで、複数のユーザーをタスクに割り当てることができるはずなので、このフォーム ビューを作成しました。

タスク編集フォーム ビュー

<%= form_for(@task) do |f| %>
  <div class="field">
    <%= f.label :note %><br>
    <%= f.text_field :note %>
  </div>

  <select name="task[users]" size="5" multiple>
    <% @users.each do |user| %>
      <option value="<%= user.id %>"><%= user.email %></option>
    <% end %>
  </select>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

今、私はコントローラーでどのように進むべきか疑問に思います:

タスクコントローラー

  def create
    @task = Task.new(task_params)

    respond_to do |format|
      if @task.save
        format.html { redirect_to @task, notice: 'Task was successfully created.' }
        format.json { render action: 'show', status: :created, location: @task }
      else
        format.html { render action: 'new' }
        format.json { render json: @task.errors, status: :unprocessable_entity }
      end
    end
  end

私はそのようなことをしなければならないと思います:

@task = Task.new(task_params)
users = ???
@task.users << users

  1. それは n:m データを保存する方法ですか、それとも他のマジック レール機能はありますか?
  2. 選択ボックスからデータを取得するにはどうすればよいですか? 選択ボックスの名前を に設定して受信しようとしましたname="task[users]"が、変数には-fieldtask_paramsしか含まれていませんnote
4

2 に答える 2