Рельсы 3.2 миграция не может добавить индекс в create_table в метод изменения
вот моя миграция в рельсах 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)
Каков правильный способ создания индекса?
Ответы
Ответ 1
Вы все равно можете добавить индекс как часть миграции изменений. Вам просто нужно сделать это за пределами вызова 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
Это правильно создает таблицу, а затем индекс при миграции "вверх", а индекс уменьшает индекс, а затем таблицу на "вниз".
Ответ 2
поэтому я меняю его на старый, и он работает.
и я думаю, что есть новый способ сделать это, используя метод изменения.
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
Ответ 3
Если у вас несколько индексов и вы не хотите повторять имя таблицы несколько раз в отдельных вызовах add_index, вы можете использовать блок change_table, следующий за create_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
Ответ 4
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
Ответ 5
Похоже, что 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