不寻常的Rails Mongoid案例

时间:2013-08-13 12:27:58

标签: ruby-on-rails mongoid

以前我们的模型有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

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

然后,我们在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

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

1 个答案:

答案 0 :(得分:0)

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

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

然后使用rails控制台(>> rails console)

然后

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