63

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

レールの移行で追加された列の位置を指定する機能はありますか?

4

5 に答える 5

69

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

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

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

于 2010-07-14T22:17:43.230 に答える
32

できますよ。

  • 簡潔な答え:

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

以下に例を示します。 「users」テーブルの列「 username 」の後に「 gender 」という列を追加するとします。

  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
    
于 2012-03-30T15:47:06.620 に答える
5

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
于 2008-12-16T17:02:27.690 に答える
1

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

テーブル内の列の順序はほとんど関連性があり、そうあるべきです。与えられた一般的な「理由」は、「SELECT *」を実行するときに特定のサブセットを表示できるようにすることですが、それは実際には正当な理由ではありません。

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

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

于 2008-12-16T17:49:33.430 に答える