12/08/2018, 16:26

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

0