Migrasi rel: self.up dan self.down versus perubahan

86

Sepertinya versi rel baru memiliki metode "perubahan" versus self.up dan self.down.

Jadi apa yang terjadi ketika seseorang harus mengembalikan migrasi bagaimana cara mengetahui tindakan apa yang harus dilakukan. Saya memiliki metode berikut yang perlu saya terapkan berdasarkan tutorial online:

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

Bagaimana saya bisa melakukan hal yang sama menggunakan metode perubahan baru?

banditKing
sumber

Jawaban:

110

Untuk banyak operasi, rel dapat menebak operasi kebalikannya (tanpa masalah). Misalnya, dalam kasus Anda apa operasi kebalikan dari add_columnpanggilan saat Anda melakukan rollback? Tentu saja remove_column. Apa kebalikan dari create_table? Itu drop_table. Jadi dalam kasus ini, Rails tahu cara melakukan rollback dan mendefinisikan downmetode yang berlebihan (Anda dapat melihat di dokumentasi metode yang saat ini didukung dari metode perubahan ).

Tetapi perhatikan karena untuk beberapa jenis operasi Anda masih perlu menentukan downmetode , misalnya jika Anda mengubah ketepatan kolom desimal bagaimana menebak presisi asli saat rollback? Itu tidak mungkin, jadi Anda perlu menentukan downmetode.

Seperti yang saya katakan, saya menyarankan Anda untuk membaca Panduan Migrasi Rails .

Aldo 'xoen' Giambelluca
sumber
33

Lebih baik menggunakan Atas, Bawah, Ubah:

On Rails 3 (Reversible): yang harus menambahkan kolom baru di atas dan mengisi semua record dalam tabel hanya di atas, dan hanya menghapus kolom ini di bawah

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

def down
  remove_column :users, :location
end

Tapi:

Anda harus menghindari menggunakan metode perubahan yang memungkinkan untuk menghemat waktu. Misalnya, jika Anda tidak perlu memperbarui nilai kolom segera setelah ditambahkan, Anda akan memotong kode ini menjadi seperti ini:

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

Di atas itu akan menambahkan kolom ke tabel dan menghapusnya di bawah. Apalagi kode dan itu untung.

Di Rails 4: satu lagi cara berguna untuk menulis apa yang kita butuhkan di satu tempat:

def change
  add_column :users, :location, :string
  reversible do |direction|
    direction.up { User.update_all(location: 'Minsk') }
  end
end
Kaleem Ullah
sumber
Penjelasan yang bagus bro
Bibek Sharma
kembali? juga merupakan cara yang baik untuk memberi tahu arah Anda masuk ke dalam perubahan
baash05
Tak satu pun dari ini berhasil. Saya terus mendapatkan ActiveRecord::IrreversibleMigration.
Buang Akun
ada situasi di mana rel gagal untuk mengembalikan migrasi. silakan lihat bantuan
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
tidak ada yang istimewa di sini
sumber
Terima kasih. Tapi apa yang akan terjadi jika kau mundur. apakah dia tahu apa yang harus dilakukan?
banditKing
3
Saya ketiduran. Aldo 'xoen' Giambelluca menjelaskan semuanya.
tidak ada yang istimewa-di sini