Assalamualaikum
apabila kita isytiharkan satu migrasi(migration) untuk mengubah jadual(table) di pangkalan data(db), maka perlu diingat, selepas migrasi menambah medan(column) baru pada jadual, sistem dalam proses bekalang masih lagi menyimpan maklumat jadual sebelum ditambah medan. Oleh itu kita perlu kemaskini proses latar belakang dengan arahan :
sebagai contoh, katakan kita ada jadual customers, dan movies yang masing-masing menyimpan data pelanggan dan filem. Kita juga ada satu lagi jadual rented_movies yang akan menyimpan makluman pinjaman filem oleh pelanggan.
Kita ingin menambah id filem ke dalam jadual rented_movies ini untuk rujukan kepada jadual movies yang akan menunjukkan pelanggan telah meminjam filem yang mana satu.
class AddMovieIdToRentedMovie < ActiveRecord::Migration
def self.up
add_column :rented_movies, :movie_id, :integer, after: :user_id, index: true, null: false
begin
RentedMovie.reset_column_information
Rake::Task['db:seed:movie_id_on_rented_movie'].invoke
rescue Exception=>e
remove_column :rented_movies, :movie_id
raise "error #{e}"
end
end
def self.down
remove_column :rented_movies, :movie_id
end
end
Dalam contoh ini, aku dah siapkan skrip untuk seed jadual dalam satu rake:task dan aku hanya perlu memanggil task tersebut dari sini.
arahan ini akan menjadikan proses belakang mengemaskini maklumat jadual rented_movies dengan sebarang perubahan yang telah berlaku dan seterusnya membolehkan seed berjaya dilakukan menggunakan medan yang baharu ditambah.
RentedMovie.reset_column_information
apabila kita isytiharkan satu migrasi(migration) untuk mengubah jadual(table) di pangkalan data(db), maka perlu diingat, selepas migrasi menambah medan(column) baru pada jadual, sistem dalam proses bekalang masih lagi menyimpan maklumat jadual sebelum ditambah medan. Oleh itu kita perlu kemaskini proses latar belakang dengan arahan :
Model.reset_column_information
sebagai contoh, katakan kita ada jadual customers, dan movies yang masing-masing menyimpan data pelanggan dan filem. Kita juga ada satu lagi jadual rented_movies yang akan menyimpan makluman pinjaman filem oleh pelanggan.
Kita ingin menambah id filem ke dalam jadual rented_movies ini untuk rujukan kepada jadual movies yang akan menunjukkan pelanggan telah meminjam filem yang mana satu.
class AddMovieIdToRentedMovie < ActiveRecord::Migration
def self.up
add_column :rented_movies, :movie_id, :integer, after: :user_id, index: true, null: false
begin
RentedMovie.reset_column_information
Rake::Task['db:seed:movie_id_on_rented_movie'].invoke
rescue Exception=>e
remove_column :rented_movies, :movie_id
raise "error #{e}"
end
end
def self.down
remove_column :rented_movies, :movie_id
end
end
Dalam contoh ini, aku dah siapkan skrip untuk seed jadual dalam satu rake:task dan aku hanya perlu memanggil task tersebut dari sini.
arahan ini akan menjadikan proses belakang mengemaskini maklumat jadual rented_movies dengan sebarang perubahan yang telah berlaku dan seterusnya membolehkan seed berjaya dilakukan menggunakan medan yang baharu ditambah.
RentedMovie.reset_column_information