递归嵌入& Mongoid - 父母不保存

时间:2012-08-03 19:44:04

标签: ruby-on-rails ruby mongodb mongoid

我对这个问题慢慢变得疯狂。我很确定它是微不足道的,我误解了一些东西,因为我刚刚开始使用Mongoid(以及Ruby on Rails)。

我的模型如下:

class Drawing
include Mongoid::Document

    field :image_uid
    image_accessor :image
    field :date_created, type: Time, default: Time.now

    recursively_embeds_many

    embedded_in :user
    embedded_in :painting_template, class_name: 'Painting', inverse_of: :template_drawing
    embedded_in :painting_result, class_name: 'Painting', inverse_of: :result_drawing

用户模型“embeds_many”图纸,绘画模型“embeds_one”template_drawing和result_drawing。

在过去的几个小时里,我一直在努力创建一个新的绘图,将其附加到用户并定义其父级(如果有的话)。我一直在控制台玩游戏,但基本上我所做的与此类似:

User.first.drawings.last.parent_drawing = User.first.drawings.first.dup

虽然控制台看起来很开心并且返回User.first.drawings.first的内容,但User.first.drawings.last.parent_drawing返回nil ...

我试图将它们分配给变量并分配变量等。但没有任何改变。我试图创建新的图纸,并将其中一个作为另一个的父母也没有成功。

我得出的结论是,分配父母是不可能的。所以我试着反过来添加一个孩子,但我仍然没有得到父母或孩子的对象。

这里有一些失败的代码(从我的Rails代码中提取和缩短):

drawing = Drawing.new({:user => @user})
drawing.parent_drawing = @user.drawings.find(parent_id).dup
drawing.save

有趣的是,图纸本身已保存并列在user.drawings中,但没有父图片。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

根据评论中的建议,我试图从头开始重新思考我的模型。我重读了关于多态关系的文档并使Drawing多态。仍然可以将绘图嵌入到另一个绘图中,并且可以再次以递归方式嵌入。

使用Mongoid关于循环关系的doc / code(http://rdoc.info/github/mongoid/mongoid/Mongoid/Relations/Cyclic/ClassMethods)我怀疑这是因为嵌入式“recursively_embeds_many”正在做错了因为他们没有包含Drawing是多态的事实!

鉴于embedded_in语句是由多态的事实构成的,因此添加

embeds_one :base_drawing, class_name: "Drawing", as: :drawable, cyclic: true

似乎有我想要的效果。它不会像“recursively_embeds_many”那样包含“孩子”,但在我的情况下并不是必需的。

我希望这有助于下一个人在递归嵌入多态关系方面遇到麻烦。