Mongoid"act-as-tree"与"recursively_embeds_many"vs."mongoid-tree"

Jan*_*Jan 3 ruby tree ruby-on-rails mongoid

我对mongoid和rails很新.所以我有一些麻烦让树结构工作:

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

mongoid-tree(这是最实际的) https://github.com/benedikt/mongoid-tree

并且mongoid提供了recursively_embeds_more的解决方案

mongoid_acts_as_tree https://github.com/saks/mongoid_acts_as_tree

我的目标是为音乐风格制作一棵树,可以在不同的模型中引用/嵌入.

  • -屋
  • --- Tech House
  • ---最小的房子
  • -民间
  • ---非洲
  • ---亚洲
  • -金属
  • - -重金属
  • - -死亡金属
  • .....

我的模型现在看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

和观点

<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>
Run Code Online (Sandbox Code Playgroud)

我现在搜索了几个小时的工作示例,没有成功.

也许有人可以为我提供一些代码以便更好地理解

任何帮助都会让我的一天

很多,非常感谢提前

小智 5

不能使用mongoid-treerecursively_embeds_many在一起.您必须在使用references(mongoid-tree)或嵌入式树(recursively_embeds_many)的树之间进行选择.如果你想将树嵌入其他模型中,我建议使用后者.如果你想从其他模型中引用音乐风格(例如将它们用作类别并让它们有许多不同的艺术家)我会推荐这种mongoid-tree方法.在这两种情况下,您都不需要该parent字段.

所以使用的示例mongoid-tree可能如下所示:

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
Run Code Online (Sandbox Code Playgroud)

你使用just的例子recursively_embeds_many看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

最好成绩,

本尼迪克特