Rails:update_attributes不尊重依赖项::destroy

时间:2019-05-02 05:42:22

标签: ruby-on-rails postgresql activerecord foreign-keys cascade

当我使用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正确地级联删除吗?

1 个答案:

答案 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