web-dev-qa-db-ja.com

Rails Migration(MySQL))では、新しい列の位置を指定できますか?

MySQLを介して列を追加する場合、AFTER修飾子を使用して、その列がテーブルのどこにあるかを指定できます。しかし、Railsマイグレーションを介してadd_columnを実行すると、列はテーブルの最後に作成されます。

追加した列の位置を指定するRailsマイグレーションの機能はありますか?

55
yalestar

これは、Rails 2.3.6+で:afterパラメータを渡すことで可能になりました。

https://Rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations

この機能を使用することの利点がわからないすべての人にとって、ORMの外部でデータベースを見ることはありませんか?何らかのUIで表示している場合は、外部キー、ステータス列、フラグなどをすべてグループ化するのが好きです。これはアプリケーションには影響しませんが、データを確認する私の能力を確実にスピードアップします。

62

できますよ。

  • 簡潔な答え:

    add_column :users, :gender, :string, :after => :column_name
    
  • 長い答え:

次に例を示します。「sername」列の後ろに「gender」という列を「sers」テーブルに追加するとします。

  1. タイプRails g migration AddGenderToUser gender:string
  2. 作成されたマイグレーションに "after =>:username"を追加すると、次のようになります。

    class AddSlugToDictionary < ActiveRecord::Migration
      def change
        add_column :users, :gender, :string, :after => :username
      end
    end
    
25
Tamik Soziev

この追加機能をActiveRecord Mysqlアダプターに追加するパッチを作成しました。それはマスターと2-3-stableで動作します。

https://Rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations

Mysql固有の場合もありますが、移行の移植性が低下することはありません(他のアダプターは余分な位置決めオプションを無視するだけです)。

8
Ben Marini

マイグレーションの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
5
Bill Karwin

Rails内に列の位置を指定する方法はありません。実際、列が名前付きの順序で作成されるのは偶然である(したがって、これに依存しない)と思います移行中。

テーブル内の列の順序はほぼ適切であり、そうである必要があります。与えられた一般的な「理由」は、「SELECT *」を実行するときに特定のサブセットを表示できることですが、それは実際に良い理由ではありません。

他の理由はおそらくデザインの匂いですが、私が間違っている正当な理由を知りたいです!

一部のプラットフォームでは、NULLである可能性が最も高い列を最後に配置することにより、(最小限の)スペースとパフォーマンスの節約があります(DMBSは「末尾の」NULL値にディスクスペースを使用しないためですが、気づくには1980年代のハードウェアで実行している必要があると思います。

1
Mike Woodhouse