这是我在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)
创建索引的正确方法是什么?
答案 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