Context:
I have a Company
model that has many projects
. Each project
has many tasks
. The company
has many employees
.
Employee
belongs to Company
and has many tasks
. It is one employee per task and an employee will have only one task
per project
.
Schema:
Problem:
I'm building a form to create a project where the user can add multiple tasks
. Each task has an amount of hours
specified and the employee
performing the task
. Upon submission the form should create a single project
record, one or more task
records with hours
and employee_id
attributes and (!) check if the employee
name already exists in the database or create a new one.
I'm struggling with how to have the form save the employee_id
rather than the employee_name
.
Code:
My form is as follows:
<%= 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 %>
My controller:
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
Question:
Unfortunately, this would save to the tasks
table the employee_name
rather than employee_id
(plus writing a new employee_name
to the employees table
). Of course, the tasks
table should only contain the employee_ids
and the employee
table the names
.
Any suggestions on how to approach this?