2009-04-26 9 views
4

In Rails 2.2.2 (Ruby 1.8.7-p72) möchte ich die Auswirkungen der Zerstörung eines Objekts, bevor es tatsächlich tun. I.e. Ich möchte in der Lage sein, eine Liste aller Objekte zu erzeugen, auf die sich Folgendes auswirken wird: dependent =>: destroy (über die Assoziationen eines Objekts). Das wirkliche Problem, das ich versuche zu lösen, ist, einem Benutzer eine Liste von allem zu geben, was gelöscht werden wird und sie die Aktion bestätigen lassen.Auswertung: dependent =>: destroy

Kann mir jemand einen guten Weg empfehlen? Ich habe gerade angefangen, ActiveRecord :: Associations zu untersuchen, aber ich habe nicht viel Fortschritte gemacht.

Update: In meinem speziellen Fall habe ich verschiedene Ebenen von Objekten (A -> B -> C).

Antwort

6

Dies soll Ihnen helfen, den Einstieg ... Natürlich werden Sie es anpassen müssen, aber diese werden alle Beziehungsnamen, die abhängig sind zerstören von der Klasse Blogeintrag geschrieben:

BlogEntry.reflect_on_all_associations.map do |association| 
    if association.options[:dependent] == :destroy 
    # do something here... 
    association.name 
    end 
end.compact 
=> [:taggings, :comments] 
+0

Ich wusste das nicht, danke! http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html – marcgg

+0

Danke! Die Reflexion ist praktisch. –

1

Manuell pflegen Sie einfach eine Liste von assoziierten Objekten mit abhängigen Zerstören (wahrscheinlich ein Go-Ding zu tun) und dann named_scopes für jedes, um die eingeschlossenen Objekte zur Anzeige zu ziehen.

0

Ich würde sagen, dass wie erwähnt eine Möglichkeit zur Anzeige betroffener Datensätze für den Benutzer haben, dann zwei Schaltflächen/Links, eine, die ein Löschen ist, vielleicht mit einer Bestätigung Warnung für den Benutzer, der fragt, ob sie die überprüft haben andere Verbindung, die eine Liste aller Datensätze ist, die sie beeinflussen werden.

Dann, wenn Sie wirklich sicher sein möchten, können Sie auch ein weiches Löschen tun, indem Sie sie als in der Datenbank gelöscht markieren, anstatt sie tatsächlich zu löschen, was sehr nützlich sein könnte, ich weiß nicht, wie Sie damit umgehen würden auf dem automatischen abhängigen Löschen, vielleicht mit acts_as_paranoid, oder einer Art selbst gerollter Version mit einem Rückruf auf dem Elternmodell.

Verwandte Themen