如何以 collection_select rails 形式将多个 ID 作为数组传递?

how to pass multiple ids as an array in form collection_select rails?

projectstagesfinancial
有 one_to_many 关联 stagetask
有 one_to_many 关联 tasksub_task 有 one_to_many 关联。

Financial#form 视图中,我试图将 id 作为数组传递给 collection_select组合 id,如(例如:-id of stage, id of parent stage. id of task, id of stage.id of task. id of sub_task. id of sub_task)

此外,下拉列表首先访问所有阶段,然后当前场景中的任务是如何像第一阶段那样打开下拉列表,然后是相应的所有任务,然后是所有 sub_tasks?

代码如何识别哪个值来自哪个 table,因为下拉菜单来自多个 table 基于参考

form.html.erb(金融)

<div class="field column large-8">
  <br>
  <%= form.label :acitivity_Select %>
  <%= form.collection_select :cost_head, @project.stages.all+ @project.tasks.all+ @project.sub_tasks.all, :id, :task_name, prompt: true %>
</div>

project.rb

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

下面是我将如何解决这个问题:

从数据的角度来看,根本不需要获取和呈现阶段和任务,因为您可以通过子任务访问该数据。因此,如果您相应地呈现 select 并将子任务的 ID 存储在数据库中,您将能够从中访问任务和阶段:

<%= 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

如果您想在 select 中包含 ID 以便于 selection,您可以编写自己的 label_method,例如像这样:

在 SubTask 模型中:

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 %>