如何从belongs_to迁移到Mongoid中的embedded_in?

Dan*_*her 9 ruby-on-rails mongoid

如果首先使用belongs_to和has_many关联构建模型,然后意识到他们需要转移到embedded_in和embeds_many关联,那么如何在不使数千条记录失效的情况下执行此操作?需要以某种方式迁移它们.

Sur*_*wla 4

我不太确定我的解决方案是否正确。这是你可能会尝试完成的事情。

假设你有模型 - 像这样

#User Model
class User
  include Mongoid::Document
  has_many :books
end

#Book Model
class Book
  include Mongoid::Document
  field :title
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

第一步,我将创建另一个与上面的 Book 模型类似的模型,但它是嵌入的而不是引用的。

#EmbedBook Model
class EmbedBook
  include Mongoid::Document
  field :title
  embedded_in :user
end

#User Model (Update with EmbedBook Model)
class User
  include Mongoid::Document
  embeds_many :embed_books
  has_many :books
end
Run Code Online (Sandbox Code Playgroud)

然后为上面的示例创建一个类似这样的 Mongoid 迁移

class ReferenceToEmbed < Mongoid::Migration
  def up
    User.all.each do |user|
      user.books.each do |book|
        embed_book = user.embed_books.new
        embed_book.title = book.title
        embed_book.save 
        book.destroy
      end
    end
  end
  def down
    # I am not so sure How to reverse this migration so I am skipping it here
  end
end
Run Code Online (Sandbox Code Playgroud)

运行迁移后。从这里可以看到参考书是嵌入的,但是嵌入模型的名称是EmbedBook,模型书仍然存在

因此,下一步是将模型书制作为嵌入的。

class Book
  include Mongoid::Document
  embedded_in :user
  field :title
end

class User
  include Mongoid::Document
  embeds_many :books
  embeds_many :embed_books
end
Run Code Online (Sandbox Code Playgroud)

所以下一步是将 embedbook 类型迁移到 book 类型

class EmbedBookToBook < Mongoid::Migration
  def up
    User.all.each do |user|
      user.embed_books.each do |embed_book|
      book = user.books.new
      book.title = embed_book.title
      book.save 
      embed_book.destroy
    end
  end
  def down
    # I am skipping this portion. Since I am not so sure how to migrate back.
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,如果您看到 Book 从引用更改为嵌入。您可以删除 EmbedBook 模型来完成更改。

  • 这只是建议。在尝试生产之前,请先在开发中尝试这一点。因为,我认为我的建议可能有问题。