Ruby on Rails + PostgreSQL: Verwendung von benutzerdefinierten Sequenzen

8

Angenommen, ich habe ein Modell namens Transaction mit einem :transaction_code -Attribut. Ich möchte, dass dieses Attribut automatisch mit einer Sequenznummer gefüllt wird, die sich von id unterscheidet (z. B. Transaktion mit id=1 könnte transaction_code=1000 haben).

Ich habe versucht, eine Sequenz für Postgres zu erstellen und dann den Standardwert für die Spalte transaction_code und nextval für diese Sequenz festzulegen. Die Sache ist, wenn ich @transaction.transaction_code auf RoR keinen Wert zuweise, wenn ich ein @transaction.save auf RoR ausstelle, versuche es das folgende SQL:

INSERT INTO transactions (transaction_code) VALUES (NULL);

Damit erstellen Sie eine neue Zeile in der Transactions-Tabelle mit transaction_code als NULL, anstatt das nextval der Sequenz zu berechnen und es in die entsprechende Spalte einzufügen. Wie ich herausgefunden habe, wenn Sie also NULL für Postgres angeben, wird davon ausgegangen, dass Sie wirklich NULL in diese Spalte einfügen wollen, unabhängig davon, ob sie einen Standardwert hat (ich komme von ORACLE mit einem anderen Verhalten).

Ich bin offen für jede Lösung, entweder in der Datenbank oder auf RoR:

  • Entweder gibt es eine Möglichkeit, Attribute von ActiveRecord auszuschließen %Code%
  • oder es gibt eine Möglichkeit, den Wert einer Spalte vor dem Einfügen mit einem Trigger
  • zu ändern
  • oder es gibt eine Möglichkeit, diese Sequenznummern innerhalb von RoR
  • zu generieren
  • oder anders, solange es funktioniert: -)

Vielen Dank im Voraus.

    
Ricardo Melo 19.10.2011, 11:40
quelle

2 Antworten

6

Im Moment könnten Sie die Sequenz in Ihrem ROR-Modell nicht mehr abrufen und zuordnen:

%Vor%

Ich bin nicht besonders begeistert von dieser Lösung, da ich möchte, dass dies in AR direkt korrigiert wird ... aber es funktioniert.

    
Erik Lott 30.07.2012 23:38
quelle
2

Wenn Sie den Standardwert in eine Spalte in einer INSERT -Anweisung einfügen möchten, können Sie das Schlüsselwort DEFAULT - no quotes:

verwenden %Vor%

Oder Sie können den Standard, nextval(...) in Ihrem Fall buchstabieren. Sehen Sie das Handbuch hier .

Ein trigger für diesen Fall ist einfach. Das würde ich auch empfehlen, wenn Sie sicherstellen möchten, dass nur Zahlen aus Ihrer Sequenz eingegeben werden, egal was passiert.

%Vor%

Nebenbei bemerkt: Wenn Sie Ihre eigenen (nicht-sequenziellen) Nummern als 'Sequenz' zuordnen wollen, habe ich vor einigen Tagen in einer Antwort eine Lösung dafür geschrieben:
Wie listet man Werte für eine postgresql-Sequenz auf

    
Erwin Brandstetter 19.10.2011 22:38
quelle