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_tablemé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, :barRecuerda que en Rails> = 3.1 puedes usar el
changemétodo.fuente
:old_table_namea:new_table_name.rename_tablees un método de instancia, no un método de clase, por lo que llamarClass.methodno 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::SchemaStatementsni 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_tableplantea una excepción.Por otro lado,
ActiveRecord::ConnectionAdapters::MysqlAdapteres 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::MysqlAdapterya 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.upmétodo) y usarrake db:rollback(qué llamadasself.down) para deshacer la migración.fuente
rename_tablees un método de instancia, pero no está definido en una clase, por lo que su sugerencia para llamarClass.new.methodno funcionará (por ejemplo:ActiveRecord::ConnectionAdapters::SchemaStatements.newda eloMethodError: undefined methodnuevo error 'para ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module`rake db:migrateorake db:rollbackno cambiará el nombre del archivo model.rb. Deberá cambiar manualmente el archivo model.rb.def changerename_table :my_table, :my_new_tableend. . . . . Por cierto: Dentro dechangeque el uso de estos comandos:add_column,add_index,add_timestamps,create_table,remove_timestamps,rename_column,rename_index,rename_tablefuente