Những điều cần biết về Migration trong Rails.
Bài đăng này đã không được cập nhật trong 7 năm
Khi cần thay đổi DB schema trong Rails, cách làm thông thường nhất là sử dụng command rails generate migration, nhưng có lẽ hầu hết mọi người vẫn chưa phát huy hết sự tiện lợi của command này. Bài viết này sẽ tổng hợp cách sử dụng command này.
Câu lệnh cơ bản
$ rails generate migration tên_class
$ rails generate model tên_model
Rails sẽ tạo 1 file /db/migrate/timestamp_tên_class.rb
Tạo table
$ rails g model tên_model tên_field:datatype tên_field1:datatype
id, created_at, updated_at sẽ được thêm vào tự động.
Datatype
string: chuỗi kí tự ngắntext: chuỗi kí tự dàiinteger: số nguyênfloat: số phứcdecimal: số phức (độ chính xác cao hơn)datetime: ngày giờtimestamp: thêm các field created_at, updated_attime: giờdate: ngàybinary: nhị phânboolean: true/false (1/0)
Đến đây thì rails mới chỉ tạo ra file migration chứ chưa thay đổi DB. Để thay đổi bạn cần phải thực hiện command rake
$ rails db:migrate
Để xem trạng thái của các migration chạy
$ rails db:migrate:status
Thay đổi column đã tạo
Đôi lúc cần thay đổi các thuộc tính column đã tạo. Thay đổi tên column
$ rails g migration FixColumnName
Và thêm dòng này ở method change
rename_column :table_name, :old_column, :new_column
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Thay đổi datatype column
$ rails g migration ChangeColumTo`ModelName`
Options
NULL / NOT NULL
# NULL
change_column :table_name, :column_name, :type, null: true
# NOT NULL
change_column :table_name, :column_name, :type, null: false
Index
change_column :table_name, :column_name, :type, index: true
Default
change_column :table_name, :column_name, :type, default: "fifo"
Length
# varchar(12)
change_column :table_name, :column_name, :string, limit: 12
Add/remove column
$ rails g migration AddColumnToUser fifo:string
class AddColumnToUser < ActiveRecord::Migration
def change
# Add
add_column :users, :fifo, :string
# Remove
remove_column :users, :fifo, :string
# chỉ định vị trí thêm vào
add_column :users, :fifo, :string, :after => :uuid
end
end
Add/remove index Muốn thêm/xoá index của clumn name trong User
$ rails g migration AddIndexToUser
class AddIndexToUser < ActiveRecord::Migration
def change
# Add
add_index :users, :name
# Delete
remove_index :users, :name
# Trường hợp tạo index cho nhiều columns
add_index :users, [:name, :name2]
end
end
Foreign Keys
class AddReferenceToUser < ActiveRecord::Migration
def self.up
add_foreign_key :users, :profiles
end
def self.down
remove_foreign_key :accounts, :branches
end
end
Và còn một số phương thức khác:
add_columnadd_foreign_keyadd_indexadd_referenceadd_timestampschange_column_default(must supply a :from and :to option)change_column_nullcreate_join_tablecreate_tabledisable_extensiondrop_join_tabledrop_table(must supply a block)enable_extensionremove_column(must supply a type)remove_foreign_key(must supply a second table)remove_indexremove_referenceremove_timestampsrename_columnrename_indexrename_table
Vậy mình đã tổng hợp các câu command làm việc xử lý với Migration
Nguồn: http://edgeguides.rubyonrails.org/active_record_migrations.html
All rights reserved