Pau*_*gar 25 ruby-on-rails database-migration rails-migrations mongoid
有人能给我一个简短的介绍,使用Mongoid在Rails中进行数据库迁移吗?我对每个文档迁移的懒惰特别感兴趣.这意味着,无论何时从数据库中读取文档,都要将其迁移到最新版本并再次保存.
有没有人以前做过这种事情?我遇到过mongoid_rails_migrations,但它没有提供任何类型的文档,虽然它看起来像这样做,但我真的不确定如何使用它.
我应该指出,我只是在概念上熟悉ActiveRecord迁移.
Zac*_*ker 22
如果您想立即进行整个迁移,那么mongoid_rails_migrations将满足您的需求.文档并不多,它复制了标准ActiveRecord迁移的功能.您编写了迁移,然后使用rake db:migrate它们来应用它们,并处理确定哪些已经运行但尚未运行.如果您想了解具体内容,我可以回答其他问题.
对于延迟迁移,最简单的解决方案是使用after_initialize回调.检查字段是否与旧数据方案匹配,如果是,则将对象进行修改并更新,例如:
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
Run Code Online (Sandbox Code Playgroud)
在上面给出的具体方法中要记住的权衡:
如果你运行一个返回大量记录的请求,例如Person.all.each {|p| puts p.name}100个人拥有旧格式,它将立即运行100个设置查询.您也可以打电话self.name = "#{self.first_name} #{self.last_name}".strip,但这意味着只有保存记录才会迁移您的数据.
您可能遇到的一般问题是,Person.where(:name => /Foo/).count在迁移所有数据之前,任何大量查询都会失败.此外,如果您执行Person.only(:name).first迁移将失败,因为您忘记包含first_name和last_name字段.
Zachary Anker在他的回答中解释了很多.使用mongoid_rails_migrations是迁移的一个很好的选择.
以下是一些示例链接,对您来说有用,可以使用mongoid_rails_migrations
除此之外,本例中的自述文件应该足以实现mongoid迁移
| 归档时间: |
|
| 查看次数: |
8266 次 |
| 最近记录: |