Active # save_only_valid_attributes
-
09-06-2019 - |
Frage
Ich suche nach einer Variante der #save
Methode, die nur sparen
Attribute, die sie nicht angebracht Fehler haben.
So kann ein Modell aktualisiert werden, ohne gültigen Gesamt, und dies wird
noch verhindern ungültige Daten in die Datenbank zu speichern.
Mit dem "gültigem Attribute", meine ich jene Attribute, die Null geben, wenn @ model_instance.errors.on Aufruf (: Attribut)
Wer eine Vorstellung davon hat, wie dies zu erreichen?
Bisher habe ich folgende Möglichkeiten:
def save_valid_attributes
valid?
update_atrtibutes attributes.inject({}){|k, v, m| m[k] = v unless errors_on(k.to_sym); m}
end
Das funktioniert, wenn es keine Verarbeitung im Auftrag erfolgt, was in meinem Fall ist. Zum Beispiel habe ich eine Datenbankspalte „start_date“, und zwei Methoden definiert:
def nice_start_date=(startdate)
self.start_date = Chronic.parse(startdate) || startdate
end
def nice_start_date
self.start_date.to_s
end
Diese beiden Methoden erlauben Sie mir richtig die Benutzer eingegebenen Daten mit Chronic zu analysieren vor dem Speichern. Also, zweiter Weg, dies zu tun, ein Attribut zu einem Zeitpunkt:
def save_valid_attributes(attrib)
valid?
attrib.each{|(k,v)| send("${k}=", v); save; reload)
end
Das Modell neu geladen wird jedes Mal benötigt, da sie, wenn eines der Daten ungültig ist und nicht speichert, wird alle weiteren Attribute von Speicher verhindern.
Gibt es einen besseren Weg, dies zu tun? Ich bin sicher, dass dies in der Rails-Welt kein ungewöhnliches Problem ist, ich kann einfach nicht scheinen, nichts im Google-Universum des Wissens zu finden.
Lösung
Ich bin mir nicht sicher, wie viel Glück du damit ohne viel Herumspielen haben.
Egal, wie trocken und OO und einfach zu Ihrem Rahmen Dinge macht (was in diesem Fall ist - eine Menge =) erinnern Sie sich noch haben, um es hat vor einem Moor-Standard relationale Datenbank ausgeführt wird, die als eine atomare Commits hat es ist definieren Eigenschaften . Es ist von Grund auf neu entwickelt, um sicherzustellen, entweder alle Änderungen verpflichtet sind, oder keine.
Sie werden effektiv mit etwas über Reiten diese Standardfunktionalität sein, die + 100% gegen den Strich, wie Schienen gehen wurden arbeiten konzipiert. Dies ist wahrscheinlich (wie schon gesagt) zu inkonsistenten Daten zu führen.
sagt, dass zu haben. . . es ist immer möglich. Ich würde schauen nach dem Vorbild der manuellen Überprüfung der Attribute tun um dich kümmern, und dann die integrierte Methode object.update_attribute_with_validation_skipping.
mit
Viel Glück!
Andere Tipps
Sie können wie folgt überschrieben #save
:
def save
errors.each do |attr, msg|
send("#{attr}=", send("#{attr}_was"))
end
super
end
Damit werden alle Attribute mit Fehler zurückgesetzt an ihren ursprünglichen Wert.