2016-04-12 10 views
0

ハイフンなしの生成されたUUIDにデフォルトで設定されているカラムをvarchar(32)として追加しようとしています。Postgres関数で制限とデフォルトを持つadd_columnをレンダリングする

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

あなたの答えを見つけることができました。アクティブレコード(明らかに)にはいくつかの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で行う方法は、 'self.uuid || = SecureRandom.uuid.gsub(" - "、" ")'で 'before_create'あなたが手動で設定することができるように、 '||'を使います)。私はたいてい、物事のポストグル側でそれをやることに興味があります –

+0

あなたは完全に正しいです。私はその機能について考えていない、私はちょうどあなたの例からコピーしていた。あなたがpostgresqlを使用しているので(あなたのエラーステートメントによって明らかにされているように)、私はあなたの解決策を見つけ、私の答えを更新しました。 – John

+0

Active Recordは、そのリンク全体を読んで、実際には多くのpostgresql固有の機能をサポートしています。 – John

関連する問題