Итак, вот как я бы go решил эту проблему:
С точки зрения данных, нет необходимости извлекать и отображать этапы и задачи вообще, потому что вы можете получить доступ к этим данным через вспомогательную задачи. Таким образом, если вы сделаете выбор соответствующим образом и сохраните идентификатор подзадачи в базе данных, вы сможете получить доступ к задаче и перейти к ней:
<%= form.collection_select :cost_head, @project.sub_tasks, :id, :task_name, prompt: true %>
Где угодно:
financial.cost_head.task # => the task
financial.cost_head.task.stage # => the stage
Если вы хотите включить идентификаторы в выборку для упрощения выбора, вы можете написать свой собственный label_method
, например, так:
В модели подзадач:
def full_task_name
"#{task.stage.id}.#{task.id}.#{id} #{task_name}"
end
А затем в виде:
<%= form.collection_select :cost_head, @project.sub_tasks, :id, :full_task_name, prompt: true %>
Если сортировка отключена, может потребоваться сделать что-то вроде этого:
В контроллере:
@cost_heads = @project.sub_tasks.includes(task: :stage).order("stages.id ASC, tasks.id ASC, sub_tasks.id ASC")
В виде :
<%= form.collection_select :cost_head, @cost_heads, :id, :full_task_name, prompt: true %>