Rails: update_attributes не учитывает зависимость:: destroy - PullRequest
0 голосов
/ 02 мая 2019

Когда я использую update_attributes, он должен удалять определенные записи и удалять их зависимых (как я использую зависимый:: уничтожить). Однако я получаю ошибку внешнего ключа и не знаю, что делать по-другому.

У меня есть следующее

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 с StudentGoal.find (number) .destroy, StudentGoalScores будут удалены правильно.

Что я могу сделать, чтобы update_attributes правильно каскадно удалял?

1 Ответ

0 голосов
/ 02 мая 2019

Работает нормально, так как документация гласит :

: зависимый

Управляет тем, что происходит со связанными объектами, когда их владелец уничтожен

update не должен ничего удалять.

EDIT: Rails обрабатывает автоматически соединяющиеся таблицы (например, StudentGoal), это означает, что вам не нужно беспокоиться оудаление / обновление этой таблицы при обновлении связанных таблиц (Goal.find(2).update_attributes(students: [Student.find(69)]) , но , в вашем случае вы устанавливаете FK в таблице объединения (has_many :student_goal_scores) и соответствующее ограничение БД.

И в этом проблема.Rails пытается обновить ассоциацию Цель / Студент, но БД жалуется, потому что это оставит потерянную запись StudentGoalScore.

Вы можете переместить StudentGoalScore столбцы в StudentGoal или установить обратный вызов в StudentGoal для автоматическогоудалить StudentGoalScore.

...