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