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?
ruby-on-rails
migration
banditKing
sumber
sumber
Jawaban:
Untuk banyak operasi, rel dapat menebak operasi kebalikannya (tanpa masalah). Misalnya, dalam kasus Anda apa operasi kebalikan dari
add_column
panggilan saat Anda melakukan rollback? Tentu sajaremove_column
. Apa kebalikan daricreate_table
? Itudrop_table
. Jadi dalam kasus ini, Rails tahu cara melakukan rollback dan mendefinisikandown
metode 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
down
metode , misalnya jika Anda mengubah ketepatan kolom desimal bagaimana menebak presisi asli saat rollback? Itu tidak mungkin, jadi Anda perlu menentukandown
metode.Seperti yang saya katakan, saya menyarankan Anda untuk membaca Panduan Migrasi Rails .
sumber
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
sumber
ActiveRecord::IrreversibleMigration
.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
sumber