5

Rails 3 + postgresql

列のデフォルト値にランダムな文字列のshaが必要です。

したがって、私の移行には次のものがあります。

t.string :uniqueid, default: md5(random()::text)

ただし、これを実際に生成することはできません。バッククォート、引用符などを使用しました。私が見た例から、その pg 関数はSELECTステートメントでのみ機能するようです。

それは正確ですか?どうすればこれを達成できるかについてのアイデアはありますか?

ありがとう

4

2 に答える 2

6

:より新しいバージョンのRailsを使用している場合は、おそらくbrcebnの回答を見たいと思うでしょう。


Rails はこれを解釈しようとします:

t.string :uniqueid, default: md5(random()::text)

Ruby コードとしてであり、Ruby:default => md5(...)では何の意味もありません。uniqueid引用すると、Rails はそれを文字列と見なし、文字列のデフォルト値を作成しますが、これは'md5(random()::text)'役に立ちません。

alter table列のデフォルトで関数呼び出しを使用する場合は、手動で実行できます。

connection.execute(%q{
    alter table your_table alter column uniqueid set default md5(random()::text)
})

これにより、データベースに必要なデフォルトが取得されますが、新しいデフォルトについて言及されていないことに気付くかもしれませんschema.rb。使用可能なスキーマが必要な場合は、代わりに SQL スキーマを使用する必要がありますapplication.rb

config.active_record.schema_format = :sql

次に、を削除して代わりにschema.rb使用structure.sqlします。SQL スキーマ ダンプは 3.2 まで壊れており、Rails のさまざまなバージョンでスキーマの読み込みに問題があることに注意してください (ただし、いつでもpsql < structure.sql回避できます)。良い面として、SQL スキーマ ダンプは、実際の外部キー、チェック制約、トリガーなどの凝ったものを追跡します。

ところで、本当に SHA が必要な場合は、 のdigest関数pgcryptoを参照してください。

于 2013-03-01T15:24:54.847 に答える