.rename_table
bir sınıf yöntemi değil, bir örnek yöntemidir, bu nedenle çağrı Class.method
işe yaramaz. Bunun yerine bu gibi örneğinde yöntemi sınıfının bir örneğini oluşturmak ve çağrı gerekecek: Class.new.method
.
[DÜZENLEME] Bu örnekte, ActiveRecord::ConnectionAdapters::SchemaStatements
bir sınıf bile değil (cam tarafından işaret edildiği gibi), bu da yukarıda söylediğim gibi onun bir örneğini bile oluşturamayacağınız anlamına gelir. Cam'ın örneğini kullansanız bile class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
, yine de rename_table
bir istisna yaratacak şekilde çalışmaz .
Öte yandan, ActiveRecord::ConnectionAdapters::MysqlAdapter
olan bir sınıf ve büyük olasılıkla (kullanmakta olduğunuz veritabanı bağlı veya SQLite veya PostgreSQL) tablonuzu yeniden adlandırmak için kullanmak zorunda kalacak bu sınıftır. Şimdi, olduğu gibi ActiveRecord::ConnectionAdapters::MysqlAdapter
, zaten erişilebilir Model.connection
, bu yüzden Model.connection.rename_table
uygulamanızdaki herhangi bir modeli kullanarak tamamen yapabilmeniz gerekir . [/DÜZENLE]
Ancak, bir tabloyu kalıcı olarak yeniden adlandırmak isterseniz, bunu yapmak için bir taşıma işlemi kullanmanızı öneririm. Rails ile veritabanı yapınızı değiştirmenin kolay ve tercih edilen yolu. Bunu nasıl yapacağınız aşağıda açıklanmıştır:
# 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
Ardından, taşıma işleminizi rake db:migrate
( self.up
yöntemi çağıran ) ile çalıştırabilir ve taşıma işlemini geri almak için rake db:rollback
(hangi çağrıları self.down
) kullanabilirsiniz.