ActiveRecord: удаление связанных записей - PullRequest
6 голосов
/ 07 мая 2009

Что-то, чего я не получаю ...

У меня есть это в моей модели:

class Model < ActiveRecord::Base
    has_many :model_options # a link table for many to many
    has_many :options, 
             :through => :model_options, 
             :dependent => :destroy, 
             :foreign_key => 'model_id'
end

И я пытаюсь сделать это:

model = Model.find(id)
model.options.delete # also tried model.options.delete_all

Но это не удаление записей из БД. Вместо этого я должен сделать это:

model.options.each do |option|
   option.delete
end

... что не может быть лучшим способом.
Итак, как лучше, пожалуйста?

Ответы [ 3 ]

10 голосов
/ 07 мая 2009
model.options.clear

Ссылка

4 голосов
/ 07 мая 2009

Гарри прав: model.options.clear

Но вы можете пойти дальше и связать его с обратным вызовом модели, если он соответствует вашим потребностям

class Model < ActiveRecord::Base
has_many :model_options # a link table for many to many
has_many :options, 
         :through => :model_options, 
         :dependent => :destroy, 
         :foreign_key => 'model_id'

# Clear options records before destroy
before_destroy :clear_options

protected
  def clear_options
    options.clear
  end
end

Или вы можете использовать этот плагин , чтобы принудительно установить отношения FK из базы данных, добавляя триггеры БД (если ваш конкретный вариант БД поддерживает их) соответственно.

Я надеюсь, что может помочь вам

1 голос
/ 03 ноября 2011

В Rails 3 все, что вам нужно сделать, это :dependent => :destroy, а ActiveRecord позаботится обо всем остальном

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...