假設我有一個名爲Transaction
的模型,它具有:transaction_code
屬性。 我希望該屬性自動填入可能與id
不同的序號(例如id=1
的交易可能有transaction_code=1000
)。Ruby on Rails + PostgreSQL:自定義序列的使用
我試圖在postgres上創建一個序列,然後使該序列的transaction_code
列的默認值爲nextval
。 的事情是,如果我不上RoR的任何值賦給@transaction.transaction_code
,當我發出的回報率一個@transaction.save
,它會嘗試做以下SQL:
INSERT INTO transactions (transaction_code) VALUES (NULL);
這樣做的是創建一個新的行在Transactions表上,將transaction_code設置爲NULL,而不是計算序列的nextval並將其插入相應的列。因此,正如我發現的那樣,如果你爲postgres指定NULL,它會假設你真的想將NULL插入到該列中,而不管它是否有默認值(我來自具有不同行爲的ORACLE)。
我接受這個任何解決方案,無論是如果對數據庫或回報率進行:
- 要麼沒有排除從ActiveRecord的的
save
- 或有屬性的方式插入前一種方法來改變列的值與觸發
- 還是有辦法內的回報率
- 或任何其他方式產生這些序列號,只要它的作品:-)
在此先感謝。
感謝Erwin的回答。問題是,在ActiveRecord的save方法中,你不能在INSERT中「發送」關鍵字DEFAULT(這可以解決這個問題,是的)。我更喜歡一種可以在Ruby on Rails應用程序中完全編碼的解決方案,而不是在數據庫上進行編程,這將使我無法在需要時無縫遷移到另一個DBMS。 –
@Ricardo:「無縫遷移到另一個數據庫管理系統」是一個不錯的幻想,但它與現實沒有太大關係,對不起。一個觸發器的一個大缺點是,你將無法在Heroku共享數據庫上使用它。 –