rails生成迁移add_index_to ...不会将实际索引放在迁移文件中

时间:2013-10-24 17:44:44

标签: ruby-on-rails

我通过“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成功完成了这项工作。第二次通过im使用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之后创建的模式:迁移是:

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

3 个答案:

答案 0 :(得分:31)

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

  

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

     

$ rails生成迁移AddPartNumberToProducts   PART_NUMBER:字符串:索引

你的发电机

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

答案 1 :(得分:11)

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

答案 2 :(得分: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