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?
