Rails - помогите понять, как использовать: зависимый =>: уничтожить - PullRequest
2 голосов
/ 15 февраля 2011

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

User (id)
Project (id)
Permission (project_id, user_id)
Thread (project_id)
ThreadParticipation (thread_id, user_id)

Так что это хорошо работает, проблема в этом. Когда пользователь покидает или удаляется из проекта, мне нужно удалить все его ThreadParticipation для этого проекта.

Пример, поэтому, если пользователь (15) покидает проект (3), удаляя разрешение (user_id => 15, project_id => 3), мне нужны рельсы для автоматического удаления всех связанных записей ThreadParticipation (где ThreadParticipation через поток принадлежит к project_id 3 и ThreadParticipation.user_id = 15.

Я пробовал это, но он ничего не делает:

has_many :thread_participations, :foreign_key => :user_id, :dependent => :destroy

Мысли? Спасибо

Ответы [ 3 ]

2 голосов
/ 15 февраля 2011

Возможно, вы используете delete вместо destroy? Использование destroy приведет к удалению зависимых, а delete - нет. см.

1 голос
/ 15 февраля 2011

Попробуйте:

class Project
  has_many :threads
  has_many :thread_participations, :through => :threads      
end

class Permission
  belongs_to :project

  after_destroy :destroy_thread_participations

  def destroy_thread_participations
    ThreadParticipation.delete_all(
      :id => project.thread_participations.find_all_by_user_id(user_id)
    )
  end
end

Используйте destroy_all вместо delete_all, если в модели ThreadParticipation есть обратные вызовы *_destroy.Вызов delete_all выполняется быстрее, чем destroy_all, поскольку он выполняет удаление нескольких строк в одном вызове БД и не требует дополнительных затрат на вызов *_destroy обратных вызовов.

1 голос
/ 15 февраля 2011

В модели Permission сделайте это:

before_destroy :delete_thread_participation

private
      def delete_thread_participation
         if self.threadparticipation 
           self.threadparticipation.delete_all "project_id ="+self.project_id+"and user_id="+self.user_id
         end
      end

Это с учетом того, что в моделях определены отношения

...