gpt4 book ai didi

ruby-on-rails - 管理 mongoid 迁移

转载 作者:行者123 更新时间:2023-12-03 10:40:54 25 4
gpt4 key购买 nike

有人可以简要介绍一下在 Rails 中使用 Mongoid 进行数据库迁移吗?我对每个文档迁移的惰性特别感兴趣。我的意思是,每当您从数据库中读取文档时,都会将其迁移到其最新版本并再次保存。

以前有人做过这种事情吗?我遇到了mongoid_rails_migrations ,但它没有提供任何类型的文档,虽然它看起来像这样做,但我不确定如何使用它。

我应该指出我只在概念上熟悉 ActiveRecord 迁移。

最佳答案

如果您想一次完成整个迁移,那么 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

我在上面给出的具体方法中要记住的权衡:

如果您运行返回大量记录的请求,例如 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_namelast_name字段。

关于ruby-on-rails - 管理 mongoid 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8570705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com