Buyer
model hat zwei Felder:
Ich möchte die position
aller Käufer erhöhen, deren position >= N
.
Was ist die einfachste Methode, dies zu tun?
Ist das mit nur einer Abfrage möglich?
Sie könnten verwenden:
%Vor%Dies würde die Abfrage erzeugen, wenn n = 25:
%Vor%Bearbeiten:
Da Sie UNIQUE-Datenbankeinschränkungen haben, haben Sie eine Reihe von Optionen. Für beide Optionen empfehle ich, sie in einer Transaktion auszuführen. Zunächst können Sie jedes Feld einzeln in umgekehrter Reihenfolge aktualisieren, was jedoch zu N + 1-Abfragen führt. Bei kleinen Datenmengen ist dies kein Problem, bei größeren Datenmengen jedoch kann dies die Leistung beeinträchtigen.
%Vor%Die andere Option, um N + 1 Abfragen zu vermeiden, besteht darin, die Positionsinkremente auf 100 (oder 10) zu ändern. Dadurch können Sie die Positionen in zwei Abfragen anstelle von N + 1 aktualisieren. Anstatt also die Positionen 1, 2, 3 usw. zu haben, würden Sie 100, 200, 300 usw. haben. Um dann ein Update durchzuführen, würden Sie alle Werte um 101 erhöhen und dann dem Update mit einem Update folgen, um die 1 zu subtrahieren.
%Vor%Wenn dies Ad-hoc ist, könnten Sie den Constraint / Index löschen, das Update ausführen und es dann mit normalem altem SQL neu hinzufügen.
Tags und Links ruby-on-rails-3 ruby-on-rails