2012-03-15 17 views
36

aquí es mi migración en los carriles 3.2.2:carriles de 3,2 migración no puede poner índice a CREATE_TABLE en el método de cambio

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 

y aquí está el error de migración:

== 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) 

¿cuál es la manera correcta para crear un índice?

Respuesta

72

Aún puede agregar un índice como parte de una migración de "cambio". Sólo tienes que hacerlo fuera de la llamada a 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 

Esto crea correctamente la mesa y luego el índice en un "arriba" migración y borra el índice y luego la mesa en una migración "hacia abajo".

+1

Una nota rápida: @ La respuesta de Brandan aquí es" más adecuada "que injeckt's para Rails 3 migraciones de estilo que permiten métodos 'change' en lugar de métodos' up' y 'down' de estilo antiguo. Ambos están bien, solo me tomó un minuto darme cuenta de la diferencia. –

1

Parece que create_table produce una clase ActiveRecord::ConnectionAdapters::TableDefinition. Esta clase no contiene el método index. En cambio, change_table parece producir una clase ActiveRecord::ConnectionAdapters::Table que incluye este método index.

Si desea añadir un índice durante una migración create_table, intente esto:

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 
+0

sí, y la forma actual para crear tablas e índices? – linjunhalida

+0

use 'add_index: table_name, ...' fuera de su llamada 'create_table' –

+0

actualizó mi respuesta –

4

así lo cambio a la antigua usanza, y funciona. y creo que hay una nueva forma de hacerlo utilizando el método de cambio.

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 
+0

eso es exactamente lo que dije en mi respuesta –

3

Si tiene más de un índice y no desea repetir el nombre de la tabla varias veces en las llamadas a un_indice_indicador individuales, puede usar un bloque change_table que sigue a la 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 
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 
Cuestiones relacionadas