2011-12-20 41 views
25

Ai đó có thể giới thiệu ngắn gọn về việc thực hiện di chuyển DB trong Rails bằng Mongoid không? Tôi đặc biệt quan tâm đến việc lười biếng cho mỗi lần di chuyển tài liệu. Bằng cách này, tôi có nghĩa là bất cứ khi nào bạn đọc một tài liệu từ cơ sở dữ liệu, bạn di chuyển nó sang phiên bản mới nhất và lưu lại.Quản lý di chuyển mongoid

Có ai đã làm điều này trước đây không? Tôi đã đi qua mongoid_rails_migrations, nhưng nó không cung cấp bất kỳ loại tài liệu nào, và mặc dù nó có vẻ như nó thực hiện điều này, tôi không thực sự chắc chắn làm thế nào để sử dụng nó.

Tôi nên chỉ ra rằng tôi chỉ quen thuộc với khái niệm di chuyển ActiveRecord.

+0

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. –

Trả lời

21

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_namelast_name.

7

Zachary Anker đã giải thích rất nhiều trong câu trả lời của mình. Sử dụng mongoid_rails_migrations là một tùy chọn tốt để di chuyển.

Dưới đây là một số liên kết với ví dụ rằng sẽ hữu ích cho bạn để đi qua và sử dụng mongoid_rails_migrations

Mongoid Migrations using the Mongo Driver

Embedding Mongoid documents and data migrations

khác thì đây Readme là nên đủ với ví dụ này để thực hiện di cư mongoid

3

Tôi có cùng nhu cầu.

Dưới đây là những gì tôi đã đưa ra: https://github.com/nviennot/mongoid_lazy_migration

tôi sẵn sàng sẽ đánh giá cao một số thông tin phản hồi

+0

Điều này giống như chính xác điều đúng, tuyệt vời! –

Các vấn đề liên quan