当我使用update_attributes时,它应该删除某些条目并删除其依赖项(因为我使用的是dependent::destroy)。但是,我遇到了外键错误,不知道该怎么做。
我有以下
class StudentGoal < ApplicationRecord
belongs_to :goal
belongs_to :student
has_many :student_goal_scores, dependent: :destroy
end
class StudentGoalScore < ApplicationRecord
belongs_to :student_goal
end
class Goal < ApplicationRecord
has_many :student_goals, dependent: :destroy
has_many :students, through: :student_goals
end
在rails控制台中,如果我运行以下命令(该目标先前有多个与之相关联的学生):
Goal.find(2).update_attributes(students: [Student.find(69)])
我收到以下错误
ActiveRecord::InvalidForeignKey (PG::ForeignKeyViolation: ERROR:
update or delete on table "student_goals" violates foreign key constraint
"fk_rails_bcae4e177a" on table "student_goal_scores") DETAIL: Key (id)=(49) is
still referenced from table "student_goal_scores".
如果我只是尝试使用StudentGoal.find(number).destroy销毁StudentGoal,则会正确删除StudentGoalScores。
我可以做些什么使update_attributes正确地级联删除吗?
答案 0 :(得分:0)
它可以正常工作,如documentation states:
:依赖
控制关联对象被销毁
时发生的情况
update
不应删除任何内容。
编辑:Rails处理自动联接表(例如StudentGoal
),这意味着您不必担心在更新关联表(Goal.find(2).update_attributes(students: [Student.find(69)]
)时删除/更新该表但是,在您的情况下,您需要在联接表(has_many :student_goal_scores
)中设置FK以及相应的数据库约束。
这就是问题所在。 Rails尝试更新目标/学生关联,但DB抱怨说,因为这将留下孤立的StudentGoalScore
记录。
您可以将StudentGoalScore
列移至StudentGoal
或在StudentGoal
中设置回调以自动删除StudentGoalScore
。