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:
Vielen Dank im Voraus.
Wenn Sie den Standardwert in eine Spalte in einer INSERT
-Anweisung einfügen möchten, können Sie das Schlüsselwort DEFAULT
- no quotes:
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
Tags und Links ruby-on-rails activerecord save postgresql rails-postgresql