Di chuyển đường ray: cách tốt nhất để truy xuất phiên bản di chuyển hiện tại


78

Có cách nào tốt để lấy số phiên bản di chuyển không?

Tôi cần triển khai một phương thức trong một mô hình hoạt động khác nhau trên và ngoài một phiên bản di chuyển cụ thể.

Tôi thấy giả định_migrated_upto_version trong bộ điều hợp kết nối đang truy xuất phiên bản từ cơ sở dữ liệu nhưng không thể tìm thấy phiên bản khác.


Thông tin cơ bản: Tôi đang cố gắng xóa hai cột khỏi bảng A, muốn chuyển chúng vào bảng B và thêm liên kết vào bảng B từ bảng A.

Trong quá trình thay đổi này, tôi cần truy cập vào hai cột này. nhưng sau đó, tôi muốn thêm phương thức proxy cho các cột này để tương thích.


Tại sao bạn có mã hoạt động các phiên bản di chuyển wrt khác nhau. Bạn có vui lòng quan tâm để giải thích.
Jatin Ganhotra

Đúng. Tôi đã thêm nền tảng trong câu hỏi.
shigeya

Câu trả lời:


103

Đường ray 5.2và cao hơn:

> ApplicationRecord.connection.migration_context.current_version
   (0.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
=> 20200510093804

> ApplicationRecord.connection.migration_context.get_all_versions
   (0.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
=> [20191005164928,
    20191006111502,
   ...

 
Rails lên đến 5.1.7:

> ActiveRecord::Migrator.current_version
   (0.2ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" 
=> 20120110085802

> ActiveRecord::Migrator.get_all_versions
   (0.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" 
=> [20111114121610,
    20111115091108,
   ...

2
Chú ý: ActiveRecord::Migrator.get_all_versionskhông không bao gồm di cư chưa giải quyết. Nó chỉ bao gồm các di chuyển đã được chạy.
Joshua Pinter

1
ActiveRecord::Migrator.get_all_versionskhông hoạt động trong Rails 6. Sử dụng: ApplicationRecord.connection.migration_context.current_version ApplicationRecord.connection.migration_context.get_all_versionscho Rails 6.
Marian

144

Có một cách hay hơn nhiều: rake db:migrate:status

up     20120530222941  Create shenanigans
up     20120613030015  *** NO FILE ***

Cho biết rằng tôi đã xóa tệp di chuyển mới nhất của mình.

Hay đơn giản hơn:

> rake db:version
Current version: 20120613030015

5
Cảm ơn. Tôi biết điều đó, nhưng tôi cần truy xuất nó theo chương trình, trong một lần di chuyển.
shigeya

2

Đối với Rails 5.x / 6.x:

puts ApplicationRecord.connection.migration_context.current_version
puts ApplicationRecord.connection.migration_context.get_all_versions

1

Nếu bạn không muốn làm điều này mà không tải ứng dụng của mình, bạn có thể tạo một tập lệnh như sau:

#!/usr/bin/env ruby

root = File.expand_path("../..", __FILE__)
lines = `ls #{root}/db/migrate`
puts lines.split("\n").last.split(" ").last.split("_").first

Lưu ý rootdòng này là do tập lệnh của tôi ở dạng bindir


Điều này không cung cấp cho bạn phiên bản hiện tại, đặc biệt là trong trường hợp bạn không chạy di chuyển.
Adrien
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.