我对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
我的目标是为音乐风格制作一棵树,可以在不同模型中引用/嵌入。
我的模型现在看起来像这样:
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>
我现在搜索了几个小时的工作示例,但没有成功。
也许某人可以为我提供一些代码以便更好地理解
任何帮助都会让我的一天
很多,非常感谢提前答案 0 :(得分:5)
您不能同时使用mongoid-tree
和recursively_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