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!
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
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. –