Mongoid“act-as-tree”与“recursively_embeds_many”vs.“mongoid-tree”

时间:2012-07-03 10:30:01

标签: ruby-on-rails ruby tree 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

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

  • -House
  • --- Tech House
  • --- Minimal House
  • -Folk
  • ---非洲
  • ---亚
  • - 金属
  • ---重金属
  • ---死亡金属
  • .....

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

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

和视图

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

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

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

任何帮助都会让我的一天

很多,非常感谢提前

2 个答案:

答案 0 :(得分:5)

您不能同时使用mongoid-treerecursively_embeds_many。您必须在使用引用(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

并且仅使用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)

贝斯茨,

本尼迪克特

答案 1 :(得分:1)

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

https://groups.google.com/forum/?fromgroups#!topic/mongoid/iF39R_hwc_o

MODEL

class Musicstyle
  include Mongoid::Document
 field :title, type: String
  recursively_embeds_many
end

CONTROLLER

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

查看

   <% if @all_musicstyles %>
        <div class="field">
            <%= f.label :parent_musicstyle %>
            <%= f.collection_select( :parent_musicstyle, @all_musicstyles, :_id, :title) %>
        </div>
   <% end %>

结果:

- House
-- Ibiza House
- Ibiza House
-- Child Progressive House
- Progressive House