【发布时间】:2020-05-14 21:03:28
【问题描述】:
我有一个 Project 模型,它可以将自己作为子项目定义为 Project.projects。
class Project < ApplicationRecord
belongs_to :parent_project, class_name: 'Project', optional: true
has_many :projects, foreign_key: :parent_project_id, class_name: 'Project', dependent: :destroy
has_many :goals
end
每个项目都有_许多目标。
我正在尝试在项目模型中编写一个方法,使我能够收集该项目的所有目标以及所有子项目的子项目(递归)。
def descendant_projects
self.projects | self.projects.map(&:descendant_projects).flatten
end
def goals_including_descendants
all_goals = self.goals
descendant_projects.each do |project|
all_goals.concat(project.goals)
end
all_goals
end
当我调用 project.goals_include_descendants 时,子项目的 project_id 正在数据库中更新为原始父项目的直接目标。该代码的哪一部分会导致 Rails 触发数据库更新?我可以在控制台中看到它:
Goal Load (0.0ms) SELECT "goals".* FROM "goals" WHERE "goals"."project_id" = $1 [["project_id", 49]]
(0.0ms) BEGIN
SQL (0.2ms) UPDATE "goals" SET "project_id" = $1, "updated_at" = $2 WHERE "goals"."id" = $3 [["project_id", 1], ["updated_at", "2020-05-14 20:47:47.761861"], ["id", 19]]
我完全不知道为什么会这样。感谢您提供任何见解。
【问题讨论】:
标签: ruby-on-rails activerecord rails-activerecord rails-models