Подтвердить что ты не робот

Каскадное удаление в Ruby ActiveRecord?

Я следил за screencast на rubyonrails.org(создавая блог).

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

comment.rb

class Comment < ActiveRecord::Base
    belongs_to :post
    validates_presence_of :body # I added this
end

post.rb

class Post < ActiveRecord::Base
    validates_presence_of :body, :title
    has_many :comments
end

Отношения между моделями работают нормально, за исключением одного - когда я удаляю пост-запись, я бы ожидал, что RoR удалит все связанные записи комментариев. Я понимаю, что ActiveRecords не зависит от базы данных, поэтому нет встроенного способа создания внешних ключей, отношений, ON DELETE, ON UPDATE. Итак, есть ли способ сделать это (возможно, сам RoR мог позаботиться об удалении связанных комментариев?)?

4b9b3361

Ответ 1

Да. В ассоциации моделей Rails можно указать параметр :dependent, который может принимать одну из следующих трех форм:

  • :destroy/:destroy_all Связанные объекты уничтожаются вместе с этим объектом, вызывая их метод destroy
  • :delete/:delete_all Все связанные объекты немедленно уничтожаются без вызова метода :destroy
  • :nullify Внешние ключи всех связанных объектов установлены на NULL, не вызывая обратные вызовы save

Обратите внимание, что параметр :dependent игнорируется, если у вас установлена ​​ассоциация :has_many X, :through => Y.

Итак, для вашего примера вы можете выбрать, чтобы сообщение удаляло все связанные с ним комментарии, когда сама почта удаляется, без вызова метода комментариев destroy. Это будет выглядеть так:

class Post < ActiveRecord::Base
  validates_presence_of :body, :title
  has_many :comments, :dependent => :delete_all
end

Обновление для Rails 4:

В Rails 4 вы должны использовать :destroy вместо :destroy_all.

Если вы используете :destroy_all, вы получите исключение:

Параметр: зависимый должен быть одним из [: destroy,: delete_all,: nullify,: restrict_with_error,: restrict_with_exception]