21

我通过“rails generate model User name:string email:string ...”创建了一个用户表,迁移文件也被创建了。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

现在我想在“按照教程”的电子邮件列中添加一个索引,我第一次通过使用 sqlite3 成功完成了这个。第二次通过我使用 MySql (mysql2)。再次使用生成模型创建了表格。当我运行以下命令时:

rails generate migration add_index_to_users_email

该过程以没有错误消息结束并创建迁移文件,如下所示,但没有设置任何索引..

class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
  end
end

我期待 add_index :users, :email, unique: true在那里看到......任何人都有任何想法......搜索其他线程无济于事......运行rails 4,mysql 5.6 ruby​​ 1.9.3我在initil db:migrate之后创建的架构是:

ActiveRecord::Schema.define(version: 20131024161033) do

  create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.string   "city"
    t.string   "state"
    t.string   "zip"
    t.string   "mobile_phone"
    t.string   "mobile_phone_type"
    t.date     "birth_date"
    t.string   "user_type"
    t.string   "ss_num"
    t.boolean  "agree_to_terms"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end
4

3 回答 3

41

通过http://guides.rubyonrails.org/migrations.html

如果您想在新列上添加索引,您也可以这样做:

$ rails 生成迁移 AddPartNumberToProducts part_number:string:index

你的发电机

rails generate migration add_index_to_users_email

只是创建一个空的迁移文件并且没有描述索引

所以这会更合适......

rails generate migration AddIndexToUsers email:string:index

应该给你

class AddIndexToUsers < ActiveRecord::Migration
  def change
    add_index :users, :email
  end
end

Nguyen You - 编辑

此命令 [Rails 5.2.3]

rails generate migration AddIndexToUsers email:string:index

其实会给你

class AddIndexToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :email, :string
    add_index :users, :email
  end
end

不仅是用户表,add_index还有add_column用户表。

于 2013-10-24T18:19:09.723 回答
15

rails generate migration AddIndexToUsers email:string:index

如果您已经有列,则只需添加索引,例如:

class AddIndexToUsers < ActiveRecord::Migration
  def change
    add_index :users, :email
  end
end

如果您创建新列(数据库中还没有列),它将返回:

class AddIndexToUsers < ActiveRecord::Migration
  def change
    add_column :user, :email, :string
    add_index :users, :email
  end
end
于 2015-04-10T10:54:51.877 回答
3

来自http://railstutorial.ru/chapters/4_0/modeling-users#code-email_uniqueness_index

邮件唯一性迁移没有预先定义,所以我们需要自己填写它的内容“ add_index :users, :email, unique: true ”。

结果将是:

class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end
于 2014-12-19T07:09:42.560 回答