Ray geçişleri: self.up ve self.down ile değişim


86

Görünüşe göre yeni rails sürümünde self.up ve self.down yöntemlerine karşı "değişiklik" var.

Öyleyse, kişi bir geçişi geri almak zorunda kaldığında ne olur, hangi eylemleri gerçekleştireceğini nasıl bilir? Çevrimiçi bir öğreticiye göre uygulamam gereken aşağıdaki yönteme sahibim:

class AddImageToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end

  def self.down
    remove_column :users, :image_file_name, :string
    remove_column :users, :image_content_type, :string
    remove_column :users, :image_file_size, :integer
    remove_column :users, :image_updated_at, :datetime
  end    
end

Yeni değişiklik yöntemini kullanarak aynısını nasıl yapabilirim?


Yanıtlar:


110

Birçok işlem için raylar ters işlemin ne olduğunu tahmin edebilir (sorunsuz). Örneğin, sizin durumunuzda, geri add_columndöndüğünüzde aramanın tersi işlemi nedir? Tabii ki öyle remove_column. Tersi nedir create_table? Bu drop_table. Dolayısıyla bu durumlarda raylar nasıl geri alınacağını bilir ve bir downyöntemin tanımlanması gereksizdir (belgelerde şu anda değişiklik yönteminden desteklenen yöntemleri görebilirsiniz. ).

Ancak dikkat edin, çünkü bir tür işlem için yine de downyöntemi tanımlamanız gerekir , örneğin bir ondalık sütunun kesinliğini değiştirirseniz, geri alma sırasında orijinal kesinliği nasıl tahmin edersiniz? Bu mümkün değil, bu nedenledown yöntemi .

Dediğim gibi, Rails Geçiş Kılavuzunu okumanızı öneririm .


33

Yukarı, Aşağı, Değiştir kullanmak daha iyidir:

Raylarda 3 (Tersine Çevrilebilir): Yukarıya yeni sütun eklemeli ve tablodaki tüm kayıtları yalnızca yukarıdan doldurmalı ve yalnızca bu sütunu aşağıdan silmeli

def up
  add_column :users, :location, :string
  User.update_all(location: 'Minsk')
end

def down
  remove_column :users, :location
end

Fakat:

Biraz zaman kazanmanızı sağlayan değiştirme yöntemini kullanmaktan kaçınmanız gerekiyordu. Örneğin, sütun değerini ekledikten hemen sonra güncellemeniz gerekmediyse, bu kodu şu şekilde kesersiniz:

def change
  add_column :users, :location, :string
end

Yukarıya, tabloya sütun ekleyecek ve aşağıya kaldıracaktır. Çok daha az kod ve bu bir kâr.

On Rails 4: İhtiyacımız olanı tek bir yerde yazmanın daha kullanışlı bir yolu:

def change
  add_column :users, :location, :string
  reversible do |direction|
    direction.up { User.update_all(location: 'Minsk') }
  end
end

Güzel açıklama kardeşim
Bibek Sharma

geri dönüyor mu? aynı zamanda değişimin içinde gideceğiniz yönü söylemenin iyi bir yoludur
baash05

Bunların hiçbiri işe yaramıyor. Sadece almaya devam ediyorum ActiveRecord::IrreversibleMigration.
Hesaptan

Rayların geçişi geri alamadığı durumlar vardır. lütfen yardımlarını
Kaleem Ullah

1
class AddImageToUsers < ActiveRecord::Migration
  def change
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end
end

Teşekkürler, ama geri dönersen ne olur? ne yapacağını biliyor muydu?
banditKing

3
Uyuyakalmışım. Aldo 'xoen' Giambelluca her şeyi açıklıyor.
özel bir şey yok
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.