Quero renomear uma tabela ... (qualquer tabela).
Eu tentei esta linha de código:
ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)
Aqui está a coisa estranha. Sei que o fiz funcionar pela primeira vez, mas agora recebo este erro: método indefinido `rename_table 'para ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module
Havia algo que eu precisava definir?
ruby-on-rails
Tommy
fonte
fonte
rename_table
método é definido noActiveRecord::ConnectionAdapters::SchemaStatements
. Ele deve ser misturado a outros módulos. Se você queria executá-lo diretamente, eu acho que você poderia fazerinclude ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
Lembre-se de que no Rails> = 3.1 você pode usar o
change
métodofonte
:old_table_name
para:new_table_name
.rename_table
é um método de instância, não um método de classe, portanto, a chamadaClass.method
não vai funcionar. Em vez disso, você precisará criar uma instância da classe e chamar o método na instância, assim:Class.new.method
.[EDIT] Nesse caso,
ActiveRecord::ConnectionAdapters::SchemaStatements
nem sequer é uma classe (como apontado por cam), o que significa que você não pode nem mesmo criar uma instância dela conforme o que eu disse acima. E mesmo se você usou o exemplo de camclass Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
, ele ainda não funcionaria comorename_table
uma exceção.Por outro lado,
ActiveRecord::ConnectionAdapters::MysqlAdapter
é uma classe e é provável que você precise renomear sua tabela (ou SQLite ou PostgreSQL, dependendo do banco de dados que você está usando). Agora, por acaso,ActiveRecord::ConnectionAdapters::MysqlAdapter
já está acessívelModel.connection
, então você deve poder fazer isso completamenteModel.connection.rename_table
usando qualquer modelo em seu aplicativo. [/EDITAR]No entanto, se você deseja renomear permanentemente uma tabela, sugiro usar uma migração para fazê-lo. É fácil e a maneira preferida de manipular sua estrutura de banco de dados com o Rails. Veja como fazê-lo:
Em seguida, você pode executar sua migração com
rake db:migrate
(que chama oself.up
método) e usarrake db:rollback
(quais chamadasself.down
) para desfazer a migração.fonte
rename_table
é um método de instância, mas não está definido em uma classe, portanto sua sugestão de chamadaClass.new.method
não funcionará (por exemplo:ActiveRecord::ConnectionAdapters::SchemaStatements.new
fornece o errooMethodError: undefined method
novo 'para ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module`rake db:migrate
ourake db:rollback
não renomeará o arquivo model.rb. Você precisará alterar manualmente o arquivo model.rb.def change
rename_table :my_table, :my_new_table
end
. . . . . Pela maneira: Dentro dechange
você um usar esses comandos:add_column
,add_index
,add_timestamps
,create_table
,remove_timestamps
,rename_column
,rename_index
,rename_table
fonte