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