2013-08-13 2 views
1

Ранее мы имели HAS_ONE и belongs_to отношения с нашими моделями:Необычный случай Rails Mongoid

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

Ну, а не обходное решение, почему мы не переносим старые?

Сначала измените обе модели, чтобы внедрить их, заменив has_one на embeds_one и заменив belongs_to на embedded_in. Сохраните код.

Затем с помощью Рельсы консоли (>> Рельсы консоли)

Тогда

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 
+0

Ну я думал об этом, но у меня есть более миллиона записей Task и выход, так что я сомневался в этом. .. – roxxypoxxy

Смежные вопросы