Ich benutze postgresql und Schienen 4.2 für meine Anwendungsentwicklung. HierRails Transaktion Rollback führt zu diskontinuierlichen ID
ist die Frage:
Wenn ein Benutzermodell erstellt wird, muß ich zwei andere Modelle mit Benutzermodell zugeordnet auf mittlerweile erstellt werden: Profilmodell und user_behavior Modell. Im Falle der Konsistenz von Datensätzen zu halten, wird Transaktion wie folgt verwendet:
begin
@new_user = User.new
@new_user.transaction do
@new_user.update_attributes!(users_params)
@new_user.profile = Profile.create!(profiles_params)
@new_user.user_behavior = UserBehavior.create!
end
rescue ActiveRecord::RecordInvalid => exception
render_response_msg(4003, { message: exception.message })
rescue ArgumentError => exception
render_response_msg(4003, { message: "invalid parameters" })
end
@new_user
Beide Benutzermodell und Profilmodell hat einige Validierungen
Problem 1. Ich verwende eine Instanzvariable @new_user zu bringe den neu erstellten Benutzerdatensatz aus dem Transaktionsbereich heraus, ich bin nicht sicher, ob dies eine generische Methode ist, um dies zu tun, irgendwelche anderen Ideen?
Problem 2. wenn der Benutzer params ist gut, übergibt es und erstellt einen Benutzerdatensatz, dann Profilparameter ist nicht gültig, macht die gesamte Transaktion Rollback. Dann fand ich die ID (Basic Auto Increment ID des Modells in Schienen) des Benutzermodells ist diskontinuierlich. Wenn es beispielsweise aufgrund von Profilparametern zweimal fehlschlägt, erstellt die Erfolgs-Transaktion ein Modell mit der ID = 3. Wie kann ich das beheben?
Warum sind Lücken in 'ID'-Werten ein Problem? Sie werden einzigartig sein, das ist alles, was wirklich garantiert ist. –