12/08/2018, 13:58

Tổng quan về migration trong ruby on rails

Xin chào các bạn đã đến với chủ đề Migration của mình, chắc hẳn trong các bạn hầu hết đều đã từng mắc hoặc thắc mắc về các lỗi cơ bản của Migration khi lập trình bằng rails. Đầu tiên mình xin được giới thiệu qua về Migration. Dưới đây là một ví dụ (ở đây mình chỉ dùng rails 5 nhé) của ...

Xin chào các bạn đã đến với chủ đề Migration của mình, chắc hẳn trong các bạn hầu hết đều đã từng mắc hoặc thắc mắc về các lỗi cơ bản của Migration khi lập trình bằng rails.

Đầu tiên mình xin được giới thiệu qua về Migration.

Dưới đây là một ví dụ (ở đây mình chỉ dùng rails 5 nhé) của Migration:

class CreateProducts < ActiveRecord::Migration[5.0]
  def change
    create_table :products do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

Migration này cho biết một mảng có tên là Products với một cột là name với kiểu dữ liệu là String và một cột là description với kiểu dữ liệu là text, bạn thấy có timestamps, ở đây nó định nghĩa cho cột updated_atcreated_at do rails trực tiếp quản lý với thời gian thực hệ thống của bạn.

Để mysql tạo table bạn phải chạy lệnh sau:

rails db:migrate

Để có thể tạo ra được file như vậy, bạn có thể gõ lệnh như sau:

rails g model Product name:string, description:text

Hệ thống sẽ tạo cho bạn một file với tên db/migrate/xxxxxxxxxx_create_products.rb với nội dung như đầu mình nói, xxxxxxxxxx ở đây là thời gian của hệ thống mà rails tự chèn vào cho các bạn.

Nếu muốn thay đổi tên một cột hoặc kiểu dữ liệu của một cột, bạn có thể dùng câu lệnh như trên để tạo ra file thực hiện nhu cầu của bạn. Ví dụ ở đây mình muốn thay đổi tên cột. Đầu tiên tạo file để làm việc đó, bạn gõ:

rails g migration RenameColumn

Trong file được sinh ra các bạn sửa như sau:

class RenameColumn < ActiveRecord::Migration
  def change
    rename_column :products, :name, :name_product
  end
end

Rồi chạy:

rails db:migrate

Bạn sẽ thay đổi cột name của table products thành name_product

Bạn có thể hủy thao tác trước đó bằng lệnh sau:

rails db:rollback STEP=X

X ở đây là số migration gần nhất bị hủy.

Nếu tên migration có dạng "AddXXXToYYY" hoặc "RemoveXXXFromYYY" và được theo sau bởi một danh sách các tên cột và các loại sau đó một sự chuyển đổi có chứa thích hợp add_columnremove_column sẽ được tạo ra. Ví dụ:

rails g migration AddPartNumberToProducts part_number:string

Khi đó ta sẽ được file có nội dung:

class AddPartNumberToProducts < ActiveRecord::Migration[5.0]
  def change
    add_column :products, :part_number, :string
  end
end

Nếu bạn muốn thêm một chỉ mục trên các cột mới, bạn có thể làm điều đó như:

rails g migration AddPartNumberToProducts part_number:string:index

Khi đó bạn sẽ có một file với nội dung:

class AddPartNumberToProducts < ActiveRecord::Migration[5.0]
  def change
    add_column :products, :part_number, :string
    add_index :products, :part_number
  end
end

Tương tự khi bạn muốn xóa một cột nào đó khỏi bảng mong muốn chỉ việc thay "Add" bằng "Remove"

Ta có các phương pháp đối với nội dung của phương pháp change

- add_column
- add_foreign_key
- add_index
- add_reference
- add_timestamps
- change_column_default (phải cung cấp :from và :to)
- change_column_null
- create_join_table
- create_table
- disable_extension
- drop_join_table
- drop_table (phải cung cấp một tên bảng)
- enable_extension
- remove_column (phải cung cấp một cột)
- remove_foreign_key (phải cung cấp một bảng thứ hai)
- remove_index
- remove_reference
- remove_timestamps
- rename_column
- rename_index
- rename_table

Trên đây là bài giới thiệu tổng quan về migration của mình, nếu có thiếu sót gì mong mọi người bỏ qua cho.

Xin cảm ơn các bạn đã xem.

0