3

私はRuby&Railsを初めて使用します...目標は、主キー(id)が整数ではなくGUIDであるUserクラスを作成することです。ActiveRecordの最後の設定が適切に行われていると思います(整数型のID列を自動生成するのではなく、代わりに文字列型の列IDを使用ます)。GUIDを生成できる関数です。

この時点で唯一欠けているのは、私が書いた*generate_guid*関数を使用してRailsにIDで新しいUserクラスを初期化させることです。

私の質問:RailsにランダムなGUIDでIDを初期化させるにはどうすればよいですか?例えば...

@user = User.new
@user.id
> 'AG5CE52' # <-- A randomly generated GUID...

Userのインスタンスがデータベースからロードされた場合、既存のユーザーのIDを変更してはならないことを考慮することも重要です。GUIDは、ユーザーを初めて作成するときにのみ生成する必要があります。

以下にいくつかのコードサンプルを示します。

モデル

class User < ActiveRecord::Base
  before_create :generate_guid  # This doesn't seem to do anything (when I call User.new)

  set_primary_key :id

  protected

  def generate_guid
    begin
      id = SecureRandom.urlsafe_base64
    end while User.where(:id => id).exists?
    self.id = id
  end
end

移行

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users, {:id => false} do |t|
      t.string :id
      ...
    end
    execute "ALTER TABLE users ADD PRIMARY KEY (id);"
end

提案は大歓迎です!

  • デイブ
4

1 に答える 1

4

after_initializeクラスのオブジェクトがインスタンス化されるたびに呼び出されるコールバックを使用できます。

 class User < ActiveRecord::Base
   after_initialize :generate_guid, unless: :guid
   def generate_guid
     self.guid = # your method here
   end
 end

このフィールドを移行の主キーに設定することもできます。

create_table :users, primary_key: :guid do |t| 

ただし、オブジェクトをインスタンス化するたびにGUIDを作成する必要が本当にありますか?それは本当に計算コストがかかるようです。そして誰かがコメントしたように、あなたが一般的なパターンや慣習から抜け出すとき、レールが時々奇妙に振る舞うことに注意してください...

于 2012-12-02T19:28:22.990 に答える