1

私たちの Web アプリケーションでは、テーブルの id フィールドに「GUID」ID が保持されています。DB の作成に使用される実際の SQL コードを調査することで、ID が実際には主キーとして遅延されていないことがわかりました。一意性は強制されていないようで、インデックスは作成されません。

これは気分が悪いので、それを修正したいと思います。目的は、ID フィールドを「主キー」として設定することだけです。

これが schema.rb のサンプルです

 create_table "projects", :id => false, :force => true do |t|
    t.string   "id"
    t.string   "name"
    t.string   "objective"
    t.datetime "created_at",                              :null => false
    t.datetime "updated_at",                              :null => false
    t.string   "client_account_id"
    t.string   "default_project_name"
    t.boolean  "quota_exceeded",       :default => false, :null => false
  end

開発では SQLite3 データベースを使用していますが、本番環境では MySQL に依存しています。

このような制約を既存の SQLite3 DB に追加することはできないことはわかっていますが、必要に応じて削除して再作成する準備ができています。可能であれば、MySQL DB をドロップすることは避けたいのですが、本当に必要な場合はバックアップして、新しいスキーマにデータを挿入することができます。

それを行うための最良のアプローチは何ですか?(Rails V3.2.6)

4

1 に答える 1

0

Railsで非標準の主キーを設定する場合は、 composite_primary_keysgemを確認する必要があります。

移行の使用では、すでに行ったように、

:id => false 

次に、モデルで次のことを試してください

require 'composite_primary_keys'
class User < ActiveRecord::Base
  self.primary_keys = :your_custom_id
end

gemはデフォルトのRails動作をオーバーライドしているため、使用するキーはcreateステートメントによって設定されます。このようにして、必要に応じて複合主キーを使用することもできます。

別のアプローチは:primary_key、移行でオプションを使用することです

create_table "projects", :primary_key => 'your_id' do 
  ...
end

また、

一意性を確保したいだけの場合は、次のようなActiveRecord検証を使用できます。

validates_uniqueness_of :your_id, :message => "ID needs to be unique"

お役に立てれば。

于 2012-07-30T10:58:08.137 に答える