Những điều cần biết về Migration trong Rails.
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 ...
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ắn
- text: chuỗi kí tự dài
- integer: số nguyên
- float: số phức
- decimal : số phức (độ chính xác cao hơn)
- datetime: ngày giờ
- timestamp: thêm các field created_at, updated_at
- time: giờ
- date: ngày
- binary: nhị phân
- boolean: 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