どうafter_initializeフックを使用してはどうですか?
私は、UUIDをプライマリキーとして使用しないことを前提に作業しています(そうしないと状況がより複雑になります)。私はあなたの目的のためにそれを避けるだろう。
私はテストをしなくてもこのことをすべてやっていますが、残念ながら、私は100%私は何の誤植もしていないと確信することはできません。何か問題が発生した場合は、私にメッセージしてください。
まず、プロジェクトにuuidtoolsを追加する必要があります。 「:インストールsudoのすくい宝石」と、それは宝石をダウンロードしてインストールする必要がありますが、上記、実行が追加したら、レール2と仮定すると、これは設定/ environment.rbに
Rails::Initializer.run do |config|
..
# You can try a later uuidtools version, but this is the one I've worked with
config.gem "uuidtools", :version => '2.1.1'
..
end
です。
validates_length_of :uuid, :is => 36 # Untested.. makes sense to me though
def after_initialize
self.uuid ||= UUIDTools::UUID.random_create.to_s
end
をし、テーブルを作成するための移行中:
次に、あなたのモデルでは、このコードを追加
create table :photo_albums do |t|
..
t.string :id, :limit => 36
..
end
私はそれが役に立てば幸い。
オスカー
私はそれを使用しませんでした - しかし、私はセキュリティについての妄想です。ソースコードが野放しになった場合、ハッカーは、少量のテストを行っているオブジェクトのUIDを推測することができます。エントリが作成された時点で、単にusecの組み合わせを試すことができます。 – oskarpearson
または...誰かがあなたのサンプルを直接コピーアンドペーストすると、攻撃者は漏れたソースコードを必要とせず、あなたのものも持っています。彼らはタイトルを持っていると仮定し、Time.current.usecは999999までの数字しか返しませんので、 "秘密"を得る前に999999の可能性をチェックする必要があります – oskarpearson
さらに楽しく:これは実際には合理的な規模のサービス - 何十万ものアルバムが作成されています。最終的にTime.current.usecは同じ番号を返します。アルバムのタイトルが同じで、usec値が同じ場合は、uid値が2つのアルバムで同じになることを意味します。元のポスターが共通のデフォルトアルバム名を作成する場合、またはアルバム名として「My Party」のようなものを使用した場合、それはそれほどではありません。 「誕生日のパラドックス」を見て、http://jeff.aaron.ca/cgi-bin/birthdayを試してください – oskarpearson