Rails: Wie wird ein ganzzahliges Feld ausgewählter Instanzen eines Modells erhöht?

8

Buyer model hat zwei Felder:

  • Name (Zeichenfolge)
  • Position (Ganzzahl)

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?

    
Misha Moroshko 15.01.2011, 04:47
quelle

3 Antworten

16

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%     
Sean Hill 15.01.2011, 05:16
quelle
1

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.

    
Wes Gamble 30.11.2011 19:02
quelle
-1
%Vor%

-

%Vor%     
George Anderson 15.01.2011 05:27
quelle