Rails: 如何使用循环将 ActiveRecord 查询结果放入数组中?

Rails: How do I place ActiveRecord query results into an array using a loop?

上下文:

我有一个 Company 模型,其中有很多 projects。每个 project 有很多 taskscompany 有很多 employees

Employee 模型与 Company 关联,但与 projectstasks 无关。 Task 模型确实有一个 employee_name 属性,因为每个任务一个员工(但每个员工的任务更多)。一名员工每 project.

只有一个 task

架构:

我的问题:

我正在尝试创建一个数组,每个 employee 存储 projects 它有一个 task

我目前可以使用以下代码,但我想知道是否可以用更好的方式来实现。我应该更改我的模型关联,还是这样做?

        @employee = Employee.find(1)
        @employee_tasks = Task.where(employee: @employee.name)

        @employee_project = {}
        i = 0

        @employee_tasks .each do |f|
            i += 1
            @employee_project[i] = Project.where(id: f.project_id)              
        end
class Project
  has_many :tasks
end

class Task
  belongs_to :project
  belongs_to :employee

  delegate :name, to: :employee, prefix: true
end

class Employee
  has_many :tasks
  has_many :projects, through: :tasks
end

我假设在你看来你目前有这个任务

<%= task.employee_name %>

通过在委托方法上使用前缀选项,如果您以这种方式关联模型,这仍然有效。

所以现在在你的控制器中你可以做

@employee = Employee.find(1)
@employee_tasks = @employee.tasks

然后说你想在某个项目中找到员工并将他们列在某处。然后你只需添加到项目

class Project
  has_many :tasks
  has_many :employees, through: :tasks
end

@project = Project.find(1)
@project_tasks = @project.tasks

正确地将任务与员工相关联可以使这变得更加简单。另一个好处是如果员工更改姓名会怎样?目前,您还需要完成所有任务才能更改任务中的员工姓名(或者如果员工更改了姓名,则编写代码来执行此操作)。通过使用关联,您只需更改员工姓名即可正常工作。