.rename_table
è un metodo di istanza, non un metodo di classe, quindi la chiamata Class.method
non funzionerà. Invece dovrete creare un'istanza della classe, e chiamare il metodo nell'istanza, in questo modo: Class.new.method
.
[EDIT] In questo caso, ActiveRecord::ConnectionAdapters::SchemaStatements
non è nemmeno una classe (come sottolineato da cam), il che significa che non puoi nemmeno crearne un'istanza come da quello che ho detto sopra. E anche se hai usato l'esempio di cam class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
, non funzionerebbe ancora perché rename_table
solleva un'eccezione.
D'altra parte, ActiveRecord::ConnectionAdapters::MysqlAdapter
è una classe ed è probabile che questa classe dovresti usare per rinominare la tua tabella (o SQLite o PostgreSQL, a seconda del database che stai usando). Ora, come succede, ActiveRecord::ConnectionAdapters::MysqlAdapter
è già accessibile attraverso Model.connection
, quindi dovresti essere completamente in grado di fare Model.connection.rename_table
, usando qualsiasi modello nella tua applicazione. [/MODIFICARE]
Tuttavia, se desideri rinominare in modo permanente una tabella, ti suggerirei di utilizzare una migrazione per farlo. È facile e il modo preferito di manipolare la struttura del database con Rails. Ecco come farlo:
# Commandline
rails generate migration rename_my_table
# In db/migrate/[timestamp]_rename_my_table.rb:
class RenameMyTable < ActiveRecord::Migration
def self.up
rename_table :my_table, :my_new_table
end
def self.down
rename_table :my_new_table, :my_table
end
end
Quindi, è possibile eseguire la migrazione con rake db:migrate
(che chiama il self.up
metodo) e utilizzare rake db:rollback
(che chiama self.down
) per annullare la migrazione.