Rayları yeniden adlandırma tablosu


154

Bir tabloyu yeniden adlandırmak istiyorum ... (herhangi bir tablo.)

Bu kod satırını denedim:

ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)

İşte garip şey. İlk kez çalıştığını biliyorum, ama şimdi bu hatayı alıyorum: ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module için undefined yöntemi `rename_table '

Ayarlamam gereken bir şey var mıydı?

Yanıtlar:


248

Bir taşıma işleminde genellikle bu tür şeyler yaparsınız:

class RenameFoo < ActiveRecord::Migration
  def self.up
    rename_table :foo, :bar
  end

  def self.down
    rename_table :bar, :foo
  end
end

1
Teşekkürler çalıştı! Önceki satırın neden olmasın hala şaşkınım. Oh iyi ..
Tommy

@Tommy, rename_tableyöntemde tanımlanır ActiveRecord::ConnectionAdapters::SchemaStatements. Diğer modüllere karıştırılması amaçlanmıştır. Doğrudan çalıştırmak istiyorsanız, yapabileceğinizi düşünüyoruminclude ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
cam

ya da çok eğimliyseniz ActiveRecord :: Migration.rename_table (: foo,: bar) kullanabilirsiniz. Ancak göç en iyi sonucu verir. Ayrıca modelin adını değiştirmek mi istiyorsunuz yoksa model adını eskisi olarak mı tutmak istersiniz? Öyleyse, ActiveRecord modelinde "set_table_name: bar" kullanarak tablo adını belirtmek isteyebilirsiniz.
Aditya Sanghi

1
Yeni formu, yukarı ve aşağı yerine 'değiştir' yöntemiyle taşıma işlemleri için de kullanabilirsiniz. örnek
MegaTux

modern raylar uygulamalarında def self.up / def.self.down değil def değişikliği. İkincisinin yapılması sessizce başarısız olacaktır.
17'de huertanix

294

Rails> = 3.1'de changeyöntemi kullanabileceğinizi unutmayın .

 class RenameOldTableToNewTable < ActiveRecord::Migration
   def change
     rename_table :old_table_name, :new_table_name
   end 
 end

37
Bu aynı zamanda herhangi bir dizin göç edecek :old_table_namekadar:new_table_name
Gavin Miller

7
Sadece küçük bir yorum: Belki şu şekilde değiştirin: old_named_things,: new_named_things, insanlara activerecord'daki tablo adlarının genellikle çoğullaştırıldığını hatırlatmak için.
Carpela

24

.rename_tablebir sınıf yöntemi değil, bir örnek yöntemidir, bu nedenle çağrı Class.methodiş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::SchemaStatementsbir 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_tablebir 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_tableuygulamanı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.upyö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.


Bunun rename_tablebir örnek yöntem olduğunu kabul ediyorum , ancak bir sınıfta tanımlanmadı, bu nedenle arama öneriniz Class.new.methodişe yaramayacak (örneğin: ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module`ActiveRecord::ConnectionAdapters::SchemaStatements.newoMethodError: undefined method
cam

1
Ayrıca, tabloyla ilişkili bir modeliniz varsa, yeniden adlandırdığınız, çalıştırdığınız rake db:migrateveya rake db:rollbackmodel.rb dosyasını yeniden adlandırmayacağınızı belirtmek gerekir. Model.rb dosyasını el ile değiştirmeniz gerekecektir.
9monkeys

1
Daha yeni Rails sürümlerinde (örn. 5.x) self.up ve self.down yerine bir değiştirme yöntemi kullanabilirsiniz , çünkü Rails bu işlemle de geri alma gerçekleştirebilir. Dolayısıyla, sadece bu kod yeterlidir: . . . . . Bu arada: Inside sana bir bu komutları kullanabilirsiniz: , , , , , , ,def change rename_table :my_table, :my_new_table endchangeadd_columnadd_indexadd_timestampscreate_tableremove_timestampsrename_columnrename_indexrename_table
Güzellik

2
ActiveRecord::Migration.rename_table(:old_table_name, :new_table_name)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.