Nếu bạn muốn thực hiện toàn bộ quá trình di chuyển cùng một lúc, sau đó mongoid_rails_migrations sẽ thực hiện những gì bạn cần. Không có nhiều tài liệu, nó sao chép các chức năng của việc di trú ActiveRecord tiêu chuẩn. Bạn viết di chuyển của bạn, và sau đó bạn sử dụng rake db:migrate
để áp dụng chúng và nó xử lý tìm ra cái nào có và chưa được chạy. Tôi có thể trả lời thêm câu hỏi nếu có điều gì đó cụ thể mà bạn muốn biết về nó.
Để di chuyển chậm, giải pháp đơn giản nhất là sử dụng gọi lại after_initialize. Kiểm tra nếu một lĩnh vực phù hợp với kế hoạch dữ liệu cũ, và nếu có thì bạn sửa đổi nó trở thành đối tượng và cập nhật nó, vì vậy ví dụ:
class Person
include Mongoid::Document
after_initialize :migrate_data
field :name, :type => String
def migrate_data
if !self[:first_name].blank? or !self[:last_name].blank?
self.set(:name, "#{self[:first_name]} #{self[:last_name]}".strip)
self.remove_attribute(:first_name)
self.remove_attribute(:last_name)
end
end
end
Các cân bằng cần lưu ý với cách tiếp cận cụ thể tôi đã ở trên:
Nếu bạn chạy một yêu cầu trả về nhiều bản ghi, chẳng hạn như Person.all.each {|p| puts p.name}
và 100 người có định dạng cũ, nó sẽ chạy ngay lập tức 100 truy vấn được đặt. Bạn cũng có thể gọi số self.name = "#{self.first_name} #{self.last_name}".strip
thay vào đó, nhưng điều đó có nghĩa là dữ liệu của bạn sẽ chỉ được di chuyển nếu bản ghi được lưu.
Các sự cố chung mà bạn có thể gặp phải là mọi truy vấn khối lượng như Person.where(:name => /Foo/).count
sẽ không thành công cho đến khi tất cả dữ liệu được di chuyển. Ngoài ra nếu bạn thực hiện Person.only(:name).first
việc di chuyển sẽ không thành công vì bạn quên bao gồm các trường first_name
và last_name
.
Nguồn
2011-12-26 02:56:07
Tôi không nghĩ rằng di cư lười biếng là một ý tưởng tốt. Tôi muốn dành thời gian để chạy một cập nhật dữ liệu lớn, chờ cho nó hoàn thành, theo dõi, suy nghĩ về một cách để hoàn nguyên nếu có điều gì sai, và kiểm tra nó trước trên bản sao cơ sở dữ liệu. Phải mất thời gian nhưng nó sẽ không để lại cho bạn dữ liệu không thống nhất. –