1

以前我们的模型有 has_one 和 belongs_to 关系:

class Task
    include Mongoid::Document
    include Mongoid::Timestamps
    has_one :output
end

class Output
    include Mongoid::Document
    include Mongoid::Timestamps
    belongs_to :task
end

但我们现在计划将输出嵌入到任务中。

class Task
    include Mongoid::Document
    include Mongoid::Timestamps
    embeds_one :output
end

class Output
    include Mongoid::Document
    include Mongoid::Timestamps
    embedded_in :task
end

一切正常,但我们希望向后兼容。IE。我们还想要在嵌入之前创建的那些输出。

然后,我们在task.rb中做了这个方法:

def output
    Task.collection.find(_id: Moped::BSON::ObjectId(self.id)).first.output ||    Output.collection.find(task_id: Moped::BSON::ObjectId(self.id)).first
end

现在的问题是 task.output 将给出 json 而不是输出对象。所以我们不能做

task = Task.new
output = task.create_output
output.task #=> not possible

任何有这种情况或这种情况的任何指示的人。

4

1 回答 1

0

好吧,我们为什么不迁移旧的,而不是解决方法呢?

首先,通过将 has_one 替换为 embeds_one 并将belongs_to 替换为embedded_in 将两个模型更改为嵌入。保存代码。

然后使用您的 rails 控制台(>> rails 控制台)

然后

Output.each do |o|
   if !o.task_id.nil?
      #change to embedded format
      t=Task.find(o.task_id)
      t.output=o
      t.output.task_id=nil
      t.save
    end
end
于 2013-08-25T13:33:52.353 回答