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_column
add_foreign_key
add_index
add_reference
add_timestamps
change_column_default
(must supply a :from and :to option)change_column_null
create_join_table
create_table
disable_extension
drop_join_table
drop_table
(must supply a block)enable_extension
remove_column
(must supply a type)remove_foreign_key
(must supply a second table)remove_index
remove_reference
remove_timestamps
rename_column
rename_index
rename_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