MySQLを介して列を追加する場合、AFTER修飾子を使用して、その列がテーブルのどこにあるかを指定できます。しかし、Railsマイグレーションを介してadd_columnを実行すると、列はテーブルの最後に作成されます。
追加した列の位置を指定するRailsマイグレーションの機能はありますか?
これは、Rails 2.3.6+で:afterパラメータを渡すことで可能になりました。
この機能を使用することの利点がわからないすべての人にとって、ORMの外部でデータベースを見ることはありませんか?何らかのUIで表示している場合は、外部キー、ステータス列、フラグなどをすべてグループ化するのが好きです。これはアプリケーションには影響しませんが、データを確認する私の能力を確実にスピードアップします。
できますよ。
簡潔な答え:
add_column :users, :gender, :string, :after => :column_name
長い答え:
次に例を示します。「sername」列の後ろに「gender」という列を「sers」テーブルに追加するとします。
Rails g migration AddGenderToUser gender:string
作成されたマイグレーションに "after =>:username"を追加すると、次のようになります。
class AddSlugToDictionary < ActiveRecord::Migration
def change
add_column :users, :gender, :string, :after => :username
end
end
この追加機能をActiveRecord Mysqlアダプターに追加するパッチを作成しました。それはマスターと2-3-stableで動作します。
Mysql固有の場合もありますが、移行の移植性が低下することはありません(他のアダプターは余分な位置決めオプションを無視するだけです)。
マイグレーションのadd_column
メソッドには位置オプションがないようです。ただし、マイグレーションはリテラルSQLの実行をサポートします。私はRails開発者ではありませんが、次のようなものです:
class AddColumnAfterOtherColumn < ActiveRecord::Migration
def self.up
execute "ALTER TABLE table_name ADD COLUMN column_name INTEGER
AFTER other_column"
end
def self.down
remove_column :table_name, :column_name
end
end
Rails内に列の位置を指定する方法はありません。実際、列が名前付きの順序で作成されるのは偶然である(したがって、これに依存しない)と思います移行中。
テーブル内の列の順序はほぼ適切であり、そうである必要があります。与えられた一般的な「理由」は、「SELECT *」を実行するときに特定のサブセットを表示できることですが、それは実際に良い理由ではありません。
他の理由はおそらくデザインの匂いですが、私が間違っている正当な理由を知りたいです!
一部のプラットフォームでは、NULLである可能性が最も高い列を最後に配置することにより、(最小限の)スペースとパフォーマンスの節約があります(DMBSは「末尾の」NULL値にディスクスペースを使用しないためですが、気づくには1980年代のハードウェアで実行している必要があると思います。