为具有多对多关系的模型创建表单的最佳方法是什么?
详细地:
我有 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
任务分配模型(联接表)
我不能使用has_and_belongs_to_many
,因为我需要 TaskAssignment 模型中的其他字段。
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
- 那是应该保存 n:m 数据的方式,还是有其他神奇的轨道功能?
- 如何从选择框中获取数据?我试图通过将选择框的名称设置为来接收它们
name="task[users]"
,但变量task_params
只包含note
-field