37 votes

rails 3.2 migration ne peut pas ajouter de l'indice de create_table au changement de méthode

voici ma migration dans les 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

et voici le migrer d'erreur:

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

quelle est la bonne façon de créer un index?

73voto

Brandan Points 8311

Vous pouvez toujours ajouter un index en tant que partie d'un "changement" de la migration. Vous avez juste à le faire à l'extérieur de l'appel à 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

Ceci correctement, crée la table, puis l'index sur un "up" de la migration et des baisses de l'indice, puis la table, sur un "bas" de la migration.

4voto

linjunhalida Points 2200

j'ai donc changer à l'ancienne, et ça fonctionne. et je pense qu'il y est une nouvelle façon de faire cela en utilisant le changement de méthode.

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

1voto

Lee Jarvis Points 7909

Il ressemble create_table donne un ActiveRecord::ConnectionAdapters::TableDefinition classe. Cette classe ne contient pas la méthode index. Au lieu de cela, change_table semble donner un ActiveRecord::ConnectionAdapters::Table de la classe qui comprend cette index méthode.

Si vous voulez ajouter un index lors d'une create_table migration, essayez ceci:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X