1

我目前正在使用一個Rails應用程序,我們在後端使用mongoid/mongoDB。我知道我不需要像遷移那樣的ActiveRecord來遷移模式,但是當我更改mongoid模型定義時,我確實需要遷移數據。是否有其他人跑到相同的情況下,如果是的話,你如何處理它?Rails/Mongoid數據庫遷移

+2

https://github.com/adacosta/mongoid_rails_migrations – rubish 2012-03-27 20:03:14

回答

2

編寫自定義rake任務將數據遷移需要

+0

謝謝。我曾想到這一點,但我需要這個運行一次。 – 2012-03-27 16:43:17

+1

我不關注。您可以輕鬆地運行一次或多次耙子任務。運行一次,然後刪除任務。 – cpjolicoeur 2012-03-27 17:21:23

+0

所以我希望它運行一次,然後有一些它運行的記錄,所以只要該記錄停留在數據庫中,它就永遠不會再運行。但是,我並沒有想到只要運行代碼就會將其刪除。 – 2012-03-27 17:40:18

0

我有一些最近的情況,在那裏我必須做一些數據遷移一次(基本更新髒數據); 因此,我在/ db/migrate /中執行了mongoid遷移,並覆蓋了db:migrate任務,以便它在該應用程序本身的mongo數據庫中創建一個集合,稱爲「遷移」,記錄被激發的遷移那麼所有遷移都不會再次運行,並且您可以繼續添加具有某種層次結構的遷移(如果遷移是相互依賴的話)。

6

即使您沒有進行架構更改,也可能需要在字段之間移動數據,或者刪除代碼庫中不再使用的字段。在部署新代碼時可以運行遷移,這很好。我建議使用名爲mongoid_rails_migrations的寶石。這爲您提供了像您習慣的遷移生成器,併爲遷移數據提供了一些組織。

class MyMigration < Mongoid::Migration 

    def self.up 
    MyModel.all.each do |model| 
     # label was renamed to name 
     model.set :name, model[:label] # copy the data from the old field to the new one 
     model.remove_attribute :label # remove the old field from the document 
     model.save! 
    end 
    end 

end 
+1

只需一個小時,在做這個的方式是'MyModel.all.rename(label::name)'。這會執行原子$重命名,並且會比手動逐步執行和保存更好的性能。 +1 for'mongoid_rails_migrations' :) – Jay 2015-05-20 00:53:32