Ruby on rails Mongoid“;“充当树的角色”;vs.“;递归地“u嵌入”u many“;vs.“;mongoid树“;

Ruby on rails Mongoid“;“充当树的角色”;vs.“;递归地“u嵌入”u many“;vs.“;mongoid树“;,ruby-on-rails,ruby,tree,mongoid,Ruby On Rails,Ruby,Tree,Mongoid,我对mongoid和rails很陌生。因此,我很难让树结构正常工作: 我找到了三个“解决方案”来构建 mongoid树(最真实的树) mongoid提供了解决方案 递归地嵌入更多 mongoid_充当_树 我的目标是为musicstyles创建一个树,它可以被引用/嵌入到不同的模型中 -房子 ---科技馆 ---最小房屋 -民间的 ---非洲人 ---亚洲人 -金属 ---重金属 ---死亡金属 我的模型现在看起来像这样: class Musicstyle include Mong

我对mongoid和rails很陌生。因此,我很难让树结构正常工作:

我找到了三个“解决方案”来构建

mongoid树(最真实的树)

mongoid提供了解决方案 递归地嵌入更多

mongoid_充当_树

我的目标是为musicstyles创建一个树,它可以被引用/嵌入到不同的模型中

  • -房子
  • ---科技馆
  • ---最小房屋
  • -民间的
  • ---非洲人
  • ---亚洲人
  • -金属
  • ---重金属
  • ---死亡金属
我的模型现在看起来像这样:

class Musicstyle
  include Mongoid::Document
  include Mongoid::Timestamps

  include Mongoid::Tree # mongoid-tree Version
  recursively_embeds_many # mongoids version itself

  field :musicstyle, type: String
  field :description, type: String
  field :parent
end
class Musicstyle
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Tree

  field :musicstyle, type: String
  field :description, type: String
end

# Usage example
musicstyle = Musicstyle.find(...)
musicstyle.children # This music style's children
musicstyle.parent   # This music style's parent
class Musicstyle
  include Mongoid::Document
  include Mongoid::Timestamps
  recursively_embeds_many

  field :musicstyle, type: String
  field :description, type: String
end

# Usage example
musicstyle = Musicstyle.find(...)
musicstyle.child_musicstyles # This music style's children
musicstyle.children.first.parent_musicstyle # The first child's parent (as you can't use find to get an embedded music style)
那景色呢

<div class="field">
    <%= f.label :parent %>
    <%= f.select :parent,
                 Musicstyle.all.map { |m| [m.musicstyle, m._id] },
                 {:include_blank => "Select a parent (if needed)"} %>
</div>

“选择父项(如果需要)”}%>
我现在搜索了几个小时寻找一个有效的例子,但没有成功

也许有人能给我一些代码,让我更好地理解

任何帮助都会使我高兴


很多很多提前感谢

您不能使用
mongoid树
递归地将许多
嵌入在一起。您必须在使用引用的树(
mongoid树
)或嵌入的树(
递归地嵌入多个
)之间进行选择。如果你想在其他模型中嵌入树,我推荐后者。如果您想参考其他模型的音乐风格(例如,将它们作为类别使用,并使它们具有许多不同的艺术家),我建议使用
mongoid树
方法。在这两种情况下,您都不需要
parent
字段

因此,您使用
mongoid树的示例可能如下所示:

class Musicstyle
  include Mongoid::Document
  include Mongoid::Timestamps

  include Mongoid::Tree # mongoid-tree Version
  recursively_embeds_many # mongoids version itself

  field :musicstyle, type: String
  field :description, type: String
  field :parent
end
class Musicstyle
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Tree

  field :musicstyle, type: String
  field :description, type: String
end

# Usage example
musicstyle = Musicstyle.find(...)
musicstyle.children # This music style's children
musicstyle.parent   # This music style's parent
class Musicstyle
  include Mongoid::Document
  include Mongoid::Timestamps
  recursively_embeds_many

  field :musicstyle, type: String
  field :description, type: String
end

# Usage example
musicstyle = Musicstyle.find(...)
musicstyle.child_musicstyles # This music style's children
musicstyle.children.first.parent_musicstyle # The first child's parent (as you can't use find to get an embedded music style)
您的示例仅使用递归方式嵌入了许多
,如下所示:

class Musicstyle
  include Mongoid::Document
  include Mongoid::Timestamps

  include Mongoid::Tree # mongoid-tree Version
  recursively_embeds_many # mongoids version itself

  field :musicstyle, type: String
  field :description, type: String
  field :parent
end
class Musicstyle
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Tree

  field :musicstyle, type: String
  field :description, type: String
end

# Usage example
musicstyle = Musicstyle.find(...)
musicstyle.children # This music style's children
musicstyle.parent   # This music style's parent
class Musicstyle
  include Mongoid::Document
  include Mongoid::Timestamps
  recursively_embeds_many

  field :musicstyle, type: String
  field :description, type: String
end

# Usage example
musicstyle = Musicstyle.find(...)
musicstyle.child_musicstyles # This music style's children
musicstyle.children.first.parent_musicstyle # The first child's parent (as you can't use find to get an embedded music style)
最好的


Benedikt

我在这里发布了我的解决方案:

模型

控制器

def new
    @musicstyle = Musicstyle.new
    @all_musicstyles = Musicstyle.all
end
def create
    if params[:musicstyle][:parent_musicstyle]
       parent = Musicstyle.find(params[:musicstyle].delete(:parent_musicstyle))
       parent.child_musicstyles.create(params[:musicstyle])
    end
    @musicstyle = Musicstyle.new(params[:musicstyle])
end
看法