Могу ли я добавить столбец и индексировать его одновременно? - PullRequest
1 голос
/ 29 декабря 2011

Я запустил следующую миграцию:

rails generate migration add_username_to_users username:string 

И затем я попробовал два способа добавить уникальность:

class AddUsernameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string, :unique => true
  end
  # or add_index :users, :username, :unique => true
end

Но это не сработало для меня.Я знаю, что могу запустить другую миграцию, чтобы добавить индекс, но я хотел знать, возможно ли индексировать при добавлении столбца?Таким образом, я могу свести количество миграций к минимуму.

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

Для add_column опция :unique отсутствует, поэтому :unique => true on

add_column :users, :username, :string, :unique => true

игнорируется.Вы можете сделать две вещи одновременно в одной миграции, так что просто добавьте ваш add_index к вашей миграции AddUsernameToUsers:

class AddUsernameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string, :unique => true
    add_index :users, :username, :unique => true
  end
end
1 голос
/ 29 декабря 2011

Вы также можете использовать метод change_table, например,

class AddUsernameToUsers < ActiveRecord::Migration
  def change
    change_table(:users) do |t|
      t.string :username
      t.index :username, :unique => true
    end
  end
end

Преимущество использования change_table состоит в том, что для mysql вы можете передать :bulk => true, который генерирует один оператор ALTER TABLE sql и, следовательно, намного быстрее для больших таблиц (поскольку mysql эффективно копирует всю таблицу каждый раз, когда вы выполняете изменить таблицу)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...