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

问题描述 投票:0回答:4

我通过“rails generated 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
ruby-on-rails
4个回答
45
投票

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

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

$rails 生成迁移 AddPartNumberToProducts 零件编号:字符串:索引

你的发电机

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
到用户表。


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

4
投票

来自 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

0
投票

也可以生成唯一索引:

rails g migration add_index_to_products_code code:string:uniq

这会给你:

class AddIndexToProductsCode < ActiveRecord::Migration[7.2]
  def change
    add_column :products_codes, :code, :string
    add_index :products_codes, :code, unique: true
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.