2016-04-12 38 views
0

我試圖增加一列,默認爲生成UUID不帶連字符作爲一個varchar(32)。目前,這是我的移民有:滑軌add_column與極限和默認在Postgres功能

add_column :users, :uuid, :string, limit: 32, default: "REPLACE(uuid_generate_v4(), '-', '')" 

但似乎錯誤,因爲它只是設置,作爲字符串文本:

PG::StringDataRightTruncation: ERROR: value too long for type character varying(32)

我似乎無法找到設置默認適當的文件值的SQL語句,但它可能是簡單的Rails中做5(https://github.com/rails/rails/pull/20005

回答

1

UPDATE

那麼我能找到你的答案。 Active Record(顯然)有一些postgresql特定的支持。如果您使用postgresql 9.4+和Active Record,則可以在架構中使用UUID。 There's an official Rails guide that describes how to do it here

原始響應

我不知道如何設置在數據庫級別,但您可以添加一個默認的活動記錄模式using a callback像這樣:

class Model < ActiveRecord::Base 
    before_create do 
    if self.uuid.nil? 
     self.uuid = REPLACE(uuid_generate_v4(), '-', '') 
    end 
    end 
end 
+0

但願運行?我的例子是Postgres的功能,而不是Ruby,但我做的紅寶石的方法是在'before_create'(因此只運行一次)用'self.uuid || = SecureRandom.uuid.gsub(「 - 」,「」)'( '||',以便您可以選擇手動設置它)。我大多隻是在能夠做到的事情 –

+0

你是完全正確的Postgres的側有興趣,之前驗證是行不通的,因爲它也將火上更新。我不知道這個功能,我只是從你的例子中複製。話雖如此,因爲你使用postgresql(正如你的錯誤陳述所證明的),我找到了你的解決方案並更新了我的答案。 – John

+0

哇,通過所有的鏈接閱讀,活動記錄實際上支持了大量的PostgreSQL的特定功能。 – John