2011-07-20 11 views
1

私はRoRマルチテナントアプリケーションを構築しています。したがって、アプリケーションデータベースはさまざまな場所にあるホストになり、分割または再統合することができます。だから私はいくつかのプライマリキーが必要です:古典的な自動インクリメントIDと私のメインモデルの外来キー(diviseすることはできませんでした)です。Ruby on Railsの移行、2つの主キーが1つだけ自動インクリメント

私はそのような何かやりたい:

create_table :table_name do |t| 
    t.primary_key :id 
    t.primary_key :second_id, :auto_increment => false 
    # ... 
    t.timestamps 
end 

をしかし、私は、任意のアイデアを右構文を見つけませんか?

:私は移行でそれをしたい!

答えて

0

多くの研究とテストの結果、古典的な移行では不可能だと思います。しかし、私は移行を使って自分のデータベースを管理し続けるソリューションを見つけました。 executeコマンドでSQLの部分を含めることができます。

だから、私の作成はそのようになります。

def self.up 

    execute "CREATE TABLE `table_name` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `org_id` int(11) NOT NULL, 
    `created_at` datetime DEFAULT NULL, 
    `updated_at` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`, `org_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=151 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;" 

end 

def self.down 
    drop_table :table_name 
end 

それは本当にきれいではありませんが、それは仕事をします。

+0

次に、レールの 'find'メソッドを使用してIDを取得する機能を失います – Anwar

+0

@Anwarなぜですか?自動インクリメント付きの古典的なMySQLテーブルを作成するだけです。 –

+0

私はそれを今日テストしました。デュアルコラム表がレールの 'find_by_id'メソッドを失い、' find'も期待通りに動作しません – Anwar

2

テーブルに2つの主キーを持つことはできません。

あなたは、あなたがしたい場合は、二つのフィールドで構成される複合主キーを持つことができる2つの候補キー(他のDBでのMySQLのユニークなインデックス/制約でキーと呼ばれる)

を持つことができます。私はこれがmySQLの構文だと思う。primary key (fieldA,fieldB)

しかし、フィールドの1つがオートインクリメントのときにコンポジットキーを実行するのはほとんど意味がない。 autoincrement alreaydはそれ自身でユニークになり、id以外のすべての属性はそれに機能的に依存します。プライマリキーにsecond_idを含めることはあなたを助けません。

+0

もちろん、私は複合主キーを言いたいと思っていました。問題は同じです。 **私はMySQLでこれを行う方法を知っていますが、RoRの移行ではありません。** –

+0

ああ。私はおそらくこれが役立つだろうhttp://compositekeys.rubyforge.org/ –

+0

私はこの宝石を見ましたが、可能ならば、私が必要とする多くのことを宝石が行うので、私はこれを自分で管理することを好むでしょう。 –

0

CREATE TABLE testtst

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY、NULL NOT

second_id INT、NULL NOT

timest DATE、

UNIQUE( second_id

)ENGINE = MYISAM ;

これはこれですか?

+0

second_idも一意ではない外部キーであるため、正しくありません。 **そして私はRoRの移行でこれをやりたい** –

関連する問題