2016-04-12 19 views
0

Üretilen bir UUID değerini varsayılan olarak bir varchar olarak tire olmayan bir sütun eklemeye çalışıyorum (32). Şu anda bu benim göç vardır şudur:Bir sınırla add_column ve Postgres Fonksiyonu ile rails rayları

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

Ancak, yalnızca dize metin olarak o ayarlıyor çünkü dışarı hata gibi görünüyor:

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

Bir varsayılan ayarlama konusunda doğru belge bulmak gibi olamaz bir sql açıklamaya değer, ancak 5 (https://github.com/rails/rails/pull/20005)

cevap

1

UPDATE Rails yapmak daha basit olabileceğini

Cevabınızı bulabildim. Aktif Kayıt (görünüşte) bazı postgresql özel destek var. Postgresql 9.4+ ve Aktif Kayıt kullanıyorsanız, şemanızda UUID'lerden yararlanabilirsiniz. There's an official Rails guide that describes how to do it here.

ORİJİNAL TEPKİ

Ben veritabanı düzeyinde bu nasıl ayarlanacağını bilmiyorum ama şöyle Active kayıt modeli using a callback için varsayılan ekleyebilirsiniz:

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

Keşke koşmak ? Örneğim postgres işleviydi ve yakut değil, ama ruby ​​içinde yaptığım şekilde 'before_create' içinde (yani sadece bir kez çalışır)' self.uuid || = SecureRandom.uuid.gsub ("-", "") '('||' böylece manuel olarak ayarlamayı seçebilirsiniz). Ben çoğunlukla sadece –

+0

şeylerin postgres tarafında yapmak mümkün olmakla ilgileniyorum Ben validate aynı zamanda güncelleme ateş gibi çalışacağından önce tamamen haklısınız. İşlev hakkında hiçbir fikrim yok, sadece senin örneğinden kopuyordum. Yani, postgresql kullandığınız için (hata bildiriminizdeki gibi), çözümünüzü buldum ve cevabımı güncelledim. – John

+0

Vay, tüm bu bağlantıyı okuyarak Aktif Kayıt aslında çok sayıda postgresql özel özelliğini desteklemektedir. – John