Error «mysql::error: table * already exists» haciendo rake db:migrate

Soy nuevo con Ruby on Rails y es posible que este problema sea evidente para la práctica totalidad de desarrolladores, pero documento la solución ya que me ha traído algo de cabeza. Estoy pasando una aplicación en PHP a Ruby on Rails que requiere traducir un montón de campos. Para ello utilizo el plugin Globalize2. Se puede encontrar más información sobre el plugin en la siguiente dirección: Globalize2. Es compatible y está construido sobre la base del nuevo API I18n incorporado a las últimas versiones de Rails, requiriendo por lo menos la versión 2.2.

De momento había intentado migrar tres tablas. Una de ellas no requería traducciones de los campos, pero sí necesitaba claves foráneas a dos tablas, que eran las que me encargué de montar a la vez. La tabla sin traducciones es la siguiente:

class CreateBeings < ActiveRecord::Migration
def self.up
create_table :beings do |t|
t.string :nombre, :null => false
t.string :apellidos, :null => false
t.integer :group_id
t.integer :sex_id, :null => false
t.integer :age, :default => 15, :null => false
t.integer :str, :default => 12, :null => false
t.integer :dex, :default => 12, :null => false
t.integer :con, :default => 12, :null => false
t.integer :int, :default => 12, :null => false
t.integer :wis, :default => 12, :null => false
t.integer :cha, :default => 12, :null => false
t.integer :health, :default => 4, :null => false
t.integer :current_health, :default => 4, :null => false
t.integer :defense, :default => 10, :null => false
t.integer :for_save, :default => 0, :null => false
t.integer :ref_save, :default => 0, :null => false
t.integer :will_save, :default => 0, :null => false

t.timestamps
end
end

def self.down
drop_table :beings
end

#Añado las claves foráneas
add_index :beings, :group_id
add_index :beings, :sex_id
add_index :beings, [:nombre, :apellidos], :unique => true
end

Como se ve, la tabla hace referencia a otras dos llamadas group y sex. Ambas requieren traducir el título, para lo que utilicé el método create_translation_table! de cada modelo correspondiente, Group y Sex en este caso. El código era el siguiente:


class CreateGroups < ActiveRecord::Migration
def self.up
create_table :groups do |t|
t.timestamps
end
Group.create_translation_table! :titulo => :string
end

def self.down
drop_table :groups
Group.drop_translation_table!
end
end


class CreateSexes < ActiveRecord::Migration
def self.up
create_table :sexes do |t|

t.timestamps
end
Sex.create_translation_table! :titulo => :string
end

def self.down
drop_table :sexes
Sex.drop_translation_table!
end
end

Cuando intenté migrar la base de datos se me detuvo a la mitad. Me creaba algunas tablas cuya migración no había especificado, pero que obviamente el sistema añadía por tener modelos correspondientes. Me decía que ciertas tablas ya estaban añadidas. Comenté varias líneas de la migración de Groups y después me dio el mismo error con Sexes. Miré en internet y el error se ve que podía deberse al plugin. Sin embargo, parecía estar bien instalado y reconocía el método de creación de la tabla de traducción.

El error estaba en que los modelos correspondientes de las tablas sexes y groups deben especificar qué campos se van a traducir o de lo contrario la migración se detendrá sin que sugiera que ese es el problema. El código de la solución, por lo tanto, era el siguiente:


class Sex < ActiveRecord::Base
translates :titulo
end


class Group < ActiveRecord::Base
translates :titulo

end

Me está costando acostumbrarme a Ruby on Rails debido a todos los mecanismos que chirrían tras las cortinas cada vez que intento hacer la menor cosa, pero asumo que me haré según me familiarice. Es un cambio significativo en lo que respecta a PHP sin un framework, así que habrá que acostumbrarse a multitud de frustraciones, ya que parece que pagará con creces.

Deja un comentario