1

新しい列を追加したかった:

class AddNameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string, :first => true
  end
end

:firstこの列を他のすべての列の前に配置するという議論を含めました。しかし、うまくいかなかったようです:

create_table "users", :force => true do |t|
    t.string   "email",                  :default => "", :null => false
    t.string   "encrypted_password",     :default => "", :null => false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          :default => 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.string   "name"
  end

私は何か間違ったことをしていますか?

4

1 に答える 1

2

移行ファイルを使用してこれを実現することはできません。しかし、私たちは次のことを行うことができます。

     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

     So now

     a.add_column :users, :name, :string, :after => "baz"

      will execute

      ALTER TABLE `users` ADD `name` varchar(20)  AFTER `baz`

      and

      a.add_column :users, :name, :string, :first => true

      will execute

      ALTER TABLE `users` ADD `name` varchar(20)  FIRST

      Likewise for change_column.
于 2012-10-31T10:15:23.460 に答える