3

私はモンゴイドとレールにまったく慣れていません。そのため、ツリー構造を機能させるにはいくつかの問題があります。

構築する 3 つの「ソリューション」を見つけました

mongoid-tree (これが最も実際のものです) https://github.com/benedikt/mongoid-tree

そしてモンゴイドが提供するソリューション recurively_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>

私は何時間も実例を探しましたが、成功しませんでした。

理解を深めるために、誰かが私にいくつかのコード行を提供してくれるかもしれません

どんな助けでも私の一日を作ります

よろしくお願いします

4

2 に答える 2

5

一緒にmongoid-tree使うことはできません。参照を使用するツリー( )または埋め込みツリー( )のいずれかrecursively_embeds_manyを選択する必要があります。他のモデルにツリーを埋め込みたい場合は、後者をお勧めします。他のモデルの音楽スタイルを参照したい場合(たとえば、それらをカテゴリとして使用し、多くの異なるアーティストを含めるようにする場合)、このアプローチをお勧めします。どちらの場合も、フィールドは必要ありません。mongoid-treerecursively_embeds_manymongoid-treeparent

したがって、を使用した例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)

ベスト、

ベネディクト

于 2012-07-04T06:49:35.607 に答える
1

私はここに私の解決策を投稿しました:

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

モデル

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

コントローラ

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 
于 2012-07-04T14:35:34.330 に答える