上下文
我的Company
模型有很多projects
。每个project
都有许多tasks
。 company
有很多employees
。
Employee
属于Company
且有许多tasks
。每个任务只有一名员工,员工每task
只有一个project
。
架构:
问题:
我正在构建一个表单来创建一个项目,用户可以在其中添加多个tasks
。每项任务都指定了hours
,执行employee
的{{1}}。提交后,表单应创建一条task
条记录,一条或多条带有project
和task
属性的hours
条记录,并且(!)会检查employee_id
名称已经存在于数据库中或创建一个新的。
我正在努力解决如何保存表单employee
而不是employee_id
。
代码:
我的表格如下:
employee_name
我的控制器:
<%= simple_nested_form_for @project do |f| %>
<%= f.input :project_details %>
<%= f.simple_fields_for :tasks do |task| %>
<%= task.input :employee_name, input_html: { data: { autocomplete_source: @queried_employee_names.to_json } } %>
<%= task.input :hours %>
<% end %>
<%= f.link_to_add "Add +", :tasks %>
<%= f.button :submit %>
<% end %>
问题:
不幸的是,这会将class TransactionsController < ApplicationController
def new
@project = current_company.projects.build
end
def create
@project = current_company.projects.new(project_params)
if @project.save
employee_save
redirect_to success_url
else
@project = current_company.projects.build
render :new
end
end
# save the employees not yet in the database
def employee_save
@project.tasks.each do |task|
if current_company.employees.where(name: task.employee_name).empty?
current_company.employees.new(name: task.employee_name).save
end
end
end
def project_params
params.require(:project).permit(:project_details, tasks_attributes: [:id, :employee_name, :hours, :_destroy])
end
end
表格保存到tasks
而不是employee_name
(再加上employee_id
写入employee_name
。当然,employees table
表应该只包含tasks
和employee_ids
表employee
。
有关如何处理此事的任何建议?
答案 0 :(得分:0)
我会在表单中添加隐藏字段,如:
<%= simple_nested_form_for @project do |f| %>
<%= f.input :project_details %>
<%= f.simple_fields_for :tasks do |task| %>
<%= task.input :employee_name, input_html: { data: { autocomplete_source: @queried_employee_names.to_json } } %>
<%= task.hidden_field :employee_id, '' %>
<%= task.input :hours %>
<% end %>
<%= f.link_to_add "Add +", :tasks %>
<%= f.button :submit %>
<% end %>
必须通过Ajax填写此字段。我看到你的:employee_name
输入字段中有一个自动完成源,你可以在选择员工时在那里添加一个事件,并通过Ajax获取id并用所选员工的id填充隐藏字段,您可以在create
操作中轻松保存这些数据。