2009-05-07 9 views
6

Etwas, was ich bin nicht immer ...Active: Löschen von Aufzeichnungen darüber

ich in meinem Modell habe:

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 

Und ich versuche, dies zu tun:

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

Aber Dies löscht die Datensätze nicht aus der Datenbank. Stattdessen habe ich dies zu tun:

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

..., die nicht der beste Weg sein kann.
Also, was ist der beste Weg, bitte?

Antwort

4

Garry hat Recht: model.options.clear

Aber Sie können weiter gehen und es mit einem Modell Rückruf assoziieren, ob es Ihren Bedürfnissen passt

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 

Oder Sie können this plugin verwenden, um FK-Beziehungen von der Datenbank zu erzwingen, indem Sie DB-Trigger hinzufügen (wenn Ihre spezielle db-Flavor-Suppl oder sie).

Ich hoffe, dass maight helfen Ihnen

+0

Curious der Rest kümmern, ist die before_destroy Rückruf erforderlich, wenn Sie die haben: abhängig => : Option zerstören? –

+0

Nein. Es startet Rails 3 nicht. –

1

In Rails 3 alles, was Sie tun müssen, ist :dependent => :destroy und Active wird

Verwandte Themen