rails 3.2的迁移不能在create_table方法中添加索引

这里是我在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) 

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

您仍然可以将索引添加为“更改”迁移的一部分。 您只需在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 

这将正确地创build表,然后在“向上”迁移索引,然后删除索引,然后在“向下”迁移表。

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

 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 

如果您有多个索引,并且不想在单独的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 
  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 

它看起来像create_table产生一个ActiveRecord::ConnectionAdapters::TableDefinition类。 这个类不包含方法index 。 相反, change_table似乎产生一个包含这个index方法的ActiveRecord::ConnectionAdapters::Table类。

如果您想在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