2009-08-05 7 views
1

Ok, das ist ein bisschen ungewöhnlich, aber ich habe eine Reihe von Datenerfassungsformularen, die Daten in ihre jeweiligen Modelle speichern. Ich möchte automatisch einen gemeinsamen übergeordneten Datensatz (Aktivitäts-/Ereignisprotokoll - separates Modell) einfügen, der jedem Formular gemeinsam ist. (Alle Formulare speichern einen impliziten Datensatz in diesem Modell, bevor der untergeordnete Datensatz gespeichert wird). So ist die Sequenz speichert sein muss wie folgt:Ruby/Rails - Erstellen Sie implizit einen übergeordneten Datensatz beim Erstellen eines untergeordneten Datensatzes?

1) Auf jeder Detailformular Erfassung von Benutzereingaben 2) Erstellen Sie einen neuen übergeordneten Datensatz enthält Zusammenfassung info (Benutzer-ID, Datensatztyp, Zeitstempel) 3) Nehmen Sie die neuen Eltern PK-Wert für die Insertion (als Fremdschlüssel) in den Detaildatensatz 4) Füllen Sie den Detaildatensatz mit Daten der Benutzereingabe und den FK-Daten, dann speichern 5) Commit (oder Rollback)

wie kann ich dies tun - Wo sind die Haken für so etwas? Offensichtlich muss ich ein Standardverhalten in Rails überschreiben, um dies zu tun - hat jemand irgendwelche Beispiele gesehen, die sie teilen können?

TIA, Brendan

P. S. Bevor Sie meinen, dass dies ein Bass-Ackward-Ansatz ist, muss ich den Anwendungsfall behandeln, bei dem eine Aktivität/ein signifikantes Ereignis auftritt, die zugrunde liegenden Detailinformationen jedoch nicht verfügbar sind.
(Dies tritt wahrscheinlich bei extern importierten Daten auf, wenn nur das übergeordnete Element erstellt wird). Im Moment bin ich hauptsächlich daran interessiert, eine Rails-Lösung dafür zu erforschen.

Antwort

4

Es gibt mehrere Möglichkeiten, dies zu erreichen, je nachdem, wie Sie es wollen.

  • BEFORE_SAVE Filter in Ihrem Kind Aktenmodell,

     
    
    class YourModel < ActiveRecord::Base 
        before_save :create_parent 
    
        def create_parent 
        #do something here 
    
        end 
    
    end 
    

  • Active Record Beobachter (folgt ein Beobachter-Muster)

    Dies geht in Ihrem environment.rb Datei

     
    
        config.active_record.observers = :yourmodel_observer 
    
    

    erstellen eine yourmodel_observer.rb Datei

    und Code

     
        class YourModelObserver < ActiveRecord::Observer 
    
        def after_save(object) 
    
        end 
    
        def after_update(object) 
    
        end 
        end 
    
    

  • +0

    Rishav, Excellent - genau das, was ich für -Thx viel für die schnelle Antwort suchen! (Der Nebel in meinem Gehirn beginnt sich zu klären!) – BrendanC