Làm cách nào để Rails theo dõi những di chuyển nào đã chạy cho cơ sở dữ liệu?


93

Theo Rails doc: http://guides.rubyonrails.org/migrations.html

"Active Record theo dõi quá trình di chuyển nào đã được chạy, vì vậy tất cả những gì bạn phải làm là cập nhật nguồn của mình và chạy rake db: migrate."

ActiveRecord thực sự làm điều này như thế nào? Active Record lưu trữ dữ liệu ở đâu?

Tôi nghi ngờ điều này có thể được lưu trữ trong chính cơ sở dữ liệu? Trong một cái bàn ở đâu đó.

Trên máy phát triển của mình, tôi đã chạy tất cả các lần di chuyển. Sau đó, tôi đã sao chép cơ sở dữ liệu sản xuất bằng cách sử dụng mysqldump. Sau đó, tôi chạy "rake db: migrate: status", nó hiển thị chính xác các di chuyển cần chạy trên cơ sở dữ liệu sản xuất.

Tôi từng nghĩ rằng ActiveRecord theo dõi quá trình di chuyển cuối cùng bằng cách sử dụng dấu thời gian. Nhưng tôi nghĩ điều này không đúng vì ActiveRecord chạy chính xác các di chuyển "cũ hơn" được hợp nhất từ ​​một nhánh mã khác.

Có thể ai đó có kiến ​​thức bên trong về công phu này? Cảm ơn


1
Tôi tin rằng nó có một bảng trong cơ sở dữ liệu để theo dõi.
Jack Franklin

Câu trả lời:


166

Rails tạo một bảng trong cơ sở dữ liệu của bạn được gọi schema_migrationsđể theo dõi quá trình di chuyển nào đã chạy.

Bảng chứa một cột duy nhất version,. Khi Rails chạy một quá trình di chuyển, nó sẽ lấy các chữ số hàng đầu trong tên tệp của quá trình di chuyển và chèn một hàng cho "phiên bản" đó, cho biết nó đã được chạy. Nếu bạn quay lại quá trình di chuyển đó, Rails sẽ xóa hàng tương ứng khỏi đó schema_migrations.

Ví dụ: chạy tệp di chuyển có tên 20120620193144_create_users.rbsẽ chèn một hàng mới có phiên bản của 20120620193144vào schema_migrationsbảng.

Bạn có thể tự do giới thiệu việc di chuyển với các phiên bản trước đó. Rails sẽ luôn chạy bất kỳ quá trình di chuyển mới nào không có hàng tương ứng schema_migrations. Các chữ số hàng đầu không nhất thiết phải là dấu thời gian, bạn có thể gọi là quá trình di chuyển của mình 001_blah.rb. Các phiên bản trước của Rails đã sử dụng định dạng này và sử dụng cách đánh số tuần tự cho các lần di chuyển mới được tạo. Các phiên bản sau đã chuyển sang dấu thời gian để giúp ngăn nhiều nhà phát triển tạo ra các lần di chuyển độc lập với cùng một số lượng.


Đặc biệt hữu ích khi bạn đang sử dụng kết hợp giữa một công cụ có thể gắn và một ứng dụng giả
Donato
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.