Nach dem Durchkämmen der Dokumentation habe ich eine schwierige Zeit zu verstehen, was Callback ich verwenden sollte.Rails ActiveRecord Callbacks: Update, wenn vorhanden, Create, wenn nicht existiert
Pseudocode:
wenn child_id und outage_id existieren nicht
eine Beziehung (INSERT-Anweisung) erstellen
wenn outage_id geändert wird
ändern Beziehung (UPDATE-Anweisung)
Diese Einsätze und Updates werden über collection_check_boxes
behandelt
Es gibt drei Modelle. Beziehung, Ausfall und Kind.
class Outage < ApplicationRecord
has_many :relationships
has_many :children, through: :relationships
end
class Child < ApplicationRecord
end
class Relationship < ApplicationRecord
belongs_to :outage
belongs_to :child
validate :check_if_exists, if: :outage_id_changed?
private
def check_if_exists
Relationship.where(child_id: self.child_id).update_all(outage_id: self.outage_id)
end
end
Das Problem, das ich jetzt mit Blick auf bin ist, dass ein UPDATE
immer direkt vor dem INSERT
auftritt, egal was passiert. Eine UPDATE
sollte nur auftreten, wenn der Datensatz existiert und outage_id
geändert wird.
Jeder Einblick, was ich hier falsch mache, würde geschätzt werden.
statt einer Überprüfung Schauen Sie sich den 'after_save'-Hook an, dort können Sie 'saved_changes' auf den Datensatz zugreifen und Ihre Logik darauf aufbauen Vergleichen mit den neuen Attributen – neongrau
Danke @neongrau, werde ich das untersuchen. – DnfD