Rails geçişini kullanarak sütunlar nasıl bırakılır


Yanıtlar:


917
remove_column :table_name, :column_name

Örneğin:

remove_column :users, :hobby

hobi Sütununu kullanıcılar tablosundan kaldıracaktır.


9
Ve bunu @Powers tarafından açıklandığı gibi değil , içeride upve downyöntemlerde yaptığınızdan emin olun change.
XåpplI'-I0llwlg'I -

7
@ XåpplI'-I0llwlg'I-Yorum için teşekkürler. Değişiklik yöntemi Rails 4 uygulamalarında bir sütunu bırakmak için kullanılabilir, ancak Rails 3'te kullanılmamalıdır. Cevabımı buna göre güncelledim.
Powers

9
Yöntemin remove_column :table_name, :column_name, :type, :optionsiçinde de kullanabilirsiniz change, çünkü taşıma türünü geri döndürme türünü belirtirseniz mümkündür. Belgelerden; ve parametreler eğer varsa göz ardı edilecektir. Bunları bir geçiş yönteminde sağlamak yararlı olabilir, böylece geri alınabilir. Bu durumda, ve add_column tarafından kullanılacaktır. typeoptionschangetypeoptions
Nicolas

24
Rails4'te, changeyalnızca sütun türünü belirtirseniz yöntemdeki bir sütunu kaldırabilirsiniz . Örn remove_column, :table_name, :column_name, :column_type. Aksi takdirde, geçişi çalıştırmaya çalışırken aşağıdaki hatayı alırsınız:remove_column is only reversible if given a type
Dennis


371

Rails'in eski sürümleri için

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Ray 3 ve üstü için

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"raylar g", "raylar oluşturmak" için bir alternatif olarak kullanılabilir
Noz

44
rails g migration remove_field_name_from_table_name field_name:datatypeayrıca çalışır
Stuart Nelson

6
Da unutmayın AddXXXtoTTTbir RemoveXXXFromTTTveri_türü ve uygun add_column ve remove_column ifadeleri oluşturulacaktır:: filed_name bir beyaz aralıklı listeye takip edebilir rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integertek göç kullanarak iki özelliklerini kaldırır. Ayrıca yöntem remove_columntarafından desteklenmediğini unutmayın change, bu nedenle hem upve hem de yazmanız gerekir down.
Claudio Floreani

3
Raylar 4 bunu destekliyor gibi görünüyor change. Geri alma olması gerektiği gibi çalışır.
Unknown_Guy

2
@AdamGrant Geri döndürülebilecek bir changeyöntem kullanıyorsanız * veri türünü (ve diğer tüm alan değiştiricilerini) bilgilendirmeniz gerektiğini düşünüyorum, bu nedenle bu taşımayı geri alırsanız alan doğru şekilde yeniden oluşturulabilir. * Geri döndüğümde, bu veritabanı yapısı açısından, elbette, bu sütundaki veriler açıkça kaybolacaktır.
RFVoltolini

117

Raylar 4 güncellendi, bu nedenle değiştirme yöntemi bir sütunu bırakmak için geçişte kullanılabilir ve taşıma başarıyla geri alınır. Rails 3 uygulamaları için lütfen aşağıdaki uyarıyı okuyun:

Rails 3 Uyarı

Bu komutu kullandığınızda lütfen unutmayın:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

Oluşturulan taşıma şöyle görünür:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

Bir veritabanı tablosundan sütunları kaldırırken değişiklik yöntemini kullanmadığınızdan emin olun (Rails 3 uygulamalarındaki taşıma dosyasında ne istemediğinize bir örnek):

  def change
    remove_column :table_name, :field_name
  end

Remove_column söz konusu olduğunda Rails 3'teki değişiklik yöntemi akıllı değildir, bu nedenle bu taşımayı geri alamazsınız.


3
sonra komisyon db çalıştırın: göç
roxdurazo

1
@Powers - parlak ve net bir cevap - aşağıdakileri ayrıntılı olarak açıklayabilir misiniz: "Rails 3'teki değişiklik yöntemi remove_column söz konusu olduğunda akıllı değildir, bu nedenle bu taşımayı geri alamazsınız."
BKSpurgeon

1
@BKSpurgeon - Rails 3'te, changeyöntemi kullanırsanız , rake db:rollbackkomut hata verir. rake db:rollbacktemelde bunun tam tersidir rake db:migrate. Bu hata Rails 4'te düzeltildi :)
Powers

2
Rails 4'te, bir değişiklik bırakma sütununu geri almaya çalıştım. Başarısız olur ve
data_type (

1
@Rmcsharry için de aynı sorun oluştu. Benim raylar sürüm 4.2.2 ve ben değişiklik yöntemi kullanılır. geri almaya çalıştığımda, remove_column yalnızca bir tür verilirse geri döndürülebilir bir hata oluştu.
M. Habib

38

Bir rails4 uygulamasında, sütunları kaldırmak için de değişiklik yöntemini kullanmak mümkündür. Üçüncü parametre data_type'dir ve isteğe bağlı olarak seçenekler sunabilirsiniz. Belgelerin 'Kullanılabilir dönüşümler' bölümünde biraz gizlidir .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

Bunu yapmanın iki iyi yolu vardır:

remove_column

Remove_column komutunu aşağıdaki gibi kullanabilirsiniz:

remove_column :users, :first_name

Şemanızda yalnızca tek bir değişiklik yapmanız gerekiyorsa bu sorun olmaz.

değiştirilebilen blok

Bunu, aşağıdaki gibi bir change_table bloğunu kullanarak da yapabilirsiniz:

change_table :users do |t|
  t.remove :first_name
end

Bunu daha okunaklı bulduğum için tercih ederim ve aynı anda birkaç değişiklik yapabilirsiniz.

Desteklenen change_table yöntemlerinin tam listesi:

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


15

raylarda 5 terminalde bu komutu kullanabilirsiniz:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

örneğin access_level (string) sütununu tablo kullanıcılarından kaldırmak için:

rails generate migration remove_access_level_from_users access_level:string

ve sonra çalıştırın:

rake db:migrate

14

Bir sütunu, taşınacaksa ( rake db:migrate) sütunu bırakacak şekilde kaldırmak için taşıma oluşturun . Ve bu taşıma geri alınırsa sütun geri eklemelidir ( rake db:rollback).

Sözdizimi:

kaldır_ sütun: tablo_adı,: sütun_adı,: tür

Sütunu kaldırır, ayrıca taşıma geri alınırsa sütunu geri ekler .

Misal:

remove_column :users, :last_name, :string

Not : data_type öğesini atlarsanız taşıma sütunu başarıyla kaldırır, ancak taşıma işlemini geri alırsanız bir hata atar.


13

Raylar 5.2 için Açık ve Basit Talimatlar

  • UYARI: Veritabanınızdan bir sütun kaldırırsanız veri kaybedersiniz . Devam etmek için aşağıya bakın:
  • Uyarı: Aşağıdaki talimatlar önemsiz taşıma işlemleri içindir . Milyonlarca ve milyonlarca satır içeren karmaşık taşıma işlemleri için, hata olasılığını hesaba katmanız gerekecek, ayrıca taşıma işlemlerinizi hızlı bir şekilde çalışacak şekilde nasıl optimize edeceğinizi ve kullanıcıların uygulamanızı kullanırken kullanma olasılığını da düşünmelisiniz. göç süreci gerçekleşiyor. Birden fazla veritabanınız varsa veya uzaktan karmaşık bir şey varsa, bir şeyler ters giderse beni suçlamayın!

1. Taşıma oluşturma

Terminalinizde aşağıdaki komutu çalıştırın :

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Not: tablo adı ray kuralına göre çoğul olmalıdır.

Misal:

Benim durumumda acceptedsütun (boolean değeri) quotestablodan kaldırmak istiyorum :

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Dokümantasyon Bkz re: bir kongre bir tabloya alanları ekleme / kaldırma sırasında:

Bir tabloya alan ekleyen geçişler oluşturmak için özel bir sözdizimsel kısayol vardır.

raylar taşıma oluşturur add_fieldname_to_tablename fieldname: fieldtype

2. Taşımayı kontrol edin

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3. Taşımayı çalıştırın

rake db:migrate

.... Ve sonra yarışlara gidiyorsun!


şimdi göçler de çalıştırılabilirrails db:migrate
Imran Ali

12

RAILS 5 Uygulaması için Sütunları Kaldırma

rails g migration Remove<Anything>From<TableName> [columnName:type]

Yukarıdaki komut, db/migratedizin içinde bir taşıma dosyası oluşturur . Snippet darbesi, Rails jeneratörü tarafından oluşturulan tablo örneğindeki kaldırma sütunlarından biridir,

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

Ayrıca burada bulunabilir Raylar için hızlı bir başvuru kılavuzu yaptım .



10
rails g migration RemoveXColumnFromY column_name:data_type

X = sütun adı
Y = tablo adı

DÜZENLE

Değişti RemoveXColumnToYiçin RemoveXColumnFromYyorum göre - göç aslında ne yaptığını daha netlik sağlar.


3
"Kaldır sütun için masaya" öylesine garip sesler gelen burada daha iyi bir seçim gibi görünüyor.
Sebastian vom Meer

@SebastianvomMeer evet I concur - İngilizce 'from' ile çok daha iyi okuyor
BKSpurgeon

8

Sütunu tablodan kaldırmak için aşağıdaki taşımayı çalıştırmanız gerekir:

rails g migration remove_column_name_from_table_name column_name:data_type

Sonra komutu çalıştırın:

rake db:migrate

5

Aşağıdaki komutu kendi başına taşıma dosyasına ekleyecektir

rails g migration RemoveColumnFromModel

Yukarıdaki komutu çalıştırdıktan sonra, göçmenlik dosyasını kontrol edebilirsiniz remove_column kodu kendi başına eklenmelidir

Sonra db'yi taşıyın

rake db:migrate


5

Aşağıdaki gibi basit 3 adımda tablodan sütun kaldırmak için:

  1. bu komutu yaz

rails g migration remove_column_from_table_name

bu komutu terminal ve bu ad ve zaman damgası tarafından oluşturulan bir dosyada çalıştırdıktan sonra (remove_column from_table_name).

Sonra bu dosyaya gidin.

  1. dosyanın içine yazmalısın

    remove_column :table_name, :column_name

  2. Sonunda konsola gidin ve

    rake db:migrate


2

Heres raylar konsolundan bir tane daha

ActiveRecord::Migration.remove_column(:table_name, :column_name)


1

Sayesinde
remove_column :table_name, :column_name
bir geçiş dosyasındaki

Bir sütunu, aşağıdakileri yazarak doğrudan raylar konsolundan kaldırabilirsiniz:
ActiveRecord::Base.remove_column :table_name, :column_name


1

Bunu yapın;

rails g migration RemoveColumnNameFromTables column_name:type

yani rails g migration RemoveTitleFromPosts title:string

Her neyse, ActiveRecord veritabanı sütunlarını çalışma zamanında önbelleğe aldığından, çalışmama süresini de dikkate almak daha iyi olur, böylece bir sütunu bırakırsanız, uygulamanız yeniden başlatılana kadar istisnalara neden olabilir.

Ref: Güçlü göç


1

Basitçe, sütunu kaldırabilirsiniz

remove_column :table_name, :column_name

Örneğin,

remove_column :posts, :comment

1

ilk önce şu komutu çalıştıran bir taşıma dosyası oluşturmaya çalışın:

rails g migration RemoveAgeFromUsers age:string

ve sonra projenin kök dizininde şu komutu çalıştıran geçişi çalıştırın:

rails db:migrate
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.