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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top