как передать несколько идентификаторов в виде массива в виде рельсов collection_select? - PullRequest
6 голосов
/ 10 июля 2020

project имеет связь one_to_many с stages, а financial
stage имеет связь one_to_many с task
task имеет связь one_to_many с sub_task.

В Financial # form view я пытаюсь передать id в collection_select как массив комбинированных идентификаторов, например (например: -id стадии, id родительской стадии. id задачи, id стадии. id задачи. id sub_task. id sub_task)

Также раскрывающийся список сначала обращается ко всем этапам, затем задача в текущем сценарии - как я могу включить раскрывающийся список, как первые этапы затем соответствующие им все задачи, за которыми следуют все подзадачи?

enter image description here

How can code identify which value is from which table, because drop-down comes from multiple table based on reference

form.html.erb (Finacial)

 
<% = form.label: acitivity_Select%> <% = form.collection_select: cost_head, @ project.stages.all + @ project.tasks.all + @ project.sub_tasks.all,: id,: task_name, prompt: true%>

project.rb

  has_many :stages
  has_many :tasks, through: :stages
  has_many :sub_tasks, through: :tasks

1 Ответ

3 голосов
/ 14 июля 2020

Итак, вот как я бы 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 %>
...