【问题标题】:Rails 3, I added a Table, then added a Column, now I want to add an IndexRails 3,我添加了一个表,然后添加了一个列,现在我想添加一个索引
【发布时间】:2011-04-09 07:55:42
【问题描述】:

在 Rails 3 中,

我创建了一个带有迁移的表,然后添加了一个带有迁移的列,该迁移创建了一个 has_many,belongs_to 关系....

然后我运行 rake db:migrate

我现在想添加一个索引,因为我在迁移之前忘记添加它。我可以将其添加到现有迁移文件之一(创建表)还是需要创建新迁移以向现有表添加索引?

谢谢

【问题讨论】:

    标签: ruby-on-rails migration ruby-on-rails-3


    【解决方案1】:

    如果您想在不丢失数据的情况下添加索引,则必须创建一个新的迁移来添加索引。假设你的模型叫Widget,外来模型叫Zidget

    rails generate migration AddIndexToWidgets
    

    在您的新迁移文件中db/migrate/xxxxxxxxxx_add_index_to_widgets

    class AddIndexToWidgets < ActiveRecord::Migration
      def self.up
        change_table :widgets do |t|
          t.index :zidget_id # add ':unique => true' option if necessary
        end
      end
    
      def self.down
        change_table :widgets do |t|
          t.remove_index :zidget_id
        end
      end
    end 
    

    然后像往常一样rake db:migrate,瞧,你有你的索引列。


    更新:如果您只需要添加索引,那么还有一种更简洁的方法来编写相同的内容。结果没有区别。只是如果您的表有多个更改,则前一种语法旨在干燥您的代码。

    class AddIndexToWidgets < ActiveRecord::Migration
      def self.up
        add_index :widgets, :zidget_id # add ':unique => true' option if necessary
      end
    
      def self.down
        remove_index :widgets, :column => :zidget_id
      end
    end 
    

    【讨论】:

    • 酷。你需要 Rails 3 中的 change_table 部分吗?没有它我就可以工作吗?
    • 这只是可能的方法之一。我编辑了答案以包含一个更简洁的答案。而且它们都适用于 2.x 和 3
    【解决方案2】:

    如果我忘记了类似的事情,我通常会创建一个新的迁移(特别是如果我已经在生产环境中迁移了)。但是如果您仍在开发中,那么您可以更改您的最后一个迁移文件并使用 redo rake 命令:

    rake db:migrate:redo
    

    还有:

    rake db:rollback  # Rolls the schema back to the previous version (specify steps w/ STEP=n).
    

    运行此命令以查看所有不同的 rake 任务:

    rake -T db
    

    这是 Rails 指南中讨论它的部分: http://guides.rubyonrails.org/migrations.html#rolling-back

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2015-03-09
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      相关资源
      最近更新 更多