有人可以给我简单介绍一下如何使用 Mongoid 在 Rails 中进行数据库迁移吗?我对每个文档的惰性迁移特别感兴趣。我的意思是,每当您从数据库中读取文档时,您都会将其迁移到最新版本并再次保存。
以前有人做过这样的事情吗?我遇到过mongoid_rails_migrations https://github.com/adacosta/mongoid_rails_migrations,但它不提供任何类型的文档,虽然看起来它是这样做的,但我不太确定如何使用它。
我应该指出,我只是在概念上熟悉 ActiveRecord 迁移。
如果您想一次完成整个迁移,那么 mongoid_rails_migrations 将满足您的需要。没有太多需要记录的内容,它复制了标准 ActiveRecord 迁移的功能。您编写迁移,然后使用rake db:migrate
应用它们,它可以确定哪些已经运行,哪些尚未运行。如果您想了解具体内容,我可以回答更多问题。
对于惰性迁移,最简单的解决方案是使用初始化后 http://mongoid.org/docs/callbacks.html打回来。检查某个字段是否与旧数据方案匹配,如果匹配,则修改该对象并更新它,例如:
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
使用我上面给出的具体方法时要记住的权衡:
如果您运行返回大量记录的请求,例如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
and last_name
fields.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)