以前我们的模型有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
任何人有这种情况或本案的任何指示。
答案 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