0

Ich möchte eine before_save oder after_add Rückruf jedes Mal, wenn ich ein Kind-Objekt zu einem übergeordneten Objekt hinzufügen (has_many Zuordnung). Im Callback möchte ich die end_date Eigenschaft auf der Eltern (Kohorte) basierend auf den end_date Eigenschaften aller Kinder (Kurse) festlegen.Active Record Rückrufe mit has_many Zuordnung

class Cohort < ActiveRecord::Base 
    has_many :courses 
    before_save :update_end_date 

    def update_end_date 
    self.end_date = courses.order(:end_date).last.try(:end_date) 
    end 
end 

Das Problem ich erlebe, dass die Kurse sind noch nicht in die Datenbank in dem before_save Rückruf beharren, so hat courses.order(:end_date) nicht den neu hinzugefügten Kurs zurückkehren (s).

Es gibt mehrere Abhilfen I (zB mit der Ruby-courses.sort_by Methode oder mit after_save mit update) verwenden könnte, aber mein Eindruck ist, dass die Active Record order Methode verwenden, wenn möglich vorzuziehen wäre in Bezug auf Effizienz und Best-Practice . Gibt es eine Möglichkeit, dies mit Active Record in before_save zu tun, oder was könnte beste Praxis dafür sein? Es sieht so aus, als käme es zu viel, aber ich habe Probleme, Lösungen zu finden, die für mich funktionieren. Ich habe das Gefühl, dass ich darüber nachdenken muss. Vielen Dank!

Antwort

0

Sie können eine Nachspeicherung der Kurse vornehmen, die die Kohorte aktualisieren, wenn ihr Enddatum nach dem Enddatum der Kohorte liegt. und eine Nachher-Zerstörung auf dem Kurs, die der Kohorte mitteilt, ihr Enddatum zu aktualisieren, um den restlichen Kursen zu entsprechen.

class Course < ActiveRecord::Base 
    belongs_to :cohort 
    after_save :maybe_update_cohort_end_date 
    after_destroy :update_cohort_end_date 

    def maybe_update_cohort_end_date 
    if cohort && self.end_date > cohort.end_date 
     cohort.end_date = self.end_date 
     cohort.save 
    end 
    end 

    def update_cohort_end_date 
    cohort.update_end_date if cohort 
    end 
end 

class Cohort < ActiveRecord::Base 
    has_many :courses 

    def update_end_date 
    self.end_date = courses.order(:end_date).last.try(:end_date) 
    end 
end 

diese Weise können Sie nur ein Update machen, wenn die neue oder aktualisierte Kurs Enddatum der den Kohorten Enddatum ändern würde. Fängt aber auch, wenn ein Kurs entfernt wird, dann prüfe, wie das Enddatum sein soll

+0

Das macht Sinn, es in das Kind zu legen (natürlich). Ich hoffte irgendwie, die Logik in die Eltern (Kohorte) zu legen, weil dies hauptsächlich Kohorten betrifft und weil nicht alle Kurse Kohorten haben. Wenn es jedoch keinen sauberen Weg gibt, es vom Elternteil zu tun, kann ich es sicher in das Kind legen. Vielen Dank! – Zam

+0

Wenn natürlich ohne Kohorte existieren kann, müssen die Callbacks darauf überprüft werden. Ich habe meine Antwort aktualisiert, um zu überprüfen, ob die Kohorte existiert, bevor ich versuche, sie zu aktualisieren. –