2009-06-04 9 views
1

移行を使用してテーブルに列を追加したいとします。最後の列ではなく、特定の位置に追加する方法はありますか?私はAPIのドキュメントで "注文"オプションを見つけることができました。ActiveRecordの移行で列の順序を制御する方法はありますか?

+0

なぜあなたはこれをしたいですか? – klochner

+0

@klochner - 私はOPのために答えることはできませんが、自分のデータベースを直接見ると、関連する列をグループ化しておくと便利です。右など –

答えて

2

「ネイティブ」の移行でこれを行うことは可能ではないと思います。これは、多くのデータベースが任意の場所に列を追加することをサポートしていないためです。それをサポートしていないデータベースでこれを行うために必要なフープは自明ではありません。

データベースでサポートされていて、複数のデータベースをサポートしない場合は、マイグレーション内で直接execute文を使用できます。

3

これは実際には移行APIの一部ではありませんが、ベンダーの中立性を放棄して(DBがサポートしていれば)、実装するのはかなり簡単です。

MySQLを使用している場合は、オプションを追加するMysqlAdapterへのモンキーパッチがあります:afterと:add_columnとchange_columnを最初に追加します。 (See here for the relevant MySQL ALTER TABLE syntax。)だから、

ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do 
    def add_column_options!(sql, options) 
    super 
    if options[:after] 
     sql << " AFTER #{quote_column_name(options[:after])}" 
    elsif options[:first] 
     sql << " FIRST" 
    end 
    end 
end 

a.add_column :foos, :bar, :string, :null => false, :limit => 20, :after => "baz" 

が実行されます

ALTER TABLE `foos` ADD `bar` varchar(20) NOT NULL AFTER `baz` 

a.add_column :foos, :bar, :string, :null => false, :limit => 20, :first => true 

を実行します

ALTER TABLE `foos` ADD `bar` varchar(20) NOT NULL FIRST 

change_columnと同様です。

関連する問題