rails 3.2迁移无法在change方法中为create_table添加索引

时间:2012-03-15 02:02:31

标签: ruby-on-rails rails-migrations

这是我在rails 3.2.2中的迁移:

class CreateStatistics < ActiveRecord::Migration
  def change
    create_table :statistics do |t|
      t.string :name
      t.integer :item_id
      t.integer :value
      t.text :desc

      t.timestamps
      t.index [:name, :item_id]
    end

  end
end

这是迁移错误:

==  CreateStatistics: migrating ===============================================
-- create_table(:statistics)
ActiveRecord::ConnectionAdapters::TableDefinition
rake aborted!
An error has occurred, all later migrations canceled:

undefined method `index' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0xbd16888>

Tasks: TOP => db:migrate
(See full trace by running task with --trace)

创建索引的正确方法是什么?

5 个答案:

答案 0 :(得分:72)

您仍然可以将索引添加为“更改”迁移的一部分。您只需在调用create_table之外执行此操作:

class CreateStatistics < ActiveRecord::Migration
  def change
    create_table :statistics do |t|
      t.string :name
      t.integer :item_id
      t.integer :value
      t.text :desc

      t.timestamps
    end

    add_index :statistics, [:name, :item_id]
  end
end

这正确地创建了表,然后在“向上”迁移时创建索引,并在“向下”迁移时删除索引,然后删除表。

答案 1 :(得分:4)

所以我把它改成旧的方式,它的工作原理。 我认为通过使用改变方法有一种新方法。

class CreateStatistics < ActiveRecord::Migration
  def up
    create_table :statistics do |t|
      t.string :name
      t.integer :item_id
      t.integer :value
      t.text :desc

      t.timestamps
    end
    add_index :statistics, [:name, :item_id]
  end

  def down
    drop_table :statistics
  end
end

答案 2 :(得分:3)

如果您有多个索引并且不想在单个add_index调用中多次重复表名,则可以使用create_table后面的change_table块。

create_table :user_states do |t|
  t.references :user, :null => false
  t.integer :rank
  t.integer :status_code
end

change_table :user_states do |t|
  t.index [:rank, :status_code]
end

答案 3 :(得分:2)

    class CreateTempPfp < ActiveRecord::Migration
      def change
        create_table :temp_ptps do |t|
          t.string :owner
          t.integer :source_id
          t.string :source_type
          t.integer :year
          t.string :pcb_type
          t.float :january
          t.float :february
          t.float :march
          t.float :april
          t.float :may
          t.float :june
          t.float :july
          t.float :august
          t.float :september
          t.float :october
          t.float :november
          t.float :december
          t.float :dollar_per_sqft
          t.float :dollar_per_unit
          t.integer :rp_acc_code
          t.integer :rp_property_id
          t.integer :real_estate_property_id
          t.timestamps
       end
       add_index :temp_ptps, [:source_id, :source_type]
     end
   end

答案 4 :(得分:1)

看起来create_table会产生ActiveRecord::ConnectionAdapters::TableDefinition类。此类不包含方法index。相反,change_table似乎会产生ActiveRecord::ConnectionAdapters::Table类,其中包含此index方法。

如果要在create_table迁移期间添加索引,请尝试以下操作:

class CreateStatistics < ActiveRecord::Migration
  def self.up
    create_table :statistics do |t|
      t.string :name
      t.integer :item_id
      t.integer :value
      t.text :desc

      t.timestamps
    end

    add_index :statistics, :name
    add_index :statistics, :item_id
  end

  def self.down
    drop_table :statistics
  end
end