Quiero cambiar el nombre de una tabla ... (cualquier tabla).
Probé esta línea de código:
ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)
Aquí está lo raro. Sé que lo hice funcionar la primera vez, pero ahora recibo este error: método indefinido `rename_table 'para ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module
¿Había algo que necesito configurar?
ruby-on-rails
Tommy
fuente
fuente
rename_table
método se define en elActiveRecord::ConnectionAdapters::SchemaStatements
. Está destinado a ser mezclado con otros módulos. Si quisieras ejecutarlo directamente, creo que podrías hacerloinclude ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
Recuerda que en Rails> = 3.1 puedes usar el
change
método.fuente
:old_table_name
a:new_table_name
.rename_table
es un método de instancia, no un método de clase, por lo que llamarClass.method
no va a funcionar. En su lugar, tendrá que crear una instancia de la clase, y llame al método en la instancia, así:Class.new.method
.[EDITAR] En esta instancia,
ActiveRecord::ConnectionAdapters::SchemaStatements
ni siquiera es una clase (como lo señaló la cámara), lo que significa que ni siquiera puedes crear una instancia de ella según lo que dije anteriormente. E incluso si usaras el ejemplo de camclass Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
, todavía no funcionaría, ya querename_table
plantea una excepción.Por otro lado,
ActiveRecord::ConnectionAdapters::MysqlAdapter
es una clase, y es probable que tenga que usar esta clase para cambiar el nombre de su tabla (o SQLite o PostgreSQL, dependiendo de la base de datos que esté usando). Ahora, como sucede,ActiveRecord::ConnectionAdapters::MysqlAdapter
ya se puede acceder a élModel.connection
, por lo que debería poder hacerlo completamenteModel.connection.rename_table
, utilizando cualquier modelo en su aplicación. [/EDITAR]Sin embargo, si desea cambiar el nombre de una tabla de forma permanente, le sugiero que utilice una migración para hacerlo. Es fácil y la forma preferida de manipular la estructura de su base de datos con Rails. Aquí se explica cómo hacerlo:
Luego, puede ejecutar su migración con
rake db:migrate
(que llama alself.up
método) y usarrake db:rollback
(qué llamadasself.down
) para deshacer la migración.fuente
rename_table
es un método de instancia, pero no está definido en una clase, por lo que su sugerencia para llamarClass.new.method
no funcionará (por ejemplo:ActiveRecord::ConnectionAdapters::SchemaStatements.new
da eloMethodError: undefined method
nuevo error 'para ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module`rake db:migrate
orake db:rollback
no cambiará el nombre del archivo model.rb. Deberá cambiar manualmente el archivo model.rb.def change
rename_table :my_table, :my_new_table
end
. . . . . Por cierto: Dentro dechange
que el uso de estos comandos:add_column
,add_index
,add_timestamps
,create_table
,remove_timestamps
,rename_column
,rename_index
,rename_table
fuente