Ich arbeite an einer Rails 3.2.8-Anwendung, die eine homegrown REST API verwendet, um neue Daten einzufügen. Die Einfügelogik ist für jeden Endpunkt generisch und führt ganz einfach zu einem Aufruf von Model.save.Rails Override speichern, um selektives Update durchzuführen
Für einen der Modelltypen möchte ich zuerst prüfen, ob ein bereits existierender Datensatz vorhanden ist und wenn ja, im Gegensatz zum Einfügen aktualisieren. Wenn der Code mir erlauben würde, auf der Controller-Ebene zu interagieren, wäre dies durch die Verwendung von find_or_create_by einfach, aber meine einzige Option besteht darin, die Speichermethode im Modell zu überschreiben oder einen before_save Callback zu verwenden.
Ich kämpfe um herauszufinden, wie dies funktioniert, da alle Aufrufe zu speichern oder update_attributes innerhalb des Modells führt zu einer Endlosschleife (aus offensichtlichen Gründen).
Gibt es eine Möglichkeit, entweder vor_Speichern oder Speichern so zu überschreiben, dass ich zuerst prüfen kann, ob ein Datensatz mit den Attributen x und y existiert und diesen Datensatz dann abruft und die Aktualisierung vornimmt, ansonsten mit a vorwärts gehen Standard ActiveRecord speichern?
Hier ist mein Code, wie es derzeit in der Activity-Modell steht, die nicht aufgrund Problem der unendlichen Schleife funktioniert:
def save
a = UserActivity.find_or_initialize_by_user_id_and_activity_id(user_id: user_id, activity_id: activity_id)
a.update_attributes start_at: start_at, end_at: end_at.....
end
Ich fühle mich zu vermeiden, wie die Bearbeitung 'save' könnte eine ganze Dose Würmer von heiklen Problemen mit der Datenbank öffnen. Haben Sie in Erwägung gezogen, einfach 'if - else'-Anweisungen in Verbindung mit' update_attributes' und 'save' zu verwenden? –