Nó thường là một ý tưởng tồi để tham khảo mô hình của bạn từ sự di cư của bạn như thế này. Vấn đề là các di chuyển chạy theo thứ tự và thay đổi trạng thái cơ sở dữ liệu khi chúng đi, nhưng các mô hình của bạn không được phiên bản. Không có gì đảm bảo rằng mô hình như nó tồn tại khi di chuyển được viết sẽ vẫn tương thích với mã di chuyển trong tương lai. Ví dụ: nếu bạn thay đổi hành vi của các thuộc tính is_active
hoặc is_live
trong tương lai thì việc di chuyển này có thể bị hỏng. Di chuyển cũ hơn này sẽ chạy đầu tiên, chống lại mã mô hình mới và có thể không thành công. Trong ví dụ cơ bản của bạn ở đây, nó có thể không cắt, nhưng điều này đã đốt cháy tôi trong triển khai trước khi các trường được thêm vào và xác nhận không thể chạy (tôi biết mã của bạn bỏ qua các xác nhận hợp lệ, nhưng nói chung đây là một mối quan tâm).
Giải pháp yêu thích của tôi cho điều này là thực hiện tất cả việc di chuyển loại này bằng SQL thuần túy. Có vẻ như bạn đã cân nhắc điều đó, vì vậy tôi sẽ giả sử bạn đã biết phải làm gì ở đó.
Một tùy chọn khác, nếu bạn có một số logic kinh doanh lông hoặc chỉ muốn mã để xem thêm Railsy, bao gồm phiên bản cơ bản của mô hình vì nó tồn tại khi di chuyển được viết trong tệp di chuyển.Ví dụ: bạn có thể đặt lớp này trong tệp di chuyển:
class Group < ActiveRecord::Base
end
Trong trường hợp của bạn, có thể điều đó đủ để đảm bảo rằng mô hình sẽ không bị hỏng. Giả sử active
và live
là các trường boolean trong bảng tại thời điểm này (và do đó sẽ bất cứ khi nào di chuyển này được chạy trong tương lai), bạn sẽ không cần thêm bất kỳ mã nào nữa. Nếu bạn có logic kinh doanh phức tạp hơn, bạn có thể đưa nó vào phiên bản mô hình di chuyển cụ thể này.
Bạn thậm chí có thể cân nhắc sao chép toàn bộ các phương thức từ mô hình của mình sang phiên bản di chuyển. Nếu bạn làm điều đó, hãy nhớ rằng bạn không nên tham khảo bất kỳ mô hình bên ngoài hoặc thư viện trong ứng dụng của bạn từ đó, hoặc, nếu có bất kỳ cơ hội mà họ sẽ thay đổi trong tương lai. Điều này bao gồm cả đá quý và thậm chí có thể là một số lớp Ruby/Rails cốt lõi, bởi vì những thay đổi phá vỡ trong đá quý là rất phổ biến (tôi đang nhìn bạn, Rails 3.0, 3.1 và 3.2!).
Nguồn
2013-03-18 06:06:21
Tại sao điều ngược lại không thể làm? – Robert
đó chỉ là lỗi đánh máy tôi đã thực hiện khi chỉnh sửa ở đây;) – user1404536